Shopify
The Shopify integration closes the loop between a browsing session and the order it produced, without cookies and without running anything inside Shopify’s checkout sandbox.
Shopper browses your store -> signals.js tracks the session (cookieless)Cart bridge -> stamps the session id on the cart as _snip_sidShopper checks out -> the id rides the order's note_attributesorders/paid webhook -> SnipForm writes the order value onto that sessionSet up
Section titled “Set up”-
Install from Shopify. The install starts on Shopify’s side (it is an App Store requirement). Install the SnipForm Signals app on your store; Shopify runs OAuth and hands you back to SnipForm.
-
Link the store to a property. SnipForm matches the store to a property whose domain matches the shop. If there is exactly one candidate it links automatically; otherwise you choose. A store can be linked to one property, and a store already linked to another SnipForm account has to be disconnected there first.
-
Turn on the app embed. In your theme editor, Theme settings > App embeds > SnipForm Signals, toggle it on and paste the property key shown in SnipForm. The embed loads the tracker and the cart bridge.
-
Check the tile. Back in Property > Integrations, the Shopify tile shows two checks: Tracking snippet and Checkout pixel. Both go green once a real visit and a real checkout event have been seen.
To disconnect, use the tile’s Disconnect button. Webhooks from an unlinked store are ignored.
How the session id reaches the order
Section titled “How the session id reaches the order”A SnipForm session id is cookieless and reconstructed server-side, so on the storefront it exists only as window.signals.sessionId. Shopify’s checkout page and Web Pixels run in isolated sandboxes that cannot read that variable, so the id has to be carried explicitly. The cart is the carrier:
- The cart bridge calls
POST /cart/update.jsto set the cart attribute_snip_sid. - It also injects a hidden
properties[_snip_sid]line-item property into everyform[action^="/cart/add"], and watches for forms rendered later, so Buy-it-now style flows that bypass the cart attribute still carry the id on the line item. - At checkout the attribute becomes
note_attributeson the order; the webhook handler checks both places.
Webhooks SnipForm receives
Section titled “Webhooks SnipForm receives”All webhooks are HMAC-verified against the app secret; a bad signature is answered with 401.
| Topic | What SnipForm does |
|---|---|
orders/paid | Writes the order total onto the session as acquisition value (integer cents, order currency) with tags shopify and shopify:order:{id}, and fires a purchase event with source, currency_code and order_id meta. Idempotent: value overwrites, tags dedupe |
checkouts/create | Fires a checkout event on the session with the checkout total, item_count and an items summary, so funnels get a step between browsing and purchase even though the tracker cannot run on checkout |
app/uninstalled | Marks the store uninstalled |
customers/data_request, customers/redact, shop/redact | Shopify’s mandatory privacy webhooks |
These land on sessions as the same acquisition and events you would send yourself, so everything downstream (conversions, automations, reports, the API) treats a Shopify order like any other revenue.
The storefront events
Section titled “The storefront events”The tracker in Shopify mode plus the checkout pixel can emit three events. Choose which on the tile:
| Event | Emitted on | Carries |
|---|---|---|
add_to_cart | product_added_to_cart | value (line total, cents), currency_code, title, quantity |
checkout | checkout_started | value, currency_code, item_count, items |
purchase | checkout_completed | value, currency_code, order_id, plus the acquisition write |
checkout and purchase are also raised server-side from the webhooks above, so funnels are populated even when a pixel event is lost. Acquisition writes are idempotent, so the overlap is safe.
Manual install
Section titled “Manual install”If you would rather not use the app embed, the tile’s drawer shows two snippets to paste:
<!-- SnipForm Signals --><script src="https://cdn.snipform.io/api/analytics/signals.js?site=YOUR_PROPERTY_KEY&shopify=true" defer></script>shopify=true tells the tracker to run the cart bridge itself. See Signals on Shopify.
In Shopify admin, Settings > Customer events > Add custom pixel, paste the pixel code from the drawer. It subscribes to the events you selected and posts them to SnipForm, reading _snip_sid from the checkout attributes and forwarding the shopper’s user agent and language so the session can be rebuilt when the id is missing.
The sales conversion
Section titled “The sales conversion”One click on the tile (Create sales conversion) publishes a conversion named Shopify Sales:
| Step | Trigger |
|---|---|
| All traffic | Every session |
| Added to cart | Event add_to_cart exists |
| Checkout | Event checkout exists |
| Purchase | Acquisition value exists |
The conversion’s value comes from the session’s acquisition revenue (value-from-event), its default period is the last 28 days and its default cycle is weekly. It is linked to the integration, idempotent (a second click returns the same conversion), and editable like any other conversion afterwards. Link it to an ad platform to get ROAS.
Where Shopify data shows up
Section titled “Where Shopify data shows up”- Sessions:
value_usd,acquisition_value,acquisition_tags(shopify:order:...), and thecheckout/purchaseevents. Query them with the field catalog. - Conversions: any step on
acquisitionor thepurchaseevent. - Automations: the “A purchase is recorded” trigger fires on
orders/paid. - Reports and Ads: revenue feeds weekly reports and ROAS.
The theme app extension source is public at public_repos/signals-shopify in the SnipForm repositories.