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 has no equivalent built-in signal, so cart detection there depends on whatever abandoned-cart plugin your store setup already reports through — a store with none simply won't produce cart-abandoned enrollments, which is 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.

This isn't the same as an own-checkout abandoned cart

A separate journey trigger, checkout abandoned, covers someone starting and not finishing a Buy Now on one of your own Product-block checkouts — no Shopify or WooCommerce connection required at all. Cart abandoned is specifically for a connected external store's own cart event. Both can run as separate journeys on the same account if you sell both ways.

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.

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 has no such built-in signal — cart-abandonment enrollment there depends on whatever abandoned-cart plugin your store already reports through, and a store with none simply 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.