Automation · Content and publishing
Publish a Shopify product listing in Webflow with human approval
Move a Shopify product into Webflow CMS: validate fields, prevent duplicates, create a draft, and wait for approval before publishing it.
How do I publish a Shopify product in Webflow without duplicating it or copying data I cannot keep current?
Your Met opens one exact Shopify product and continues only when it is active and has a public online store URL. It then discovers the Webflow site and CMS collection, reads the real fields, and proposes a narrow mapping: technical identifier, name, slug, link, image, and only when field types and the decimal conversion match, price or price range with currency. It searches the exact slug before writing. When the slug is free, it always creates a draft and reads it back to prove that Webflow stored every field and loaded the image. It stops there. Publishing requires an explicit yes in a new message, another unchanged read, and the technical confirm flag set to true. The result is a CMS listing that links to Shopify, not a Webflow Ecommerce product, Buy Button, or inventory sync.
What starts it
When someone asks for it
The team starts the task in chat with the Shopify product, destination site, and collection. The first run ends after showing the draft. Publishing resumes only after a person reviews that exact result and sends an explicit yes in a new message.
A manual task: someone on the team runs it with a button, or asks the Met for it in chat.
Who runs it
Met for Shopify catalog and Webflow publishing
Social team
It has no seeded proper name. Its job is to translate one verified listing between two schemas, leave evidence of what Webflow accepted, and separate the draft from the decision to take it live. Shopify remains the commercial source of truth. Webflow receives a content representation.
6 steps · 11 tools
The procedure, step by step
Each step shows the tool that runs. They belong to the real connector: if one of them stopped existing, this page would not build.
- 1
Resolve one product and prove it has a public destination
Your Met searches with Shopify syntax. When it gets zero results, several matches, or an incomplete page that could still hide another match, it asks for the exact id. It then opens that id and keeps only values returned by the tool: technical id, title, handle, status, onlineStoreUrl, featuredImage with alt, and the normalized priceRange.min, priceRange.max, priceRange.minCurrency, and priceRange.maxCurrency shape. It continues only when status is ACTIVE and onlineStoreUrl is not null. priceRange.min and priceRange.max preserve the MoneyV2/Decimal amounts as strings; it keeps both strings and both currencies exact so they can be validated together before mapping. priceRange.currency remains only for compatibility and does not replace validation of minCurrency and maxCurrency. It does not copy descriptionHtml, variants, or stock because the Webflow listing is not a real-time commercial source.
- 2
Discover the site, collection, and a mapping that actually exists
When site_id is missing, your Met lists sites and asks a person to choose when several remain. It reads the chosen site, works only in its primary locale, and locates the CMS collection by displayName. It opens the schema and never invents field slugs. The collection needs name and slug, one PlainText field for the Shopify id, a Link for onlineStoreUrl, and an ImageRef when the image is mapped. name receives title and slug receives handle. Price is all or nothing: priceRange.min, priceRange.max, priceRange.minCurrency, and priceRange.maxCurrency must be present; both amounts must be strings, both currencies must be three-letter ISO strings, currencies must match each other and the approved currency, and minimum cannot exceed maximum. For each amount string it uses a local amount variable, runs Number(amount), and accepts the result only when typeof is number, Number.isFinite is true, its decimal coefficient is a safe integer, and exact conversion preserves the same decimal text. The protocol allows at most 12 integer digits, 6 decimal places, and values below 1,000,000,000,000. It rejects commas, exponents, negatives, NaN, Infinity, and precision loss. One price requires min=max and a Number field. A range requires separate Number fields for minimum and maximum. Currency uses a separate PlainText field. fieldData receives JSON numbers, never the priceRange.min or priceRange.max strings. If one check fails or field types do not match, every price field including currency is omitted or the task stops before creation. A range is never flattened.
- 3
Search the handle as an exact slug and compare the technical identifier
The Shopify handle becomes the proposed slug and is queried with Webflow's exact staged-item filter. Zero matches permits draft preparation. With one, your Met reads the item and compares the Shopify id stored in the PlainText field. The same product is shown and stops the run. A different id is a collision and also stops it. More than one match needs human review. It never overwrites, adds a suffix, or infers identity from a matching title. The read does not lock the collection, so two concurrent runs could still race to create.
- 4
Create a complete draft and verify the image Webflow accepted
With a free slug, webflow_create_item receives isArchived false, skip_invalid_files false, and fieldData approved against the schema. The connector forces isDraft true. For ImageRef it sends the public featuredImage URL and its exact alt. When Shopify has no alt, a person supplies and approves one. Webflow accepts remote images up to 4 MB, but a Shopify URL alone does not prove that loading completed. Your Met reads the returned id and verifies name, slug, Shopify id, link, price and currency values as JSON numbers, plus a nonempty fileId or url and the approved alt in the image field. Any missing or different value stops publication. descriptionHtml never enters rich text.
- 5
Show the evidence and wait for a new approval
The summary shows site, collection, primary locale, item_id, Shopify id, name, slug, onlineStoreUrl, only the validated price or range with currency, ImageRef and alt, plus every omitted field. It ends the turn without publishing. The initial request does not authorize live state. When a person requests changes, it updates only those fields, reads the item again, and shows a new summary. Any earlier approval expires. A timeout or uncertain result is reconciled by searching the slug and reading the item before any other write. It never retries a create blindly.
- 6
Read again, publish only the approved item, and reconcile staged against live
After an explicit yes in a new message, your Met rereads the same item. One changed approved value stops the flow and requires another review. Otherwise it calls webflow_update_item with isDraft false, then webflow_publish_items for that id only with the exact confirm flag set to true. It checks status, published_count, publishedItemIds, and errors. Success requires Webflow to confirm that id. Partial, failed, or unknown triggers staged and live reads before deciding whether another action is missing. The live read proves API state, not HTML, template, cache, or CDN. These writes are not one transaction and are never replayed blindly.
Before you start
What you need ready
The Met solves none of these for you. If one is missing, the automation stops there.
-
An active Shopify product published to the Online Store channel
The store must return status ACTIVE and onlineStoreUrl for the selected id. A draft, archived product, or product outside that channel does not provide the destination this recipe stores.
-
A CMS collection and template already prepared in Webflow
Build the structure in Webflow before running the recipe. It needs a PlainText field for the Shopify id and any link, image, and price fields you want to map. Your Met reads the schema but does not create collections, fields, templates, or visual elements.
-
Shopify read credentials and Webflow CMS read and write credentials
Shopify needs a custom app with read_products. Webflow needs sites:read, cms:read, and cms:write. Configuring a default site_id is optional.
-
A human decision about mapping, currency, and alt text
Before drafting, a person confirms which field slug receives each value, which currency the schema expects, and the alternative text when Shopify does not provide it. Your Met does not fill those gaps by instinct.
The limits
What this automation does NOT solve
Better said here than discovered halfway through the rollout.
-
It does not create a Webflow Ecommerce product. It creates an item in an existing CMS collection and keeps Shopify as the product source and link destination.
-
It does not generate or install a Buy Button, embed, cart, or checkout inside Webflow. Purchase happens at Shopify's onlineStoreUrl, and this recipe does not validate that checkout.
-
It does not synchronize later changes. Price, availability, images, and state may change in Shopify without updating the Webflow listing. There is no webhook or scheduled run in this flow.
-
It does not copy descriptionHtml, variants, or stock. This avoids moving active HTML and presenting a truncated list or static inventory as current commercial data.
-
It does not create collections, fields, Collection Pages, or design. It also does not prove how the listing looks. It verifies only data returned by the Shopify and Webflow APIs.
-
It does not support secondary locales in this version. The current tools do not expose cmsLocaleId end to end when listing, reading, and publishing the same localized item.
-
It provides no idempotency, compare-and-swap, lock, transaction, rollback, or undo. The slug preflight reduces duplicates, but a concurrent race remains open and each write is reconciled.
FAQ
Questions about this automation
The content does not start from text supplied by a person. Its source is one exact Shopify product, it preserves the source id and handle, and it applies specific rules for link, image, price, currency, and data that must not be copied.
No. The listing links to the onlineStoreUrl returned by Shopify. A Buy Button or embedded checkout needs components and code these tools do not create.
Your Met reads the item and compares its Shopify id. A match shows the existing listing. A different id reports a collision. Both cases stop without updating or inventing another slug.
Moving HTML without a deterministic sanitizer can transport scripts, embeds, or active markup between systems. This first version omits the description and publishes structured fields only.
No. Webflow has to download it and may reject it because of format, access, or size. Creation uses skip_invalid_files false and the draft is read again to prove the ImageRef exists.
The concrete evidence exists only after creation: item_id, stored fields, and ImageRef. The second message approves that draft and enables the confirm flag for publishing that id only.
No. This is one reviewed publication. Keeping it synchronized needs a separate design with events, durable deduplication, and its own update and error policy.
Keep going
Other automations built on the same tools
Content and publishing
Publish a Webflow article with human review and approval
How do I publish a Webflow article without duplicating it or taking it live before review?
Social
- Starts:
- when someone asks for it
- Steps:
- 6, with 9 real tools
- Needs:
- Webflow
Orders and fulfillment
Create a Shopify order over WhatsApp for cash on delivery
How do I take a Shopify order over WhatsApp and leave it marked for cash on delivery?
- Starts:
- when the customer writes
- Steps:
- 5, with 7 real tools
- Needs:
- Shopify
Sales and quoting
Create a Shopify quote and share its payment link
How do I create a Shopify quote over WhatsApp and share its payment link?
- Starts:
- when the customer writes
- Steps:
- 5, with 5 real tools
- Needs:
- Shopify
Customer service and scheduling
Answer a Shopify order-status question over WhatsApp
How do I answer where a Shopify order is without exposing another customer's order?
Customer service
- Starts:
- when the customer writes
- Steps:
- 6, with 6 real tools
- Needs:
- Shopify · Meteor CRM
Want this automation running on your own data?
We will show it to you with your accounts connected, not with a canned demo.