Every 30–60 minutes
Get a Slack alert when orders stop or ship late
Slack tells you when no orders have come in for longer than usual, or when paid orders are waiting too long to ship.
- Runs
- Every 30–60 minutes
- Apps
- Shopify, Slack
- AI
- Not needed
- Access
- Shopify read_orders; Slack chat:write
Send this to your assistant
Create a ClickRuntime automation: every 30 minutes, check Shopify: alert #ops if there's been no order for 3 hours, or if any paid order has been unfulfilled for more than 48 hours.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
An online gift shop usually takes an order every half hour. One Saturday a payment setting changed and checkout failed silently for six hours. No error appeared anywhere; orders simply stopped, and the owner only noticed on Monday when the weekend total looked wrong.
A check that notices when orders stop, and when paid orders sit unshipped past your promise, catches both kinds of problem while they are still small. You find out about a broken checkout in hours, and late parcels before customers start asking.
What you get out of it
Silent checkout failures get caught
A broken payment method or theme bug rarely announces itself. A gap in orders is often the first sign, and hearing about it quickly limits the lost sales.
Shipping promises are kept
Orders waiting longer than your dispatch time are flagged while there is still time to send them. Fewer customers write in asking where their parcel is.
One alert per problem
Each quiet spell and each late order is reported once, not every half hour. The channel stays useful during a busy weekend.
Peace of mind away from the desk
Owners can step away knowing they will hear if something is wrong. No need to refresh the orders page to check the shop is still selling.
How it works
What happens, step by step
Every 30 minutes, ClickRuntime checks when the last order came into your Shopify store.
If the gap is longer than the limit you set, it posts an alert once, and again only after orders have resumed and stopped again.
It also looks for paid orders that have not been shipped within your dispatch time.
Each late order is reported once in your #ops Slack channel, with its order number and how long it has been waiting.
Before it runs live
- Connect Shopify
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Google Sheets
- Combine it with other Shopify and Slack steps into one automation
Under the hood
The code that runs this automation
from datetime import datetime, timedelta, timezone
from clickruntime import on_trigger, credentials, http, notify, state
STORE = "your-store.myshopify.com"
def gql(query, variables=None):
resp = http.post(f"https://{STORE}/admin/api/2025-07/graphql.json", json={"query": query, "variables": variables or {}},
headers={"X-Shopify-Access-Token": credentials.connection("shopify", "store")})
return resp.raise_for_status() or resp.json()["data"]
QUIET_HOURS, SLA_HOURS = 3, 48
@on_trigger
def run(event):
now = datetime.now(timezone.utc)
last = gql("{ orders(first: 1, sortKey: CREATED_AT, reverse: true) { nodes { name createdAt } } }")["orders"]["nodes"][0]
gap = now - datetime.fromisoformat(last["createdAt"].replace("Z", "+00:00"))
if gap > timedelta(hours=QUIET_HOURS) and state.get("quiet_after") != last["name"]:
notify.slack(f"No Shopify orders for {gap.total_seconds() / 3600:.1f} hours (last was {last['name']}). Is checkout working?", channel="#ops")
state.set("quiet_after", last["name"])
cutoff = (now - timedelta(hours=SLA_HOURS)).strftime("%Y-%m-%dT%H:%M:%SZ")
late = gql(f'{{ orders(first: 50, query: "financial_status:paid fulfillment_status:unfulfilled created_at:<{cutoff}") {{ nodes {{ name createdAt }} }} }}')["orders"]["nodes"]
alerted = set(state.get("late") or [])
new = [o for o in late if o["name"] not in alerted]
if new:
notify.slack(f"{len(new)} paid orders waiting over {SLA_HOURS}h to ship: " + ", ".join(o["name"] for o in new), channel="#ops")
state.set("late", sorted(alerted | {o["name"] for o in new})[-500:])
return {"gap_hours": round(gap.total_seconds() / 3600, 1), "late": len(new)}FAQ
Common questions
Will it alert me every night when it is naturally quiet?
How do I choose the right gap?
Does it count partly shipped orders as late?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Get low-stock warnings from Shopify in Slack
Each morning Slack lists the products that will run out within two weeks at their current sales rate.
See how it worksPost yesterday's Shopify orders to Slack
Every weekday at 9, yesterday's order count and revenue are posted to your sales channel.
See how it worksPost a weekly Shopify sales report in Slack
Every Monday Slack shows last week's orders, revenue and best sellers, with a short comment on what changed.
See how it worksKeep exploring
Set up “Get a Slack alert when orders stop or ship late” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.