Conversions and orders
How Shopify orders become FTS conversions, and the small set of cases where they don't line up.
A conversion in Follow The Spend is a Shopify order that's been linked to a visitor journey. The order itself comes from Shopify; the linkage is what makes it a conversion in attribution terms.
How a conversion is recorded
When a Shopify order is placed:
- Shopify fires the
orders/createwebhook to FTS within seconds. We capture order ID, line items, total, customer info, timestamps. - Our pixel fires a conversion event as the buyer hits the thank-you page. This event includes the visitor cookie, so we know which visitor placed the order.
- We tie the order to the visitor's journey. The order is now a conversion attached to the most recent session in that visitor's history.
If both signals arrive (webhook + pixel event with matching customer ID), the conversion is fully linked. The vast majority of orders are.
What's counted in revenue
FTS reports net revenue attributable to a visitor's journey, defined as:
- Order subtotal excluding taxes and shipping
- After any refunds applied (refunds reduce the original order's revenue in real time when the refund webhook arrives)
- Excluding test orders (Shopify's
boguspayment gateway) - Excluding cancelled orders (orders cancelled before payment capture)
This is intentionally different from Shopify's "Total sales" view, which includes test orders and pre-refund gross. See Why FTS revenue doesn't match Shopify exactly for the full reconciliation.
When orders aren't fully linked
A small share of orders land with incomplete attribution. Three scenarios cover almost all of them:
1. Express checkout (Buy It Now / Shop Pay)
The biggest known gap. When a buyer uses an express-checkout button, Shopify's flow skips the page our pixel runs on. The order webhook still arrives, but the visitor → order link can't be forged. The order shows as direct rather than the visitor's real source.
This is a v1.0 limitation with a v1.x fix (Web Pixel API). See Why Buy It Now / Shop Pay shows as direct for the full story.
2. Webhook arrives, pixel doesn't fire
Rare, but possible if the buyer's browser blocked our pixel (aggressive ad-blocker, brittle network on the thank-you page) but the order webhook still arrived from Shopify. The order lands in Pulse but with no journey attached.
3. Pixel fires, webhook doesn't arrive (yet)
Even rarer. Shopify's webhook queue occasionally has a delay of a few minutes. The visitor's session shows the conversion event, but Pulse won't show the revenue until the webhook lands. Always resolves itself within minutes.
What about subscription / recurring orders?
If you sell subscriptions through a Shopify app like Recharge or Shopify's own Subscriptions, only the initial order is attributed to the original journey. Recurring renewals are tracked but not credited to a marketing channel — they don't have a fresh visitor journey to attach to.
Most stores find this is the right behavior: the marketing investment paid for the customer acquisition; renewals are a function of product fit and churn, not of marketing.
Multiple orders from the same visitor
A visitor who places 3 orders in 3 different sessions has 3 distinct conversions. Each is attributed independently using whichever model is active.
Lifetime value views (revenue per identified customer over time) are post-v1 — currently each order stands on its own.
Where to go next
- Multi-touch journeys — how sessions compose into the journey that gets attributed
- How attribution is computed — the math
- Why FTS revenue doesn't match Shopify exactly — reconciling the numbers