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:
- 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.
- Install the app on your store, then copy its Client ID and Client Secret from the app's settings.
- 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.
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.
| Event | Fires when |
|---|---|
shopify.customer.created | A new customer signs up in your store. |
shopify.order.created | A new order is placed. |
shopify.order.paid | An order is paid in full. |
shopify.fulfillment.created | A shipment is created — tracking company, number, and URL included. |
shopify.cart.abandoned | A 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 tag | Renders |
|---|---|
{{ 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. |
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.