Skip to content

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_sid
Shopper checks out -> the id rides the order's note_attributes
orders/paid webhook -> SnipForm writes the order value onto that session
  1. 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.

  2. 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.

  3. 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.

  4. 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.

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.js to set the cart attribute _snip_sid.
  • It also injects a hidden properties[_snip_sid] line-item property into every form[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_attributes on the order; the webhook handler checks both places.

All webhooks are HMAC-verified against the app secret; a bad signature is answered with 401.

TopicWhat SnipForm does
orders/paidWrites 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/createFires 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/uninstalledMarks the store uninstalled
customers/data_request, customers/redact, shop/redactShopify’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 tracker in Shopify mode plus the checkout pixel can emit three events. Choose which on the tile:

EventEmitted onCarries
add_to_cartproduct_added_to_cartvalue (line total, cents), currency_code, title, quantity
checkoutcheckout_startedvalue, currency_code, item_count, items
purchasecheckout_completedvalue, 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.

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.

One click on the tile (Create sales conversion) publishes a conversion named Shopify Sales:

StepTrigger
All trafficEvery session
Added to cartEvent add_to_cart exists
CheckoutEvent checkout exists
PurchaseAcquisition 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.

  • Sessions: value_usd, acquisition_value, acquisition_tags (shopify:order:...), and the checkout / purchase events. Query them with the field catalog.
  • Conversions: any step on acquisition or the purchase event.
  • 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.