Daily
Catch orders stuck in processing
A daily email names orders that have sat in processing too long, so none get forgotten.
- Runs
- Daily
- Apps
- WooCommerce
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every day at 10am, email me WooCommerce orders that are still in processing more than 3 days after they were placed, oldest first.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
In a busy WooCommerce shop, orders sit in the processing status until someone ships them and marks them complete. When a packer is off sick, a supplier is late, or an order slips under a pile, it stays in processing for days. The customer has paid, receives nothing, and writes an angry email or opens a chargeback, long before the shop owner realises anything is wrong.
Each day the automation lists orders with the processing status, checks how long ago each was created, and emails you the ones older than the limit you set, for example three days. You see which orders are stuck and for how long, so you can ship, contact the customer or chase a supplier.
It suits shops that ship from their own stock or rely on drop-shipping partners.
What you get out of it
Fewer chargebacks and angry emails
Customers contact you after a few days of silence. Reaching them first, with a tracking number or an honest update, usually prevents a dispute that costs fees and goodwill. Even a short message saying an item is delayed usually calms a customer more than silence does.
Find supplier problems early
If many stuck orders involve the same product, the supplier is the cause. You learn within days rather than after a pile of complaints. You then know whom to call before the next batch of orders gets stuck for the same reason.
Nothing hides at the bottom of a list
Old orders are exactly the ones nobody scrolls to. The daily email brings them to the top of your attention. A daily list means the oldest order is always visible instead of buried beneath newer ones.
Protect your reviews
A late delivery is a common reason for a bad review. Catching delay early gives you a chance to fix it before it is posted. You can reach out, send an apology and still save the relationship before they post anything publicly.
A cleaner fulfillment queue
Knowing the age of every open order helps you decide what to pack first, so the oldest ones stop getting older. The result is a shorter average time between order and dispatch.
How it works
What happens, step by step
Once a day, ClickRuntime looks at your WooCommerce orders that are still in processing.
It picks out the ones that have been waiting longer than you allow.
You get an email listing each stuck order with its number, customer, how many days it has waited and its total.
Before it runs live
- Connect WooCommerce
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 Slack
- Combine it with other WooCommerce steps into one automation
Under the hood
The code that runs this automation
from datetime import datetime, timedelta
from clickruntime import on_trigger, credentials, http, notify
STORE = "https://yourstore.com/wp-json/wc/v3"
@on_trigger
def run(event):
auth = (credentials.secret("WC_CONSUMER_KEY"), credentials.secret("WC_CONSUMER_SECRET"))
cutoff = datetime.now() - timedelta(days=3)
orders = http.get(f"{STORE}/orders", auth=auth, params={
"status": "processing", "before": cutoff.strftime("%Y-%m-%dT%H:%M:%S"),
"orderby": "date", "order": "asc", "per_page": 100}).json()
if not orders:
return {"stuck": 0}
lines = [f"- #{o['number']} {o['billing']['first_name']} {o['billing']['last_name']}, "
f"{(datetime.now() - datetime.fromisoformat(o['date_created'])).days} days, {o['total']} {o['currency']}"
for o in orders]
notify.email_me(f"{len(orders)} orders processing for over 3 days", "\n".join(lines))
return {"stuck": len(orders)}FAQ
Common questions
How is the age of an order measured?
Does it include orders on hold?
How many days should the limit be?
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
Sort customers into champions, loyal, at-risk and lost
Once a month you see which customers buy often and recently, and which have drifted away.
See how it worksMake follow-up coupons for unfinished orders
Each evening, customers with pending orders get a unique coupon and you get the list to follow up.
See how it worksGet a morning list of low-stock products
Products dropping under your threshold are emailed to you each morning, without repeats of ones already flagged.
See how it worksKeep exploring
Set up “Catch orders stuck in processing” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.