Every store eventually reaches the same awkward point: there are enough products that a nice product video for each one would help, but not enough time for someone to open a video editor for every SKU. I do not try to solve that by making a giant batch of final MP4s and hoping they are all fine. I put a reviewable video object in the middle of the workflow first.

That is where VideoFlow fits. It gives me a way to turn product data into a structured video, preview it, make a targeted edit when the template gets something wrong, and only then render. The important bit is not that code can make a video. It is that the draft is inspectable before the expensive or public step.

Product data becomes a structured video source and preview

Start With a Narrow Product Payload

I keep the first payload boring on purpose. Product title, price, image URL, a short feature list, a collection name, and a destination URL are enough to make a useful 10- to 15-second product clip. The more free-form copy I add at this stage, the more places I create for a bad claim or a layout problem.

For each eligible Shopify product, my job prepares an object like this:

{
  "title": "Insulated Travel Mug",
  "price": "$28",
  "features": ["Leak-resistant lid", "12-hour cold retention"],
  "image": "<product image URL>",
  "productUrl": "<product page URL>"
}

That payload is deliberately separate from the timeline. It means the same motion template can run across a catalog update without a spreadsheet of manual edits. If you are building the template layer itself, it is also worth keeping it in source control; I wrote earlier about keeping VideoFlow templates diffable in Git.

Compile a Draft, Not a Final Video

With @videoflow/core, I build the repeated scene structure in TypeScript: image layer, product title, feature cards, price, and call to action. The core compiles that into portable VideoJSON. For this workflow, VideoJSON is the handoff format—not a hidden implementation detail.

Why do I care? A reviewer can identify a wrong image, a crowded title, or a badly timed CTA from the draft. The team can store that exact source beside the product data. And if a product changes tomorrow, the queue can rebuild only that product instead of redoing a finished edit from scratch.

const videoJSON = await buildProductTemplate(product).compile();
await saveDraft({ productId: product.id, videoJSON, status: "needs-review" });

This makes an automation safer to operate. It also gives an AI-assisted workflow a structured target: the model can suggest copy or a scene payload, while your app validates the fields and your reviewer sees the result. The same idea is behind my product-driven VideoFlow variations workflow, but I now treat approval as an explicit queue state rather than a loose Slack request.

Ecommerce product video variation approval queue

Put a Live Preview in the Review Queue

The queue only works if people can review a draft quickly. VideoFlow’s DOM renderer is a practical fit for this: mount the same VideoJSON in an internal dashboard, let a merchandiser scrub through it, and keep approval close to the product record. For edge cases, I would add a small set of allowed actions: replace media, edit copy, change a CTA, or reject with a reason.

Do not start by exposing every animation control. A constrained workflow is easier to support and keeps the catalog on-brand. If your team genuinely needs timeline editing, the React video editor can take the same structured source and provide a multi-track editing surface. That is a much better escalation path than sending a reviewer a raw project file.

My queue states are simple: queued, needs-review, approved, rendering, rendered, and failed. A failed product gets enough context to repair it—usually a missing image, bad crop, or unsupported asset—not just a red badge.

Pick the Renderer After Approval

The portable JSON is also what prevents the preview implementation from dictating your production costs. For a small self-serve export, the browser renderer can create an MP4 in the user’s browser. For a nightly catalog refresh or a campaign batch, I send approved jobs to a server-side renderer behind a queue. The scene source stays the same.

One video source rendering through browser and server paths

I use browser rendering when the user initiated the export and privacy or infrastructure simplicity matters. I use server rendering when jobs need retries, central monitoring, or predictable batch throughput. The decision should be operational, not a rewrite of the creative template. For a closer breakdown, see how I choose between browser and server rendering.

Add Guardrails Before You Scale It

Before I let the queue run across a collection, I check four things:

  1. Asset rules: only use product images with usable crops and sufficient resolution.
  2. Copy rules: cap title and feature lengths, with a fallback layout for long names.
  3. Approval rules: render only approved drafts; do not let a retry bypass review.
  4. Delivery rules: store the MP4 URL and template version back on the product or campaign record.

Those boring controls are what make the automation maintainable. They also make revision requests concrete: change the source data, patch the template, or adjust one VideoJSON draft. When feedback is specific, I use the same structured approach described in turning video feedback into safe VideoJSON revisions.

Build the Smallest Useful Queue First

My first version would not attempt every product and every social channel. Pick one collection, one 12-second template, and one approval screen. Wire the product payload into a VideoFlow draft, preview it in a dashboard, and render only the approved jobs. Once the review behavior is dependable, add localization, new aspect ratios, or campaign-specific variants.

If you want that middle layer to stay portable, start with VideoFlow: define the video in code, keep the resulting VideoJSON as the reviewable record, and choose the renderer that matches the job. That turns catalog video from an editing backlog into a workflow you can actually operate.