New webhook event — pickup.vehicle_location.changed

Retailers can now subscribe to pickup.vehicle_location.changed to receive real-time vehicle position updates while a delivery is in transit. The pickup_status.changed payload has also been extended with an optional vehicle_location field for subscribers to the new event.

Added

pickup.vehicle_location.changed webhook event

Fired on two triggers while a delivery is in the active window (EN_ROUTE_TO_STORE through EN_ROUTE_TO_CUSTOMER):

  1. Movement-driven — the vehicle has moved approximately 50 meters since the previous emit.
  2. Heartbeat — at least 60 seconds have passed since the previous emit, even if the vehicle is stationary.

The event stops firing automatically once the delivery transitions to a terminal status (ARRIVED_AT_CUSTOMER, COMPLETED, FAILED, CANCELLED). No per-delivery cleanup is required on your end.

Payload:

1{
2 "event": "pickup.vehicle_location.changed",
3 "timestamp": "2026-05-11T15:00:30Z",
4 "data": {
5 "external_delivery_id": "ACME-12345",
6 "vehicle_location": {
7 "latitude": 30.2672,
8 "longitude": -97.7431,
9 "recorded_at": "2026-05-11T15:00:28Z"
10 }
11 }
12}

Subscribe by including the event in your registration or update call:

$curl -X PUT https://api.goautolane.com/dd/v1/webhooks \
> -H "Authorization: Bearer YOUR_API_KEY" \
> -H "Content-Type: application/json" \
> -d '{
> "events": [
> "pickup_status.changed",
> "tracking_link.created",
> "pickup.vehicle_location.changed"
> ]
> }'

Changed

pickup_status.changed now includes optional vehicle_location

If your webhook is subscribed to pickup.vehicle_location.changed, the pickup_status.changed payload now includes a vehicle_location field with the vehicle’s position at the moment of the status transition. The field is either an object (fresh fix within the last 5 minutes), null (subscribed but no fresh fix or no vehicle assigned yet), or omitted entirely (not subscribed to the location event).

1{
2 "event": "pickup_status.changed",
3 "timestamp": "2026-05-11T15:00:30Z",
4 "data": {
5 "external_delivery_id": "ACME-12345",
6 "status": "ARRIVED_AT_STORE",
7 "previous_status": "EN_ROUTE_TO_STORE",
8 "estimated_arrival": "2026-05-11T15:30:00Z",
9 "customer": { "phone": "+15551234567" },
10 "delivery_address": {
11 "street": "123 Main St",
12 "city": "Austin",
13 "state": "TX",
14 "zip": "78701"
15 },
16 "vehicle_location": {
17 "latitude": 30.2672,
18 "longitude": -97.7431,
19 "recorded_at": "2026-05-11T14:59:58Z"
20 }
21 }
22}

This is a non-breaking, additive change — existing integrations that haven’t subscribed to pickup.vehicle_location.changed see no change in payload shape.

Notes

  • Webhook delivery is at-least-once with no cross-type ordering guarantee. A pickup.vehicle_location.changed event may arrive shortly after a terminal pickup_status.changed for the same delivery — reconcile via the timestamp field rather than receive-order.
  • recorded_at inside vehicle_location may lag the outer event timestamp by a few seconds (it reflects when the GPS sample was taken on-vehicle, not when the webhook fired).