Shopify
Connect a Shopify store to sync its customers into a MailInApp contacts list, trigger journeys off real store events, and see revenue tie back to a campaign or variant.
Connect your store
Shopify stores connect from the Shopify side, not from MailInApp: in your Shopify admin, install MailInApp from the Shopify App Store (or, if it's already installed, open it from Apps) and approve access on Shopify's own OAuth screen. MailInApp requests read_customers, read_orders and read_products (all read-only), plus write_discounts so it can mint the single-use discount codes described below — it never asks for write access to your store's products, orders or customers themselves. On approval, MailInApp creates a dedicated contacts list for the store and starts an initial customer backfill in the background, capped at 5,000 customers per connection. A store with more customers than that keeps growing its list from there through Shopify's own webhooks, just without a one-shot backfill past the cap.
Shopify then hands you to MailInApp to sign in to your existing account or create a free one — the store connects to whichever account you sign in to, and you land back in the MailInApp app inside your Shopify admin. There's no "enter your myshopify.com domain" form in MailInApp's own dashboard: Settings → Integrations shows the connected store, its sync status and Disconnect.
Connecting Shopify is free on every plan, including Free. Your MailInApp plan itself is managed and billed entirely through Shopify, from the MailInApp app inside your Shopify admin — you don't go through MailInApp's own card or PayPal checkout.
What it does
- Customer sync — Shopify customers land in a contacts list scoped to this integration, kept current afterward by Shopify's own webhooks (
customers/create, pluscheckouts/createandorders/paidfor the triggers below) rather than a periodic re-poll. - Journey triggers — a connected store can fire a journey's cart abandoned trigger (a checkout started but not completed) and its purchase trigger (an order paid), so a welcome-series or abandoned-cart automation can run off real Shopify activity instead of only MailInApp's own product-block checkout. See Journeys.
- Revenue attribution — an order's own campaign/variant, where identifiable, rolls into the same response and A/B-test revenue numbers a native checkout order already produces.
- Purchase-history segments & discount offers — order line items sync alongside customers, so an audience filter can match "bought product X between date A and B" (see Purchase history), and a project can mint a single-use Shopify discount code per matched recipient, redeemed on your own store checkout (see Discount offer). Ongoing orders sync from the
orders/paidwebhook automatically; a store connected before this shipped, or with older history, needs a one-time Backfill order history pull from Settings → Integrations — capped to roughly the last 60 days unless Shopify has separately approved this app for full order history on your store. A Product block imported from your catalog can independently mint its own Per-product discount — scoped to just that item, with no audience filter needed — see Store-native discounts and Shopify product discount codes. - Product catalog for the studio — your store's own active listings sync into MailInApp too, refreshed automatically on the same cadence as customers (no separate button). The Product block's Import from store picker searches this synced catalog and fills in a block's name, description, image and price from a real product — a one-time copy, not a live link, so nothing about a sent email can drift from what you reviewed. It also syncs each product's own page (from its Shopify handle) and, when that's available, sets the block to Link to external store checkout pointed straight at it — so an imported product is ready to sell on your Shopify store with nothing left to configure; switch it back to MailInApp checkout manually if you'd rather take payment through your connected Stripe account instead. A store connected before this shipped needs a quick Disconnect in Settings → Integrations, then reopening MailInApp from your Shopify admin, to grant the new
read_productspermission Shopify requires — the picker just shows nothing until then.
Connection health & reconnecting
Shopify issues MailInApp a short-lived access token (valid for about an hour) alongside a rotating refresh token, and MailInApp refreshes that pair automatically in the background — customer sync, journey triggers and discount minting all keep working with no action from you under normal use.
If Shopify ever revokes or invalidates that refresh token — for example, the app was uninstalled and reinstalled outside MailInApp, access was manually revoked from your Shopify admin, or the token simply expired from prolonged inactivity — MailInApp deliberately stops rather than retrying silently with stale credentials, and Settings → Integrations shows the store's status as Reconnect required. This is a security safeguard, not a bug report: MailInApp never re-authenticates on your behalf without you approving a fresh OAuth grant through Shopify's own screen.
If you see that status, click Disconnect in Settings → Integrations, then open MailInApp again from your Shopify admin and approve Shopify's screen to grant a clean token pair. This takes a few seconds, costs nothing, and doesn't touch contacts or orders already synced — sync simply resumes once the new connection is approved.
Disconnecting
Disconnect in Settings stops the sync and any further webhook processing immediately. Customers already synced stay in their contacts list — disconnecting an integration never deletes contacts, since they may already be a send audience for other projects. Uninstalling the app from Shopify's side works the same way at first. About 48 hours later, once Shopify's own data-deletion webhook fires, it fully erases the synced contacts and cart records too — the standard grace period every Shopify app must honor.