Shopify image limits: 20 MB, 25 megapixels vs Sume image outputs
Shopify accepts product images up to 20 MB and 25 megapixels in JPEG, PNG, WEBP, HEIC or GIF. How that lines up with Sume image model sizes and formats.
Shopify accepts images up to 20 MB and 25 megapixels, with an aspect ratio between 100:1 and 1:100, in JPEG, PNG, WEBP, HEIC or GIF. Sume image outputs sit well inside those size limits, and the one format to watch is SVG, which Sume lists but Shopify's image list does not.
Shopify's limits
The Shopify Help Center page on file uploads lists these limits. Read on 2026-10-03.
| Item | Limit |
|---|---|
| File size | 20 MB |
| Pixels | 25 megapixels |
| Aspect ratio | Between 100:1 and 1:100 |
| Formats | JPEG, PNG, WEBP, HEIC, GIF |
What Sume documents on its side
The Image API docs give limits that are model-specific. For ChatGPT Image 2.5, image_size custom pixels need both edges to be multiples of 16, a maximum edge of 3840, an aspect ratio of at most 3:1, and 655,360 to 8,294,400 total pixels. The normalized aspect_ratio list runs from 1:8 to 8:1, and output_format can be png, jpeg, webp or svg.
| Check | Shopify | Sume docs | Result |
|---|---|---|---|
| Megapixels | 25 MP max | 8,294,400 px max on ChatGPT Image 2.5 (about 8.3 MP) | Inside the limit |
| Aspect ratio | 100:1 to 1:100 | 1:8 to 8:1 on the normalized list | Inside the limit |
| Formats | JPEG, PNG, WEBP, HEIC, GIF | png, jpeg, webp, svg | Avoid svg |
| File size | 20 MB | Not stated in the docs read | Check each file |
Where the real risk is
Pixels and ratios are not the problem for generated product images. File size and format are. A PNG of a detailed photographic scene at a high resolution tier can be large, so check the bytes of every file, and request jpeg when you want a smaller photographic file.
SVG is the one to watch. Sume's docs list it as an output_format, but Shopify's image format list does not include it. If a model offers it, keep it out of product galleries.
A pre-upload check
This script checks size and extension for a folder of downloaded images. It does not read pixel dimensions, so add an image library if you want that check too.
import pathlib
MAX_BYTES = 20 * 1024 * 1024
ALLOWED = {".jpg", ".jpeg", ".png", ".webp", ".heic", ".gif"}
def check(folder):
for path in sorted(pathlib.Path(folder).iterdir()):
if not path.is_file():
continue
if path.suffix.lower() not in ALLOWED:
print("format not accepted:", path.name)
elif path.stat().st_size > MAX_BYTES:
print("over 20 MB:", path.name, path.stat().st_size)
else:
print("ok:", path.name)
check("./downloads")One more rule
Check file names too. Shopify rejects names ending in certain size words, which is easy to trip when outputs are named after a scale or variant.
Sources
Related posts
More in Developers
- Sign MCP requestState for paid render approvals: user, TTL, digest
MCP says requestState is attacker-controlled. For a paid render approval, bind it to the user, an expiry and an argument digest with an HMAC. Python included.
- Snap a requested video length to supported durations in Python
Veo 3.1 accepts only 4, 6 or 8 seconds. A short Python helper snaps any requested length to a model's supported_durations list from GET /v1/videos/models.
- Sora ended in two steps: app in April, API on September 24
OpenAI's docs say the Sora API shut down Sep 24, 2026 with no direct replacement. A help-center snippet dates the app and web end at Apr 26. What to inventory.
- Sora replacement smoke test: one prompt, three Sume models, in Python
A short Python script that sends the same 5-second prompt to seedance-2.5, wan-3.0 and gemini-omni-flash-1.1 on Sume and prints status, cost and URLs.
Written by Sume