Integrations
Docs chevron_right Integrations chevron_right Shopify events

Shopify events

Wire your store to your email. Connect Shopify once and new customers, orders, fulfillments, and — the big one — abandoned checkouts become automation triggers, each carrying the order data (items, totals, the cart-recovery link) as merge tags your emails render directly.

Connecting Shopify

The connection uses a private app you create in Shopify's Dev Dashboard — about two minutes of clicking, no code:

  1. In the Shopify Dev Dashboard, create an app for your store and give it the read orders, read customers, read checkouts, and read fulfillments Admin API access scopes.
  2. Install the app on your store, then copy its Client ID and Client Secret from the app's settings.
  3. Back in Integrations → Shopify → Connect, paste your shop domain (your-store.myshopify.com) plus both credentials.

We exchange the credentials for an access token (refreshed automatically — nothing expires on you) and register the store webhooks in the same step, pointed at a receiver URL unique to your account. Every delivery is verified against your app's client secret; if the webhook registration fails, nothing is saved — fix the app's scopes and connect again.

emailflow.ai/rui/integrations/shopify/connect
The Shopify connect form: fields for shop domain, client ID, and client secret, with numbered Dev Dashboard setup instructions alongside
Connect with the Dev-Dashboard app credentials — webhooks register themselves.

The event catalog

Connecting provisions these events automatically. Each appears in the automation trigger picker (grouped under Shopify) and in the events directory with its full fire log.

EventFires when
shopify.customer.createdA new customer signs up in your store.
shopify.order.createdA new order is placed.
shopify.order.paidAn order is paid in full.
shopify.fulfillment.createdA shipment is created — tracking company, number, and URL included.
shopify.cart.abandonedA checkout sits idle past your abandoned-cart delay without converting into an order.

How abandoned-cart detection works

Shopify has no "cart abandoned" webhook — we build the state machine for you. Every checkout your store reports is tracked; when one sits idle past the abandoned-cart delay (a setting on the connection page, 60 minutes by default) without an order completing it, shopify.cart.abandoned fires exactly once for that checkout. If the customer finishes buying at any point, the tracked checkout is closed and no abandonment ever fires — nobody gets a "you forgot something" email about an order they placed.

The fire's payload carries what a recovery email needs: the cart's items and totals, and {{ event.recovery_url }} — Shopify's one-click link that restores the cart exactly as the customer left it.

Building on the events

In the automation editor, choose the Custom event trigger and pick a Shopify event. The payload renders in emails through {{ event.* }} merge tags:

Merge tagRenders
{{ event.recovery_url }}The cart-restore link on shopify.cart.abandoned — the recovery email's call to action.
{{ event.total_price }}The order or cart total — 129.90.
{{ event.order_status_url }}The customer's order-status page on shopify.order.* events.
{{ event.tracking_url }}The carrier tracking link on shopify.fulfillment.created — shipping-notification ready.
{{ event.customer.first_name }}The buyer's first name on order events.
person_add
Contacts are matched by email address against the list you pick in the connection's settings. Turn on auto-create and a first-time buyer is added to that list the moment their event arrives — new Shopify customers can flow straight into a welcome series.

Troubleshooting

  • No events arriving. The connection page shows Last event received. If it stays empty, confirm the app is installed on the store and its scopes match the list above — then disconnect and reconnect to re-register the webhooks.
  • Abandoned carts fire too early or too late. Tune the delay on the connection page — anything from 10 minutes to 7 days. The delay is measured from the checkout's last activity, not its creation.
  • A checkout with no email address. There is nobody to send a recovery email to, so the tracked checkout is closed silently — no fire, and nothing in the log.

Disconnecting from the Manage page deletes the store webhooks we registered and clears the stored credentials. The provisioned events and their fire history stay, so reconnecting later picks up where you left off.