Product Banners from Catalog JSON

A product banner generator at catalog scale is a data pipeline. jsontoimg does not ingest Shopify by itself. It takes a template with name, price, badge, and photo layers and returns one file per row, 50 rows per batch.

Batch math

1,200 SKUs overnight is 24 requests of 50, not a single 1,200-job POST. Queue them, record batch ids, retry where status != done. Webhooks beat a 3-hour HTTP wait.

Sale badge without a second template

Keep one layout. Empty badge text hides or you use a layer override to skip it. A second template is for a truly different composition (lifestyle vs price-forward), not for “SALE” vs not.

Catalog script walkthrough.

Decide what triggers a re-render

The expensive mistake is a nightly sweep of the whole catalog. Render on the event that changed the data instead. Shopify’s webhook topics are the canonical list of what is worth reacting to — a product update, a variant price change, an inventory level crossing zero. Everything else is noise.

Make it idempotent so retries are free. Hash the fields the template actually renders — sku, name, price, badge, photo URL — and store the hash next to the asset URL. If the hash matches, skip the job. A description edit that never appears on the banner should not cost a credit.

Marketplace rules you cannot template around

If the banners feed a shopping surface rather than only your own storefront, the specs belong to the marketplace. Google Merchant Center’s image requirements set minimum dimensions and forbid promotional overlays and watermarks on the main product image. A “SALE” badge that is fine on your category page will get the feed item disapproved.

So keep two templates: one price-forward layout for your own pages, one clean layout for the feed. Same layer names, same data, different composition. That is cheaper than discovering the rule at review time and re-rendering 1,200 files.

Related

FAQ

How do I generate banners for thousands of SKUs?

One template per layout (category, sale, marketplace). Stream the catalog in batches of 50 jobs to POST /api/v1/renders/batch. Loop until the feed is done. 1,200 SKUs is 24 batches, not one call.

What happens when the price changes?

Re-render only the SKUs whose payload changed. Keep a hash of (sku, price, badge). Idempotent item ids make retries cheap. Failed jobs do not consume credits.

Shopify native?

Not yet. Export the catalog or POST from a middleware that already talks to Shopify. HTTP is the connector.

Get 25 free images →