Shopify product video: five recommended ratios at 30 to 60 fps

Shopify recommends 16:9, 9:16, 4:3, 3:4 or 1:1 video at 30 to 60 fps. Seedance 2 on Sume lists the same five ratios, so one prompt can fill a full ratio set.

4 min readSume
All posts

Shopify recommends five video ratios for product media: 16:9, 9:16, 4:3, 3:4 and 1:1, at 30 to 60 frames per second. Sume's documented seedance-2 entry lists the same five (plus 21:9), so you can render one prompt in each ratio and let each template pick the one it needs. The Shopify figures come from the file uploads help page, read 2026-10-03.

What Shopify accepts

Shopify separates what it will accept from what it recommends. The accepted range is wide. The recommended set is narrow, and that is the one worth designing around.

Shopify video limits and recommendations (read 2026-10-03)
ItemValue
Maximum file size1 GB
Length0.25 s to 10 minutes
FormatsMOV, MP4, WEBM
Resolutionup to UHD; 100 to 4096 px per side
Frame rateup to 120 fps accepted
Recommended ratios16:9, 9:16, 4:3, 3:4, 1:1
Recommended frame rate30 to 60 fps

Why a ratio set beats one master

A theme can show the same product video in a product page gallery, a collection card, a mobile full-screen view and a homepage banner. Those slots rarely share a shape. A single 16:9 master gets cropped in the square card and letterboxed in the vertical view. Rendering the five recommended shapes avoids both problems and lets you assign each to the slot that suits it.

Keep the set small in practice. Most stores need 1:1 for cards, 9:16 for mobile and 16:9 for banners. The 4:3 and 3:4 renders are worth making only when your theme uses them.

Render the set on Sume

Sume's video generation API takes aspect_ratio and resolution per request, and each model reports what it accepts in supported_aspect_ratios. The docs example for seedance-2 lists 21:9, 16:9, 4:3, 1:1, 3:4 and 9:16, which covers Shopify's five.

The script below submits one job per ratio. It reads the key from the environment and prints the job ids so you can poll each job or receive a callback.

import os
import requests

KEY = os.environ["SUME_API_KEY"]
RATIOS = ["16:9", "9:16", "4:3", "3:4", "1:1"]
PROMPT = "A ceramic mug turning slowly on a pale wooden table, soft window light"


def main():
    for ratio in RATIOS:
        r = requests.post(
            "https://api.sume.com/v1/videos",
            headers={"Authorization": f"Bearer {KEY}"},
            json={"model": "seedance-2", "prompt": PROMPT,
                  "aspect_ratio": ratio, "resolution": "720p", "duration": 5},
        )
        r.raise_for_status()
        print(ratio, r.json()["id"])


main()

Frame rate: check it, do not assume it

The /v1/videos request has no frame rate field in the Sume docs, so the rate of a generated clip is whatever the model produced. Read it from the file with ffprobe before upload and compare it with Shopify's 30 to 60 fps recommendation. Shopify accepts up to 120 fps, so a clip outside the recommended band still uploads; it is only outside the guidance.

If you assemble clips on the timeline, output.fps accepts 24, 25, 30 or 60. Choose 30 or 60 for Shopify. Omitting it makes the render follow the source rate, which may not land in the recommended band.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume