Add a thank-you video to Shopify's order status page with a Sume MP4
Render one thank-you MP4 on Sume, host it yourself, and surface it on Shopify's Thank you and Order status pages with a checkout UI extension.

The page after payment is the one every buyer sees. A short thank-you clip there costs you one render, not one per order. The work is in two places: making an MP4 you can host, and getting Shopify to show it.
What Shopify lets you add
Shopify's Thank you and Order status guide says a UI extension can add custom content such as surveys, reviews, upsell offers, social sharing and download links. The two targets are purchase.thank-you and customer-account.order-status. On the Thank you page the order is not created yet but its id is available; on the Order status page the order is always available. Extensions can use fetch for network calls.
The component reference lists components such as s-image, s-heading, s-text and s-button. I did not find a video component on the pages I read, so the safe pattern is a poster s-image and an s-button that links to the MP4 or to a page that plays it. Recheck the reference before you build; it changes.
Render the clip once
Make a 6 to 8 second brand moment: your packshot as the first frame, a slow push-in, a closing beat. On Sume that is minimax-h3-max at 768p, $0.10 per second, so 8 seconds is $0.80. The generation is asynchronous: submit, poll the polling_url, then download the content. Send an Idempotency-Key so a retry returns the same job.
import os
import time
import requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
job = requests.post(
"https://api.sume.com/v1/videos",
headers={**H, "Idempotency-Key": "thank-you-clip-001"},
json={
"model": "minimax-h3-max",
"prompt": "Slow push-in on the product, soft light, no text",
"duration": 8,
"resolution": "768p",
"frame_images": [{
"type": "image_url",
"image_url": {"url": "https://example.com/packshot.jpg"},
"frame_type": "first_frame",
}],
},
timeout=60,
).json()
for _ in range(60):
s = requests.get(job["polling_url"], headers=H, timeout=60).json()
if s["status"] in ("completed", "failed", "cancelled"):
break
time.sleep(30)
print(s["status"], s.get("unsigned_urls"))Host it where the storefront can reach it
Do not point a storefront at a job URL. Download the finished file, put the MP4 on storage or a CDN you control, and give Shopify that public HTTPS address. Keep the Sume job id with the file for your records.
The extension side, in outline
- Register the
purchase.thank-you.block.rendertarget for the Thank you page and the order-status target for the later page. - Render a heading, the poster image and a button whose link is your hosted MP4.
- Merchants place block targets in the checkout editor, so the position is theirs to move.
- No API in an extension can change an order, so keep the video generic, not order-specific.
Cost and cadence
One 8-second clip is $0.80 on Sume, and it serves every order until you change the campaign. Rerender for each season, and store each version under a dated name so the extension can point at it by configuration rather than a code edit.
Sources
Related posts
More in Integrations
- Adobe Commerce product image sizes: base, small, thumbnail
Adobe Commerce roles use different sizes. Generate one large base image with Sume and let the store scale down. The roles and what Sume can't do.
- Adobe Commerce product video: link YouTube or Vimeo, no upload
Adobe Commerce takes a YouTube or Vimeo link for product video, not an MP4 upload. Make the clip with Sume, host it, paste the URL. Roles and a curl.
- Amazon Ads MCP Server (Lite) next to Sume's MCP server in one agent
Amazon announced an Ads MCP Server (Lite) at unBoxed 2026. What is unknown, and how an agent could pair it with Sume's hosted MCP to make the creative.
- API by Zapier Stop on Error: a Sume 202 is accepted, not finished
API by Zapier added Stop on Error in September. Sume answers a submit with 202 and a job id, so a green step means the job exists, not that it finished.
Written by Sume