Automated Abandoned-Cart Journeys for Shopify & WooCommerce

The other abandoned-cart approach on this site builds the recovery email around your own data source. This one skips the data source entirely: connecting a Shopify or WooCommerce store syncs its customers into a contacts list kept current by that store's own webhooks, and a journey's cart abandoned trigger fires directly off a real checkout-started-but-not-finished event — after a delay you set, and only if they haven't already paid by the time it would go out.

Subject

Still thinking it over?

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.

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.

A typical build-and-send sequence

  1. 1

    Connect your store

    From Settings → Integrations, connect Shopify via OAuth or WooCommerce with a REST API key — either way, MailInApp registers webhooks so customer and cart events arrive in real time.

  2. 2

    Build the recovery email once

    Design a project with a Product block (the same item, pulled from the abandoned checkout) and a Countdown on the recovery discount.

  3. 3

    Set cart abandoned as the journey trigger

    Point a journey at the connected integration's cart abandoned trigger and pick a delay — how long to wait after the checkout stalls before the reminder goes out.

  4. 4

    Let it exit automatically on a real purchase

    Add a goal step ahead of the send so the run exits immediately if the shopper already paid before the reminder would fire — no reminder mailed for a cart that isn't abandoned anymore.

Frequently asked questions

How is this different from the other abandoned-cart article on this site?

That one assumes you're already building recovery emails around your own data source and sending manually or on a schedule. This one is specifically about the Shopify/WooCommerce integration's cart abandoned journey trigger — a real store event enrolls someone automatically, with no data source or manual send involved.

Does WooCommerce support the same cart-abandonment trigger as Shopify?

The purchase and customer-sync side is identical, but cart detection differs: Shopify reports a real checkout-started event natively, while 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 plugins the site runs, so a WooCommerce-only integration won't produce cart-abandoned enrollments.

Does connecting a store also work for a native, own-checkout abandoned cart, without Shopify or WooCommerce?

Yes, separately — a journey's checkout abandoned trigger covers a Buy Now started on one of your own Product-block checkouts and needs no store integration at all; cart abandoned is specifically for a connected external store's own cart event.

Does revenue from a recovered Shopify or WooCommerce order show up in MailInApp's own reporting?

Yes — where the 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.

What happens to already-synced customers if I disconnect the store?

They stay in their contacts list — disconnecting stops the sync and any further webhook processing immediately, but never deletes contacts, since they may already be an audience for other projects.

Build this in the studio

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