This article explains the shipment events CWILL Tracking can send, what each event means, when it is triggered, and how to configure it. You can send these events to Klaviyo, Omnisend, Zapier, Shopify Flow, and Shopify Email to automate your post-purchase experience.
Five events are available: Shipment status update, Shipment sub-status update, Post-purchase EDD expired, Shipment transit delay, and Shipment stalled. The first three are simple on/off events. Shipment transit delay and Shipment stalled are rule-based: you decide which shipments each rule covers and how many days should pass before an event is sent.
Plan requirement: CWILL Tracking events require the Professional plan or above.
Using Rule ID in your integrations
Where to find these settings
Go to CWILL Tracking admin â Integration â click the CWILL Tracking events button â set up the events you want to send

Shipment status update
When it's triggered
Triggered when the shipment status changes (e.g., from "In transit" to "Out for delivery").
| Shipment status | Description |
|---|---|
| Info received | The carrier received a shipping request and is about to pick up the shipment |
| In transit | The shipment is on its way |
| Out for delivery | The shipment is out for delivery |
| Ready for pickup | The shipment is available for the customer to collect from a pickup location |
| Delivered | The shipment has been delivered successfully |
| Exception | The shipment encounters shipping exceptions, such as damaged, lost, or returned |
| Failed attempt | The carrier attempted delivery but failed due to some reasons |
| Expired | Tracking details have not been updated for 30 days |
How often it's sent
Once per status, per shipment. If a shipment returns to a status it has already reported, no event is sent the second time.
Example: a shipment reaches Out for delivery, then Failed attempt, then Out for delivery again. The first two send an event. The return to Out for delivery does not, because that status was already reported for this shipment.
Which shipments it applies to
All shipments, whether they were created before or after you turned this event on. Only status changes that happen from that point forward are sent; changes that already happened are not sent retroactively.
How to set it up
Turn on Shipment status update. There is nothing else to configure. Every status in the table above is included, and this event never has a Rule ID.
Example workflow in Klaviyo
- Trigger: CWILL Tracking - Shipment status update
- Filter: shipment_status equals Delivered
- Send: A thank-you email, optionally with a discount code for the next order
Shipment sub-status update
When it's triggered
Triggered when the shipment sub-status changes (e.g., from "Picked up by carrier" to "Arrived at sorting facility").
| Icon | Shipment status | Shipment sub-status | Description |
|---|---|---|---|
| Info received | Info received | The carrier received a shipping request and is about to pick up the shipment | |
| In transit | In transit | The shipment is on its way | |
| Picked up by carrier | The carrier has collected the shipment from the sender | ||
| Arrived at sorting facility | The shipment has arrived at a hub or sorting center | ||
| Customs clearance completed | Customs clearance completed | ||
| Departed from airport | The shipment has left the airport and is en route to the next destination | ||
| Arrived at destination country | The shipment has arrived at the destination country | ||
| Arrived at local facility | The shipment has arrived at a local distribution center | ||
| Out for delivery | Out for delivery | The shipment is out for delivery | |
| Contacted before final delivery | The customer is contacted before the final delivery | ||
| Ready for pickup | Ready for pickup | The shipment is available for the customer to collect from a pickup location | |
| Delivered | Delivered | Shipment delivered successfully | |
| Picked up by customer | Shipment picked up by the customer | ||
| Signed by customer | Shipment delivered and signed by the customer | ||
| Delivered to doorstep | The shipment was left at the doorstep or with the neighbor | ||
| Exception | Exception | Other exceptions | |
| Unclaimed | The shipment is unclaimed | ||
| Retained by customs | The shipment was retained by customs | ||
| Shipment damaged or lost | The shipment was damaged or lost | ||
| Shipment canceled | The shipment was canceled | ||
| Refused by customer | The customer has refused to accept the shipment | ||
| Returned to sender | The shipment has been successfully returned to the sender | ||
| Returning to sender | The shipment is being returned to the sender | ||
| Failed attempt | Failed attempt | The carrier attempted delivery but failed due to some reasons | |
| Invalid address | The delivery failed due to address-related issues | ||
| Customer not available | The delivery failed because the customer was not available | ||
| Failed to contact | The delivery failed because the customer was unable to contact | ||
| Expired | Expired | Tracking details have not been updated for 30 days |
Note: The Fulfilled and Unfulfilled sub-statuses are not included in this event. If you need fulfillment data, use Shopify's native events instead, which are more accurate.
How often it's sent
Once per sub-status, per shipment. If a shipment returns to a sub-status it has already reported, no event is sent the second time.
Which shipments it applies to
All shipments, whether they were created before or after you turned this event on. Only sub-status changes that happen from that point forward are sent; changes that already happened are not sent retroactively.
How to set it up
Turn on Shipment sub-status update. Every sub-status in the table above is included, and this event never has a Rule ID.
Example workflow in Klaviyo
- Trigger: CWILL Tracking - Shipment sub-status update
- Filter: shipment_substatus equals Returning to sender
- Send: An email telling the customer the parcel is heading back
Post-purchase EDD expired
When it's triggered
Triggered when the estimated delivery date (EDD) has passed, and the shipment is not marked as delivered.

- Post-purchase EDD must be turned on for this event to work. If the feature is off, no shipment has an EDD to expire.
- If a shipment has more than one EDD source, the latest end date decides whether the EDD has expired.
- Shipments that are already delivered never trigger this event.
How often it's sent
Once per shipment. If the EDD is later updated and expires again, no second event is sent.
Which shipments it applies to
Only shipments whose order was created after you turned this event on. If you turn the event off and back on, the most recent time you turned it on becomes the new starting point, and shipments from orders created before that time no longer qualify.
How to set it up
Turn on Post-purchase EDD expired. Make sure Post-purchase EDD itself is also turned on. This event never has a Rule ID.
Example workflow in Klaviyo
- Trigger: CWILL Tracking - Post-purchase EDD expired
- Filter: None
- Send: An apology email that acknowledges the delay and links to the tracking page
Shipment transit delay
When it's triggered
Triggered when a shipment remains undelivered after reaching the predefined number of transit days.
| Transit time | The number of days since the carrier picked up the shipment |
- A shipment triggers the event when its transit time is greater than or equal to a Day(s) threshold in the rule it matches.
- Shipments that are already delivered never trigger this event.
How rules work
Before you create anything, the rule list already contains one rule covering All carriers, All locations, and All destinations. That is your baseline: turn the event on and every undelivered shipment triggers the event once its transit time reaches the threshold set there.
Add a rule when part of your shipping needs a different threshold. Each rule targets a combination of three conditions and one or more day thresholds:
- Carrier - one, several, or all carriers
- Location - one, several, or all Shopify locations the order ships from
- Destination - one, several, or all destination countries, and the provinces or states within them
- Day(s) - one or more thresholds, such as 15d and 22d
As soon as you add your first rule, the baseline rule is renamed Other conditions and covers only what your specific rules don't: "all carriers, locations, and destinations not specifically configured will be assigned here." You can edit it, or disable it if you only want events for the combinations you have built rules for. It can never be deleted. While Other conditions is enabled, any carrier or location added later is covered by it until you build a rule for that combination.
Rules never overlap. Once a combination is used by one rule, it is unavailable to the others, so options already taken appear disabled while you build a new rule. Every shipment therefore matches exactly one rule, and you never have to think about which rule wins.
Every rule, including Other conditions, has its own Rule ID. See "Using Rule ID in your integrations" below.
How often it's sent
Once per Day(s) threshold in the matched rule, per shipment. A shipment never triggers the same threshold twice.
Example: a rule is set to 15d and 22d. When transit time reaches 15 days, an event is sent. When it reaches 22 days, a second event is sent. Transit time counts up from pickup and never resets, so a shipment moves through the thresholds of a rule in one direction only.
Which shipments it applies to
Shipments whose order was created after both of the following, whichever happened later:
- the time you turned Shipment transit delay on
- the time the matching rule was created
Editing a rule does not change its starting point; only creating one does. For Other conditions, the starting point is the time you turned the event on, or the last time you re-enabled the rule, whichever is later. If you turn the event off and back on, the most recent time counts.
How to set it up
- Click Add rule. Choose the carriers, locations, and destinations you want to target. Options already used by another rule are disabled.
- Enter one or more Day(s) thresholds. Each threshold must be larger than the one before it.
- Save the rule, then repeat for any other combination you want to treat differently.
- Edit Other conditions to set the threshold for everything else.
- Turn on Shipment transit delay.
Configuration examples
A. USPS within the United States
Carrier: USPS / Location: your US warehouse / Destination: United States / Day(s): 8d
Domestic ground service usually delivers within a few days, so a short threshold catches problems early without false alarms.
B. YunExpress to Europe, escalating
Carrier: YunExpress / Location: your international warehouse / Destination: Germany, France, Spain, Italy / Day(s): 15d, 22d
Cross-border lines take longer and vary more, so two thresholds let you change your message as the delay grows. At 15 days you reassure the customer the package is still moving. At 22 days you reach out with real support, before the customer opens a ticket.
C. Everything else
Other conditions / Day(s): 20d
A deliberately loose threshold so unusual routes are still caught without flooding you with alerts.
Example workflows in Klaviyo
Each event carries the Rule ID of the rule that sent it and the shipment's transit_time, so you can build one flow per threshold and change your message as the delay grows.
Using the YunExpress rule from example B above, set to 15d and 22d with Rule ID 68PCTN7K:
Reassurance at 15 days
- Trigger: CWILL Tracking - Shipment transit delay
- Filter: rule_id equals 68PCTN7K AND transit_time equals 15
- Send: A "still on its way" email naming the carrier, linking to the tracking page
Proactive support at 22 days
- Trigger: CWILL Tracking - Shipment transit delay
- Filter: rule_id equals 68PCTN7K AND transit_time equals 22
- Send: An apology that acknowledges the delay, with a direct reply-to for support
If you later change a threshold in the rule, update the matching value in your flow filters so they keep firing.
Shipment stalled
When it's triggered
Triggered when a shipment shows no tracking updates after reaching the predefined number of days.
| Residence time | The number of days since the last tracking info update |
- A shipment triggers the event when its residence time is greater than or equal to a Day(s) threshold in the rule it matches.
- Shipments that are already delivered never trigger this event.
How rules work
Before you create anything, the rule list already contains one rule covering All status and All carriers. That is your baseline: turn the event on and every undelivered shipment triggers the event once it has gone without a tracking update for the number of days set there.
Add a rule when a particular status or carrier needs different timing. Each rule targets a combination of two conditions and one or more day thresholds:
- Status - one, several, or all shipment statuses. You can also select individual sub-statuses, shown as "In transit (6 of 7 sub-status)"
- Carrier - one, several, or all carriers
- Day(s) - one or more thresholds, such as 3d, 8d, and 14d
As soon as you add your first rule, the baseline rule becomes Other conditions and covers "all status and carriers not specifically configured." You can edit it, or disable it if you only want events for the combinations you have built rules for. It can never be deleted. While Other conditions is enabled, any carrier added later is covered by it until you build a rule for it.
Rules never overlap. Once a combination is used by one rule, it is unavailable to the others, so options already taken appear disabled while you build a new rule. Every shipment therefore matches exactly one rule, and you never have to think about which rule wins.
Every rule, including Other conditions, has its own Rule ID. See "Using Rule ID in your integrations" below.
How often it's sent
Once per Day(s) threshold in the matched rule, per shipment. A shipment never triggers the same threshold twice.
Residence time resets every time a new tracking update arrives, and the count starts over. A threshold the shipment has already triggered does not trigger again after the reset; the higher thresholds simply take longer to reach.
Example: a rule is set to 3d, 8d, and 14d. A shipment goes quiet and triggers 3d on day three, then 8d on day eight. On day ten the carrier scans it, and residence time starts over. The shipment must now stay quiet until residence time reaches 14 before 14d triggers, and 3d and 8d never trigger again.
Which shipments it applies to
Shipments whose order was created after both of the following, whichever happened later:
- the time you turned Shipment stalled on
- the time the matching rule was created
Editing a rule does not change its starting point; only creating one does. For Other conditions, the starting point is the time you turned the event on, or the last time you re-enabled the rule, whichever is later. If you turn the event off and back on, the most recent time counts.
How to set it up
- Click Add rule. Choose the statuses and carriers you want to target. Options already used by another rule are disabled.
- Enter one or more Day(s) thresholds. Each threshold must be larger than the one before it.
- Save the rule, then repeat for any other combination you want to treat differently.
- Edit Other conditions to set the threshold for everything else.
- Turn on Shipment stalled.
Configuration examples
A. Uncollected La Poste pickups, escalating reminders
Status: Ready for pickup / Carrier: La Poste / Day(s): 3d, 8d, 14d
Carriers return uncollected parcels to the sender at their own cutoff, so escalating reminders give customers several chances to collect before you are left with a return to process and refund.
B. Everything else
Other conditions / Day(s): 5d
A single threshold that covers every other status and carrier, so a shipment going quiet anywhere in your operation still reaches you.
Example workflows in Klaviyo
Each event carries the Rule ID of the rule that sent it and the shipment's residence_time. Using the La Poste rule from example A above, set to 3d, 8d, and 14d with Rule ID C2FK2JNK, three escalating messages come from one rule:
First reminder
- Trigger: CWILL Tracking - Shipment stalled
- Filter: rule_id equals C2FK2JNK AND residence_time equals 3
- Send: A friendly note with the pickup location
Second reminder
- Trigger: CWILL Tracking - Shipment stalled
- Filter: rule_id equals C2FK2JNK AND residence_time equals 8
- Send: A reminder that names the collection deadline
Final notice
- Trigger: CWILL Tracking - Shipment stalled
- Filter: rule_id equals C2FK2JNK AND residence_time equals 14
- Send: A warning that the carrier will return the parcel
The residence_time value is what tells the three flows apart.
If you later change a threshold in the rule, update the matching value in your flow filters so they keep firing.
Using Rule ID in your integrations
Every rule for Shipment transit delay and Shipment stalled has a Rule ID, a short code such as 68PCTN7K, shown in the first column of the rule list. It is included with every event that rule sends. Your own Rule IDs will be different.
Rule ID saves you from rebuilding your rules a second time. Without it, a rule covering YunExpress shipments from your international warehouse to four destination countries would have to be recreated as a long list of conditions inside your automation tool, and kept in sync every time you changed it. With Rule ID, you filter on one value and the targeting stays in CWILL Tracking, where you manage it. When you change which conditions a rule covers, its Rule ID does not change, so your automation keeps working without edits.
To use it, copy the Rule ID from the rule list, then add a filter in your automation tool that matches it. In Klaviyo it arrives as rule_id and works as a trigger filter. The equivalent field is available in every integration that receives these events.
Pair rule_id with transit_time or residence_time when you want a different message at each threshold of the same rule; see the Klaviyo examples above.
Shipment status update, Shipment sub-status update, and Post-purchase EDD expired do not use rules, so their Rule ID is always empty.
Need help? Feel free to contact us via online chat or email, our world-class 24/7 support team is always glad to help you ð§