The moment it happens
Flag risky new store orders in Slack before shipping
Every new WooCommerce order is checked for warning signs, and risky ones are put on hold and posted to Slack before anything ships.
- Runs
- The moment it happens
- Apps
- Slack, WooCommerce
- AI
- Not needed
- Access
- Woo read+write; chat:write
Send this to your assistant
Create a ClickRuntime automation: when a WooCommerce order is created, check for a billing and shipping country mismatch, an order over $500 or several orders from one IP in a day; post risky ones to #orders and put them on hold.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A store that ships the same day can't afford to review every order by hand, but one fraudulent high-value order can wipe out a week's margin once the chargeback lands. The warning signs are well known: mismatched countries, unusually large baskets, a burst of orders from one address.
Checking each order against simple rules the moment it's placed, and holding the risky ones, gives someone a chance to look before the parcel leaves.
What you get out of it
Stop before shipping
A held order can be cancelled with a refund. A shipped one becomes a chargeback, the lost goods and a fee.
Only risky orders need attention
Normal orders flow through untouched, so the team reviews a handful of flagged orders instead of all of them.
Rules you can read
Every flag says why, such as a country mismatch, so whoever reviews it knows what to check.
Card-testing bursts are caught
Several orders from one IP address in a day is a common sign of stolen cards being tried, and is flagged automatically.
How it works
What happens, step by step
WooCommerce sends each new order to your automation's link as soon as it's placed.
ClickRuntime checks it against your rules: country mismatch, order value and how many orders the same IP address placed today.
Order counts per IP address are kept for the day so repeat orders can be spotted.
Risky orders are set to on-hold in WooCommerce and posted to #orders in Slack with the reasons.
Before it runs live
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
- Connect WooCommerce
- Paste your automation's link into the other app's webhook settings
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
- Act only on the items that match your own rules, and skip the rest
- 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 Slack and WooCommerce steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_event, credentials, http, state, notify
STORE = "https://shop.example.com/wp-json/wc/v3"
MAX_TOTAL = 500
@on_event
def handle(event):
o = event.json or {}
if "id" not in o:
return {"skipped": "not an order"}
ip = o.get("customer_ip_address", "")
state.increment_metric(f"ip:{ip}", ttl_days=2)
today = state.query_metric(f"ip:{ip}")
count = today[-1]["value"] if today else 1
reasons = []
if o["billing"].get("country") and o["shipping"].get("country") and o["billing"]["country"] != o["shipping"]["country"]:
reasons.append(f"billing {o['billing']['country']} vs shipping {o['shipping']['country']}")
if float(o["total"]) > MAX_TOTAL:
reasons.append(f"high value ${o['total']}")
if count > 3:
reasons.append(f"{count} orders from {ip} today")
if not reasons:
return {"order": o["id"], "risky": False}
auth = (credentials.secret("WOO_KEY"), credentials.secret("WOO_SECRET"))
http.put(f"{STORE}/orders/{o['id']}", auth=auth, json={"status": "on-hold"}).raise_for_status()
notify.slack(f":warning: Order #{o['number']} put on hold: " + "; ".join(reasons), channel="#orders")
return {"order": o["id"], "risky": True, "reasons": reasons}FAQ
Common questions
What rules does it check?
Will it cancel orders?
How do I connect WooCommerce?
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
Post the matching order to Slack when a refund or dispute arrives
When a refund request or chargeback comes in, your finance channel sees the WooCommerce order it belongs to, with items, dates and shipping status.
See how it worksPost yesterday's store sales to Slack every morning
Each morning your team sees yesterday's orders, revenue and best sellers in Slack, with a warning when revenue is far above or below normal.
See how it worksGet a daily Slack list of products running low
Every day your team sees which WooCommerce products have dropped below 10 in stock, so you reorder before they sell out.
See how it worksKeep exploring
Set up “Flag risky new store orders in Slack before shipping” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.