container.tracking.stopped
Overview
Fired when tracking for a container has stopped, either because the container's journey reached its final reportable milestone, or because tracking ended early (carrier data stopped, the booking was canceled, or someone stopped tracking manually). changes.completionReason.current tells you why.
Payload Structure
{
"event": "container.tracking.stopped",
"data": { /* full container snapshot, same shape as GET /v1/containers/{containerId} */ },
"changes": {
"completionReason": {
"previous": null,
"current": "reachedLastReportableMilestone"
}
},
"deliveryAttempt": 1,
"pendingRetries": 4,
"sentAt": "2025-07-19T17:00:00.654Z"
}data object
data objectThe full final state of the container at the time tracking was stopped. Same structure as the container status response.
changes object
changes objectContains the completionReason with { previous, current }:
previousis normallynull(the container was actively tracking)currentis one of the values in the table below
The same value is returned as completionReason on the container status response, so you can read it later without storing the webhook.
Completion Reasons
| Completion reason | Description |
|---|---|
reachedLastReportableMilestone | The container reached the last milestone OpenTrack can report for this carrier and mode. Most often EMPTY_RETURNED. Also used where the carrier does not report empty return (after outgate), for tank-container outgates, and some domestic rail moves. |
noUpdatesForLclShipment | No further updates are expected for this LCL shipment. Applies where the carrier reports LCL only through discharge. |
timedOutAtAlternateMilestone | The container stayed on the same post-arrival status for 90 days (30 days for carriers that do not provide active tracking), so tracking was terminated. |
containerStripped | Cargo was unloaded from this container mid-voyage, at a transshipment or destination port. No further tracking updates are expected. The shipment may continue in a different container. |
bookingCanceled | The container's booking was canceled. |
newVoyageHasStarted | The carrier reported this container on a new voyage under a new master bill. |
containerMovedToNewMbl | This container was moved to a different master bill and is tracking there instead. |
trackingCanceled | Tracking was canceled by someone on your team. |
noMoreReports | The carrier stopped returning data for this container on this master bill. |
notFoundAtSsl | The carrier does not return this container on this master bill. |
containerLost | The carrier cannot locate this container and is no longer providing updates. |
containerDamaged | The carrier indicated that this container has been damaged. |
outdatedShipment | This container is an old shipment and is no longer being tracked. |
invalidTradeTypeForAccount | The container's tradeType does not match the trade type enabled on your account. For example, an export on an import-only account. |
Treat this list as open-ended. Handle unrecognized values gracefully rather than failing, and expect occasional historical values on containers tracked long ago.
Common Use Cases
| Use Case | How to Implement |
|---|---|
| Close out shipment records | When tracking stops, mark the shipment as completed in your TMS or ERP system |
| Final snapshot archiving | Capture the final data payload as the definitive record for the completed container |
| Invoice generation | Use the tracking stopped event to trigger invoice creation for completed shipments |
| Clean up active monitoring | Remove the container from your active monitoring dashboard or alert system |
| Separate clean from exceptional endings | Branch on completionReason: reachedLastReportableMilestone is a normal end of journey, while values such as containerLost or bookingCanceled usually need follow-up |
| Completion analytics | Record the completionReason and final status for transit time and lifecycle analytics |
Updated 1 day ago
