How to automatically turn Shopify product photos into videos
Automate Shopify product photos into videos with an App Store app, a URL-to-video tool, or an image-to-video API pipeline. Options, prices, and limits.

You can automatically turn Shopify product photos into product videos in three ways: install an AI video app from the Shopify App Store, send product links to a URL-to-video ad tool, or build a small pipeline where a Shopify trigger sends each product photo to an image-to-video API and your app attaches the finished MP4 back to the product. Which one fits depends on where the video goes (the product page gallery or social ads), how many products you have, and how much control you want over the model, the prompt, and review.
Shopify facts below come from Shopify's Help Center and shopify.dev, and other vendors' facts from their own pages, all read on 2026-09-29. Sume facts come from the Video generation and Webhooks docs. Sume is one of the API options: it has no Shopify app, so with Sume you write the pipeline yourself.
Which way should I automate it?
The options differ in how you pay, which models run, and how much code you write:
| Option | Price unit | Models | API shape | Limits |
|---|---|---|---|---|
| Shopify App Store app | Set by each app's listing | Set by each app's listing | An app installed in your store; the Video and livestream category lists 294 apps | Shopify's product media limits (below) |
| Creatify API | URL to Video: 5 credits per 30 seconds; Product Video (video): 10 credits per 30 seconds; API Starter $99 USD/month for 500 credits (billing) | Product to Video from one product image URL; URL to Video from a link | Create a link, generate a preview, render (API index) | API access needs a subscription plan |
| Runway API | gen4.5: 12 credits per second; credits are $0.01 each (pricing) | gen4.5, gen4_turbo, and veo3.1 among others on the pricing page (Veo is not in Sume's catalog) | POST /v1/image_to_video with a promptImage URL or data URI; returns a task ID to poll (guide) | ratio and duration set per request |
| Kling API | Kling 3.0, no native audio: 0.6 Units ($0.084) /s at 720P (pricing) | Kling 3.0 Turbo, 3.0, 3.0 Omni, O1, 2.6, 2.5 Turbo all take image input | Image to Video, single shot on every listed model (capability map) | Kling 3.0: 3~15s at 720P, 1080P, or 4K |
| Sume API | Provider list × 1.25, reserved on submit, plus a 5.5% agent fee by default; a 5-second 720p 9:16 seedance-2 clip reserves $1.89 | 11 video model ids: seedance-2.5, seedance-2-mini, seedance-2, seedance-2-fast, kling-3, wan-3.0, grok-imagine-video-1.5, minimax-h3, minimax-h3-max, gemini-omni-flash-1.1, h3-max-recast | POST /v1/videos with frame_images, a callback_url webhook, and Idempotency-Key (docs) | seedance-2 takes 4–15 seconds and seedance-2.5 4–30 |
Which option fits my store?
Pick by where the video goes and how much of the pipeline you want to own:
- Pick a Shopify App Store app if you want to stay in the Shopify admin and not write code. Check on each listing what it makes from your photos and whether it publishes to product media.
- Pick Creatify if you want social ads built from a product page link or one product image, priced in credits per 30 seconds of video on a monthly API plan.
- Pick Runway's or Kling's API if you only need that vendor's own models. Runway's pricing page also lists
veo3.1; Google's Veo is not in Sume's catalog. - Pick Sume if you want one key and one balance across the 11 video model ids above, signed completion webhooks, and idempotent retries, and you can run a small server. For a finished, edited ad instead of one clip, send all the photos as
attachmentsto a catalog Format run; Ready-made Formats for product video lists them. - Sume does not fit if you need a no-code app inside Shopify, one-click publishing to product media, or a tool that reads a product page URL:
POST /v1/videostakes image URLs.
How does a custom pipeline work, step by step?
Your server does five things per product, calling Shopify's Admin API and Sume's API over HTTPS. Image to video API for product photos covers the Sume call on its own.
- 1. Read the product's photos with the
productquery and itsmediaconnection. - 2. Send one photo URL to
POST /v1/videosinframe_imagesas thefirst_frame, with acallback_url. - 3. Wait for Sume's signed
job.completedwebhook, or poll the job. - 4. Upload the MP4 to Shopify with
stagedUploadsCreateandfileCreate, wait forREADY, then attach the file to the product. - 5. Run steps 1–4 from a queue whenever Shopify sends
products/create, or when a Shopify Flow workflow calls your server.
| Step | Call | What to know |
|---|---|---|
| 1. Read photos | Shopify product(id:), media → MediaImage → image { url } | Shopify's media guide assumes the read_products scope |
| 2. Make the video | Sume POST /v1/videos with frame_images | Returns a job ID and polling URL immediately |
| 3. Wait | callback_url receives job.completed | The file URL is in payload.artifacts[].url |
| 4. Attach | stagedUploadsCreate, then fileCreate | Poll fileStatus until READY, then attach by file ID |
| 5. Trigger | Shopify products/create webhook or Flow | Answer webhooks within five seconds; do the work from a queue |
How do I read a product's photos with the Admin API?
Query the product by ID and read its media connection, whose valid media are images, 3D models, and videos. Each image node is a MediaImage whose image.url is the photo. Shopify's media guide assumes the read_products, write_products, and write_files access scopes, which also cover step 4.
A product may have no photos yet: Shopify's sample products/create payload has an empty images array, so skip or retry a product with no image nodes.
query ProductPhotos($id: ID!) {
product(id: $id) {
title
media(first: 10) {
nodes {
... on MediaImage {
image { url }
}
}
}
}
}How do I send a photo to Sume and wait for the video?
Put the photo URL in frame_images with frame_type: "first_frame"; that makes the request image-to-video, so the clip starts on your real product photo. Pick a model id from GET /v1/videos/models, which lists each model's resolutions, aspect ratios, durations, and supported_frame_images. Use 9:16 for vertical social clips or 1:1 for a square gallery clip where the model lists it. Send Idempotency-Key so a retry returns the original job instead of a second one, and derive it from the product ID.
With callback_url set, Sume POSTs once when the job reaches a terminal state. job.completed carries the file in payload.artifacts[].url on media.sume.com; job.failed and job.canceled arrive with status: "ERROR". Verify the x-sume-webhook-signature header and accept any sume-v1= entry that matches. Without a webhook, poll GET /v1/videos/{jobId} until completed, then download from GET /v1/videos/{jobId}/content with your API key.
curl -sS -X POST https://api.sume.com/v1/videos \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: shopify-product-123-v1" \
-d '{
"model": "seedance-2",
"prompt": "Slow turntable shot of the product on a plain studio background",
"frame_images": [
{
"type": "image_url",
"image_url": { "url": "https://example.com/product.jpg" },
"frame_type": "first_frame"
}
],
"aspect_ratio": "9:16",
"resolution": "720p",
"duration": 5,
"callback_url": "https://app.example.com/hooks/sume"
}'How do I attach the video back to the product?
Download the MP4 first: Shopify's `FileCreateInput` takes an external URL only for images, generic files, or external videos, and videos require a staged upload URL. Shopify's upload steps are stagedUploadsCreate with the required fileSize, a multipart POST of the MP4, fileCreate with the resourceUrl as originalSource, a fileStatus poll until READY (or FAILED), and then productSet, productCreate, or productUpdate referencing the file by its ID in originalSource. The full mutation is in Shopify product video with products/create webhooks.
How do I run it on every new product?
With webhooks, subscribe to products/create, enqueue the product ID, and answer inside Shopify's five-second window; run steps 1–4 from the queue.
Without your own webhook receiver, Shopify Flow, a free app that runs workflows of triggers, conditions, and actions, can start the pipeline. Its Send HTTP request action is only available on the Shopify Plus, Advanced, or Grow plans. Flow waits up to 30 seconds for a response and can retry for up to 24 hours on errors, so derive the Sume Idempotency-Key from the product ID to keep a retry from making a second video. Keep API keys in Flow's Secrets, whose values are redacted from run logs; Sume's authentication docs keep keys server-side.
Should the videos publish without review?
Image-to-video models add motion the photo does not show, so a generated frame can differ from the real product in color, text, or shape. One safeguard is to generate automatically but publish after a person approves:
- Gate generation on a product tag or status, so products without final photos are skipped.
- Save each result as a draft and send a reviewer the link before step 4 attaches it.
- Check colors, logos, label text, and variants against the photos; regenerate or drop clips that differ.
- Keep the real photos in the gallery; the video adds to them.
What limits does Shopify set for product video?
To display videos on product pages, the store needs a theme that supports video, such as the Online Store 2.0 themes built by Shopify; otherwise, modify the theme. A product holds at most 250 images, 3D models, or videos, and that limit can't be raised. Shopify's two official pages give different 4K sizes:
| Limit | Help Center | Developer docs |
|---|---|---|
| Video file | .mp4, .mov, or .webm; up to 10 minutes, 1 GB, and 4K (4096 x 2160 px) | MP4, MOV, or WEBM; max 1 GB, 10 minutes, and 3840x2160 |
| Playback | 480p, 720p, or 1080p in streaming browsers, by connection and upload resolution | Shopify generates 480p, 720p, and 1080p in HLS and MP4 |
| Videos and 3D models per store | 250 on Basic, 1,000 on Grow, 5,000 on Advanced, 50,000 on Plus | Apps can create up to 1,000 videos for each store in a week |
| Per product | Up to 250 media; videos can't be variant media | Variants reference media already on the product |
What can't this automation do?
A few limits come from Shopify and a few from Sume:
- A product with no photos has nothing to animate yet.
- Sume's media tools, such as
POST /v1/video-inspect(unbilled probe) and Timeline 1.0, read onlymedia.sume.comfiles, so check or edit a generated clip before you move it to Shopify. - A Timeline 1.0 render runs up to 1800 seconds, past Shopify's 10 minutes, and caps each edge at 2160 pixels, below both 4K sizes.
- 3D models: Shopify's 3D slot takes GLB or USDZ files, and Sume's generation families are Avatar, Image, Video, and Music.
- Product photos themselves: sizes for the stills are in Shopify product image size.
Sources
- Shopify Help Center: Product media types (read 2026-09-29)
- Shopify Help Center: Adding product media (read 2026-09-29)
- Shopify Help Center: Product media (read 2026-09-29)
- Shopify: Manage media for products and collections (read 2026-09-29)
- Shopify GraphQL Admin API: product query (read 2026-09-29)
- Shopify GraphQL Admin API: FileCreateInput (read 2026-09-29)
- Shopify: Verify webhook deliveries (read 2026-09-29)
- Shopify: Webhooks reference (read 2026-09-29)
- Shopify Help Center: Shopify Flow (read 2026-09-29)
- Shopify Flow: Send HTTP request (read 2026-09-29)
- Shopify App Store: Video and livestream apps (read 2026-09-29)
- Creatify API: Billing (read 2026-09-29)
- Creatify API docs index (read 2026-09-29)
- Runway API: Using the API (read 2026-09-29)
- Runway API: Pricing (read 2026-09-29)
- Kling API: video capability map (read 2026-09-29)
- Kling API: video pricing (read 2026-09-29)
- Video generation
- Webhooks
- Video inspect
- Timeline 1.0
- Call a Format
- Authentication
- Models overview
Related posts
More in Media tools
- Snapchat ad specs: 9:16 video at 720×1280, 3 to 180 seconds
Snapchat video ads are 9:16 at 720×1280, .mp4 or .mov, 3 to 180 seconds; Commercials keep the first 6 seconds unskippable. How to make one with Sume.
- Spotify video ad specs: 9:16 or 16:9, up to 30 seconds
Spotify video ads run up to 30 s, 9:16 or 16:9 at about 720x1280 or 1280x720, as MOV or MP4 up to 500 MB, with sound at -14 dBFS RMS.
- Threads ads specs: video ratios, the 4:5 crop, and captions
Threads ads take image, video, and carousel creatives. Video from 1.91:1 to 9:16 is supported, but anything taller than 4:5 is cropped to 4:5.
- TikTok video specs for API uploads and ads, mapped to Sume
TikTok's posting API takes MP4, WebM, or MOV at 23–60 fps, 360–4,096 px, and up to 10 minutes. How a Sume clip maps to that, and how to upload it.
Written by Sume