Connect a Shopify or WooCommerce store and a journey's cart abandoned trigger fires off a real checkout-started-but-not-finished event from that store. No data source to maintain, no manual export — just a recovery email that goes out on its own the moment a shopper stalls out.
The other abandoned-cart article on this site assumes you're already feeding a data source from wherever your cart data lives and sending recovery emails manually or on a recurring schedule. This one is about skipping that entirely: a connected Shopify or WooCommerce store syncs its own customers and its own cart-abandonment events directly, and a journey reacts to them in real time.
What connecting a store actually does
From Settings → Integrations, connecting Shopify walks you through its OAuth screen; WooCommerce connects with a REST API key generated on your own WordPress site. Either way, MailInApp registers webhooks on the store so customer, cart, and order events arrive live rather than through periodic polling. An initial backfill syncs existing customers into a contacts list scoped to that integration; everything after that stays current from the webhooks alone.
The cart abandoned trigger
A journey pointed at a connected integration's cart abandoned trigger enrolls a contact when that store reports a checkout started but not completed, after a delay you choose. Shopify reports this natively as a real checkout-started event. WooCommerce doesn't support this trigger at all yet — there's no equivalent signal MailInApp currently reads from a connected WooCommerce store, regardless of what abandoned-cart plugins the site runs, so a WooCommerce-only integration won't produce cart-abandoned enrollments. That's worth checking before building a whole journey around it.
Don't remind someone who already paid
A recovery email sent to someone who already checked out is worse than no email at all. A goal step ahead of the send checks whether a purchase has landed for that contact since the cart was abandoned, and exits the run immediately if so. The reminder simply never fires for a cart that isn't abandoned by the time it would go out.
The recovery email itself
Nothing about the email differs from any other MailInApp checkout. A Product block renders a real Buy Now button charged through your own connected Stripe account, and a Countdown on a time-boxed recovery discount stays accurate whenever it's opened rather than showing a stale "expires soon" line. The integration also writes the abandoned cart's own URL onto the contact row as a merge field, so a Button can link straight back to the cart itself as an alternative to the in-email checkout.
Cart intent vs. checkout intent — the stage split
A key distinction introduced in MailInApp's intent split: cart abandonment and checkout abandonment are now tracked separately, each as a distinct journey trigger with its own stage field.
- Cart abandoned (
stage: "cart") — an item was added to a connected external store's cart but the buyer left before starting checkout. The right recovery message is usually benefit reinforcement: why this product, social proof, or a light nudge. - Checkout abandoned (
stage: "checkout") — the buyer reached your own Product-block checkout or the store's own checkout page but didn't complete payment. The right message is friction removal: FAQ answers, trust signals, a support link, or a time-boxed discount.
Both triggers can run as separate journeys on the same account. The stage field is also included in webhook payloads and response attribution, so your own analytics can distinguish between cart stalls and checkout drops. See Journeys for the full trigger reference.
Revenue keeps flowing into your existing reporting
Where a Shopify or WooCommerce order carries identifiable campaign or variant attribution, it rolls into the same response and A/B-test revenue numbers a native in-email checkout order already produces. Recovered sales aren't a separate reporting surface to check.
A related, different case: winning back a past buyer
Cart abandoned is about a checkout that never finished. If instead you want to target customers who did buy — a specific product, in a specific date range — and offer them a discount to come back, see win back past buyers with purchase-history segments & discount codes. It uses the same connected store, but a different segment and a real store-native discount code instead of a journey trigger.
Getting started
Connect your store from Settings → Integrations, then point a new journey's trigger at that integration's cart abandoned event with a delay of your choosing. Add a goal step ahead of the send to skip anyone who already paid. See Shopify, WooCommerce, and Journeys for the full reference.