Table of Contents
- Pick the topics that are worth interrupting you
- Step 1 — Create the channel
- Step 2 — Add the webhook in Shopify
- Step 3 — Template the fields you actually read
- Step 4 — Route by topic with a condition
- Only wake me for big orders
- What this does not do
- Frequently asked questions
- Do I need a Shopify app to do this?
- Can my warehouse see the orders without seeing my Shopify admin?
- Should I put customer names in the notification?
- Can I get a phone call for a chargeback?
- Wrap-up
- Related
Shopify's own order emails arrive whenever your mail app decides to sync, land in a folder you filter, and look identical whether the order was €12 or €1,200. If you run the shop yourself, that is the wrong shape of signal.
A webhook fixes it. Shopify will POST every order to a URL you choose, and Echobell turns that POST into a notification whose loudness you decide.
Pick the topics that are worth interrupting you
Shopify calls webhook event types topics. These four cover most single-operator shops:
| Topic | What it means | Urgency |
|---|---|---|
orders/create | An order was placed. | Normal |
orders/paid | Payment cleared. Use this one if you only care about money that actually arrived. | Normal |
orders/cancelled | A customer cancelled. Worth knowing before you pack it. | Time-sensitive |
refunds/create | A refund was issued. | Time-sensitive |
Subscribe to orders/create or orders/paid, not both, unless you genuinely want two notifications per sale. For most shops orders/paid is the honest one.
Step 1 — Create the channel
Create a channel in Echobell called something like "Shopify orders", copy its webhook URL, and turn on POST Only. Shopify always posts.
If you want a separate, louder channel for cancellations and refunds, make that one now too and set it to time-sensitive.
Step 2 — Add the webhook in Shopify
In the Shopify admin, go to Settings → Notifications → Webhooks → Create webhook. Choose the topic, set the format to JSON, and paste your channel URL.
Shopify sends a test payload when you save. If your phone buzzes, the path works.
Step 3 — Template the fields you actually read
Shopify order payloads are long — a hundred-plus fields per order. You only need a few:
Title
New order #{{order_number}} · {{total_price}} {{currency}}
Body
{{customer.first_name}} {{customer.last_name}}
{{line_items[0].title}}
line_items is an array, so line_items[0] is the first item. Echobell templates support index access, but there is no loop — a three-item order shows the first item and nothing else. If that matters, put the item count next to it:
{{line_items[0].title}} · {{line_items.length}} items in total
Unlike Stripe, Shopify sends total_price as a decimal string — "49.00", not 4900 — so it reads correctly with no maths.
Step 4 — Route by topic with a condition
If you point several topics at one channel, Shopify tells you which is which in a header:
header["x-shopify-topic"] == "orders/paid"
That is the cleanest way to split behaviour without creating a webhook per channel in the admin.
Only wake me for big orders
The pattern most shop owners actually want: every order goes to a quiet channel, and only the ones above a threshold go to a loud one.
Create a second channel, set it to time-sensitive, point another orders/paid webhook at it, and give it a condition:
total_price > 500
Now a normal day is a background hum and a €900 order is something you feel.
What this does not do
No HMAC verification. Shopify signs every webhook with an X-Shopify-Hmac-Sha256 header. Echobell does not verify it, so your channel URL is the only thing keeping strangers out. Keep it secret, keep POST Only on, and if a forged order notification would cause real harm, put your own endpoint in front to verify the HMAC and have it call Echobell.
Shopify can deliver the same webhook twice. It retries on failure, and retries are not deduplicated. Treat the notification as a nudge to look at the order, not as a count of orders. Your Shopify admin is the source of truth.
Sold-out and inventory topics get noisy fast. inventory_levels/update fires on every stock movement including your own edits. If you want low-stock alerts, filter hard with a condition or you will regret it by lunchtime.
Frequently asked questions
Do I need a Shopify app to do this?
No. Webhooks under Settings → Notifications are built into the admin and need no app, no partner account, and no code.
Can my warehouse see the orders without seeing my Shopify admin?
Yes. Share the channel with them. They get the notifications and nothing else — no admin access, no customer records beyond what your template includes.
Should I put customer names in the notification?
That is your call, and it is worth making deliberately. Anything in the template shows up on a lock screen. Order number and total are usually enough to act on.
Can I get a phone call for a chargeback?
Shopify Payments disputes come through the disputes/create topic on stores using Shopify Payments. Point that at a calling channel — it is the one order event with a deadline attached.
Wrap-up
One webhook, one template, and a condition if you want the loud version. It takes about five minutes and it replaces refreshing the orders page.
Download Echobell for iPhone or get it on Google Play, then place a test order and watch it arrive before the confirmation email does.