How to Track Shopify Orders, Checkouts & Revenue in MailInApp

Connecting Shopify does two separate jobs: it syncs customers into a contacts list you can send to, and it watches for checkout/order events so a send's own revenue shows up next to its opens and clicks. This walks through both, end to end — from Settings → Integrations to the "Store revenue" card on a campaign's own Responses page.

Subject

New arrivals — shop the collection

Connecting Shopify does two separate jobs: syncing your customers into a contacts list, and watching for checkout/order events so a send's own revenue shows up next to its opens and clicks. Here's exactly how to set both up and where to read the results.

If you've read "Track orders, checkouts & revenue" on the integrations page and weren't sure what that actually looks like day to day, this is the walkthrough — from the Settings screen to the number that eventually shows up on a campaign's own Responses page.

Step 1 — Connect your store

From Settings → Integrations, enter your store's myshopify.com domain and hit Connect Shopify. You'll be sent through Shopify's own OAuth approval screen. On approval, two things start immediately:

  • MailInApp creates a dedicated contacts list for the store and begins syncing existing customers into it in the background.
  • MailInApp registers webhooks with Shopify so new customers, started checkouts, and paid orders arrive live from then on — no periodic re-import needed.

This is a one-time $30 fee, billed through Shopify's own Billing API as part of the connect flow, available on every plan including Free. It's non-refundable if you later uninstall, but reconnecting later on the same account is free.

Nothing about the email itself needs to be special. Design a project the normal way — a Countdown block for a live, always-accurate deadline works well for a promotion, and an Image or Button pointed at a real product or collection URL on your store is what actually sends someone there. Link to your store exactly the way you would from anywhere else: paste the real product page URL. There's no separate "tracking link" to generate and no tag to add by hand.

This is the part that's easy to miss, because there's nothing to configure. Every Button, Image, or other link-bearing block that points off MailInApp already gets routed through a click-tracking redirect when a recipient clicks it — that's how the click heatmap on your Responses page works for any outbound link. For a link to an external site like your Shopify store, that same redirect does one more thing: it appends

utm_source=mailinapp
utm_medium=email
utm_campaign=<this project's ID>
utm_content=<the block that was clicked>

to the destination URL before sending the recipient on their way — but only if the link doesn't already carry its own utm_campaign. If you've deliberately tagged a link yourself for your own analytics, that tag is left exactly as you set it, and MailInApp won't attribute through it.

Step 4 — Shopify carries those tags through to the order

Shopify stores the URL a shopper landed on (including its full query string) on the order it eventually creates, whether they buy immediately or come back later. So the utm_campaign that named your MailInApp project is still sitting on the order by the time it's paid — nothing extra to configure on the Shopify side either.

Step 5 — MailInApp reads it back off the paid order

Once the order is actually paid — not just placed, since a placed-but-unpaid order is a checkout, covered below — Shopify calls MailInApp's webhook. MailInApp verifies the request genuinely came from Shopify, looks up the utm_campaign on the order, matches it back to your project, and records a purchase event for it. From here it flows through the same reporting pipeline a purchase made through one of MailInApp's own in-email checkouts would.

Step 6 — Read the results

Two places to look:

  • That campaign's Responses page gets a Store revenue card — total revenue and order count — the moment at least one order attributes back to it. If nothing's attributed yet, the card simply doesn't appear rather than showing a zero.
  • Every synced customer's own record updates with their order regardless of attribution, so even a purchase with no click behind it (someone who bought directly on your store) still updates that customer's history. It just won't show up tied to one specific campaign, since there was no click to attribute it through.

That customer-level history also feeds a Purchased and a Total revenue condition available when you're building the audience for your next send, schedule, or journey — so "people who bought something after last month's email" is a filter you can actually build, not a spreadsheet you have to assemble by hand.

What about abandoned checkouts?

A checkout that's started but never paid fires a separate event (checkouts/create) rather than the paid-order one above. MailInApp doesn't currently show a standalone list of these anywhere in the dashboard — instead, they're the trigger a journey can react to directly: point a journey's cart abandoned trigger at your connected store and set a delay, and a recovery email goes out automatically to anyone whose checkout stalls past that delay, skipping automatically if they've since paid. See the dedicated abandoned-cart journeys guide for that flow specifically.

Getting started

Connect your store from Settings → Integrations, build one email with a real link to a product or collection page, and send it to a small segment first. Check that campaign's Responses page after a day or two — if a purchase happened through that link, the Store revenue card will already be there. See Shopify, Responses & webhooks, and Behavioral segments for the full reference.

A typical build-and-send sequence

  1. 1

    Connect your Shopify store

    From Settings → Integrations, enter your store's myshopify.com domain and approve access through Shopify's OAuth screen. This is a one-time $30 fee (any plan, including Free); MailInApp then starts syncing your Shopify customers into a dedicated contacts list and registers webhooks so checkout and order events arrive live.

  2. 2

    Build an email that links back to your store

    Design a project with a Countdown for urgency and an Image or Button pointed at a real product or collection URL on your store — the same way you'd link to it from anywhere else. Nothing needs a special tracking parameter added by hand.

  3. 3

    Send it — MailInApp tags the link automatically

    When a recipient clicks through to your store, MailInApp's own click redirect appends utm_source=mailinapp, utm_medium=email, utm_campaign=<this project>, and utm_content=<the block> to the destination URL before sending them on — but only if that link doesn't already carry its own utm_campaign, so anything you've deliberately tagged yourself is left alone.

  4. 4

    Shopify carries those tags through checkout

    Shopify stores the landing URL's query string on the order itself. If the shopper buys — same visit or later, same device — the order's own data still carries the utm_campaign that named your project.

  5. 5

    MailInApp reads it back off the paid order

    The orders/paid webhook fires once the order is actually paid (not merely placed). MailInApp verifies it came from Shopify, matches the utm_campaign back to your project, and records it as a purchase — the same kind of event a native in-email checkout produces.

  6. 6

    Read the results on that campaign's Responses page

    A "Store revenue" card appears once at least one order attributes back — total revenue and order count for that project. Every synced customer's order also updates their own lifetime stats, and a Purchased or Total revenue condition is available when building the audience for your next send or journey.

Frequently asked questions

Do I need to add UTM parameters to my Shopify links myself?

No. Any Button, Image, or other link-bearing block pointing off MailInApp gets click-tracked automatically, and the redirect appends the utm_campaign that identifies your project the moment someone clicks — as long as the link doesn't already carry its own utm_campaign, which is left untouched.

What if a customer buys on my Shopify store without clicking an email link first?

That order still syncs normally — it updates the customer's own record in your contacts list — but there's no click for MailInApp to have tagged, so it won't attribute to a specific campaign or show up on that campaign's Store revenue card. Attribution only works for orders that trace back to an actual click-through.

Is this the same checkout as MailInApp's own Product block?

No — a Product block charges through your own connected Stripe account entirely inside MailInApp, with no Shopify store involved. This tutorial is the opposite case: the purchase happens on your Shopify store's own checkout, and MailInApp is just reading the result back through Shopify's webhook.

Does Shopify revenue count toward an A/B test's winning variant?

It's tracked, but separately: a Shopify order carries no MailInApp variant claim, so it adds to the project's own Store revenue total rather than any one variant's revenue number used to pick an A/B winner.

How is this different from the abandoned-cart journeys article?

That one is about automatically enrolling someone in a recovery journey the moment Shopify reports a checkout that stalled out. This one is the broader picture — connecting the store, building any interactive email that links to it, and reading back the orders and revenue that email produced, whether or not a cart was ever abandoned.

Does this work the same way with WooCommerce?

Yes — WooCommerce connects with a REST API key instead of OAuth, but customer sync, click-through attribution, and the Store revenue card all work identically once it's connected.

Build this in the studio

Start on the free plan — every interactive block and the full fallback engine are included on every tier.