Skip to main content

Webhooks for parcel orders

Webhooks enable near-real-time information flow from DoorDash and our drivers to your application and your customers. With webhooks, you can enable real-time scenarios like a map view showing your customers how far away their driver is, push notifications telling your customers the latest status of their order, and much more.

API: Drive

This doc covers the Drive API. If you're using the Drive (classic) API, see the reference guide for Drive (classic) webhooks.

Eventsโ€‹

All parcelsโ€‹

DoorDash Developer sends webhooks for the following events, as soon as the event takes place:

  • PARCEL_LABELED: The first time a parcel with this barcode is created in the DoorDash system
  • PARCEL_SCANNED: The first time the parcel is received at its destination facility
  • DASHER_PICKED_UP: A delivery driver has scanned and confirmed pickup of this package.
  • DASHER_CONFIRMED_DROPOFF_ARRIVAL: The driver has confirmed that they arrived at the dropoff location.
  • DASHER_DROPPED_OFF: The driver has dropped off the delivery at the dropoff location and the delivery is complete.

Parcels with mid-mile hopsโ€‹

For parcels that arrive and depart mid mile facilities along the way to a destination facility, these events are fired for each mid-mile facility:

  • PARCEL_ORIGIN_ARRIVED: When a driver arrives at the merchant's origin facility for pickup.
  • PARCEL_ORIGIN_PICKED_UP: When the parcel has left the merchant's origin facility, confirmed by a scan.
  • PARCEL_MID_MILE_ARRIVED: The first time a parcel has arrived at a DashLink regional facility, confirmed by a scan.
  • PARCEL_MID_MILE_DEPARTED: When the parcel has left its current regional facility and on the way to the next facility.

Parcels with failed delivery attemptsโ€‹

A parcel delivery attempt may not always be successful, in which case the driver may choose to try again or return to the DoorDash facility. When parcels are received back at the facility after a failed attempt, they may have another delivery attempt scheduled or be sent back to merchant if it is undeliverable. These parcels may generate the following events:

  • DASHER_ATTEMPTED_DELIVERY: The driver was unable to deliver your delivery to the dropoff location.
  • PARCEL_RECEIVED_TO_REDELIVER: The package was received back at the facility and will be attempted again shortly.
  • PARCEL_RETURN_TO_MERCHANT: The package was received at the facility and being returned to merchant.

Webhooks DASHER_ATTEMPTED_DELIVERY, PARCEL_RECEIVED_TO_REDELIVER, and PARCEL_RETURN_TO_MERCHANT contain either a return_reason or undeliverable_reason_code indicating why the delivery attempt failed.

Only PARCEL_RETURN_TO_MERCHANT and PARCEL_LOST_IN_TRANSIT should be considered a terminal undeliverable state, where a customer refund can be issued.

Parcels with exception statusesโ€‹

A parcel delivery may also be in an exception status state, in which the following events detail the exception state at that point:

  • PARCEL_DELAYED: The package was delayed after being scanned at a DashLink facility.
  • PARCEL_AWAITING: The package was delayed before being scanned at DashLink facility, for example if it was not shipped on time to DashLink by the origin warehouse.
  • PARCEL_LOST_IN_TRANSIT: The package was lost after being received at a DashLink facility.

Fieldsโ€‹

Webhooks contain all of the details about a delivery that are available when the webhook is sent. If a field is empty or not available, the field is not sent in the webhook body. For example, pickup_time_actual is not included in webhook payloads until the delivery has been picked up by the Dasher. Your code should always check if a field is present before accessing it.

Field nameDescriptionfield available in webhook event
contactlessWhether the delivery was contactless or normalAll events
created_atWhen the webhook was createdAll events
currencyThe currency of order_value, fee, and tip in cents (see list below)All events
dasher_idThe unique identifier for the driver; example: 123212.All events
dasher_nameThe first name and last initial of the driver delivering the order; example: John D.All events
dasher_dropoff_phone_numberThe phone number of the driver for the dropoff contact to use; number is masked for privacyAll events
dasher_pickup_phone_numberThe phone number of the driver for the pickup contact to use; number is masked for privacyAll events
dasher_locationLatitude and longitude of the driver.All events
dasher_vehicle_makeMake of the driver's vehicleAll events
dasher_vehicle_modelModel of the driver's vehicleAll events
dasher_vehicle_yearYear of the driver's vehicleAll events
dropoff_addressWhere the delivery will be dropped offAll events
dropoff_contact_family_nameFamily name of the contact.All events
dropoff_contact_given_nameGiven name of the contact.All events
dropoff_contact_send_notificationsWhether the contact will receive notifications from DoorDash for this delivery; default is falseAll events
dropoff_instructionsInstructions for the driver to follow when dropping off the orderAll events
dropoff_phone_numberThe phone number for the driver to call in case of problems with pickupAll events
dropoff_time_actualWhen the delivery was dropped offAll events after and including DASHER_DROPPED_OFF
dropoff_time_estimatedWhen the delivery is estimated to be dropped offAll events
dropoff_verification_image_urlThe verification image taken by the driver when the order was dropped offAll events after and including DASHER_DROPPED_OFF
dropoff_signature_image_urlThe signature image obtained from customer when the order was dropped off if applicable.All events after and including DASHER_DROPPED_OFF
event_nameThe event that triggered the webhook (see list above)All events
external_delivery_idThe ID provided when the delivery was createdAll events
feeThe delivery feeds charged by DoorDashAll events
order_valueThe value of all the items in the orderAll events
parcel_awaiting_reasonWhy the delivery was delayed before being scanned at a DashLink facilityOnly the PARCEL_AWAITING event
parcel_delayed_reasonWhy the delivery was delayed after being scanned at a DashLink facilityOnly the PARCEL_DELAYED event
pickup_addressWhere the delivery will be picked upAll events
pickup_instructionsInstructions for the driver to follow when picking up the orderAll events
pickup_phone_numberThe phone number for the driver to call in case of problems with pickupAll events
pickup_reference_tagA piece of information that can help the driver identify the correct delivery item to pick upAll events
Use this field to link together the original order + redelivery attempts
pickup_external_business_idThe string identifier used to create your business. Used in combination with pickup_external_store_id to select the pick up locationAll events
pickup_external_store_idThe string identifier used to create your storeAll events
pickup_time_actualWhen the delivery was picked upAll events after and including DASHER_DROPPED_OFF
pickup_time_estimatedWhen the delivery is estimated to be picked upAll events
pickup_verification_image_urlThe verification image taken by the driver when the order was picked up; only sent for peer-to-peer ordersAll events after and including DASHER_DROPPED_OFF
return_reasonWhy the delivery attempt was unsuccessfulOnly the PARCEL_RECEIVED_TO_REDELIVER, PARCEL_RETURN_TO_MERCHANT events
support_referenceAn identifer you can use if talking to DoorDash support about this orderAll events
tipThe amount to tip the driverAll events
tracking_urlThe DoorDash Merchant Portal URL that you can use to track the deliveryAll events
undeliverable_reason_additional_detailsAdditional details provided by the driver on why the delivery attempt was unsuccesfulOnly the DASHER_ATTEMPTED_DELIVERY event
undeliverable_reason_codeWhy the delivery attempt was unsuccessfulOnly the DASHER_ATTEMPTED_DELIVERY event
updated_atTimestamp when the delivery info was updated.All events
descriptionA user-friendly display string in english explaining the webhook event, meant to show to customers on a tracking page.All events

Return and undeliverable reasonsโ€‹

Use this table to learn more about the return reason and undeliverable reason you received in your webhooks.

ReasonReason Comments
missing_unit_gate_codeRunner is unable to access apartment because of missing gate code or drop off instructions
cant_find_apartment_unitRunner unable to find the specific apartment number or safe drop off location
business_closedCommercial business closed and runner is unable to leave package in safe location.
incorrect_addressIncorrect address location or the address could be inaccessible such as a military base
technology_issueUnable to complete delivery because of an runner app bug
route_abandonedRoute too long or late runner returned back to sortation center
recipient_refusedPackage refused by recipient
emergencyWeather, safety, or runner related emergency
otherRunner put in a custom reason, does not know the reason, or language barrier

Delayed and awaiting reasonsโ€‹

Use this table to learn more about the delayed reason and awaiting reason you received in your webhooks.

ReasonReason CommentsReason Type
missing_from_truckPackage is missing from a truck, where awaiting indicates it's missing from a merchant truckDelayed/Awaiting
driver_unassignedPackage is unassigned from a driverDelayed
misplaced_at_sortationPackage misplaced at a sortation siteDelayed
otherOther reason that is not currently supported or mappedDelayed/Awaiting

Data formatsโ€‹

All ..._time_... fields are sent as ISO-8601 date and times and are therefore sent in the UTC time zone.

Retriesโ€‹

DoorDash sends each webhook event up to 3 times. In other words, when DoorDash sends a webhook, if we receive a response other than 200 OK or no response at all, we try to send it 2 more times.

Example webhook payloadsโ€‹

{
"created_at": "2024-08-07T15:10:53.257097Z",
"event_name": "PARCEL_LABELED",
"external_delivery_id": "DDNAP5V14ZOD5L6JA",
"dasher_name": "",
"pickup_address": "16270 Raymer Street, Los Angeles, CA 91406",
"pickup_phone_number": "+18559731040",
"pickup_instructions": "",
"pickup_reference_tag": "DDNAP5V14ZOD5L6JA",
"pickup_external_business_id": "DoorDash",
"pickup_external_store_id": "LAV-1",
"dropoff_address": "1201 3rd Avenue, Seattle, WA 98101",
"dropoff_phone_number": "+18559731040",
"dropoff_instructions": "please take it to floor 21",
"dropoff_contact_given_name": "John",
"dropoff_contact_family_name": "Doe",
"dropoff_contact_send_notifications": true,
"order_value": 15120,
"currency": "USD",
"pickup_time_estimated": "2024-08-10T03:08:25.000000Z",
"dropoff_time_estimated": "2024-08-10T03:49:00.000000Z",
"fee": 1200,
"tip": 0,
"support_reference": "1343594362",
"tracking_url": "https://track.doordash.com/order/DDNAP5V14ZOD5L6JA/track?origin=drive_webhook_v2",
"contactless": true,
"updated_at": "2024-08-07T15:10:37.826741Z",
"description":"Your package has a shipping label and being prepared to ship."
}


{
"created_at": "2024-08-07T14:39:18.153802Z",
"event_name": "PARCEL_SCANNED",
"external_delivery_id": "DDNAP5V14ZOD5L6JA",
"dasher_name": "",
"pickup_address": "16270 Raymer Street, Los Angeles, CA 91406",
"pickup_phone_number": "+18559731040",
"pickup_instructions": "",
"pickup_reference_tag": "DDNAP5V14ZOD5L6JA",
"pickup_external_business_id": "DoorDash",
"pickup_external_store_id": "LAV-1",
"dropoff_address": "1201 3rd Avenue, Seattle, WA 98101",
"dropoff_phone_number": "+18559731040",
"dropoff_instructions": "please take it to floor 21",
"dropoff_contact_given_name": "John",
"dropoff_contact_family_name": "Doe",
"dropoff_contact_send_notifications": true,
"order_value": 15120,
"currency": "USD",
"pickup_time_estimated": "2024-08-08T03:10:24.000000Z",
"dropoff_time_estimated": "2024-08-08T03:49:00.000000Z",
"fee": 1200,
"tip": 0,
"support_reference": "1343594362",
"tracking_url": "https://track.doordash.com/order/DDNAP5V14ZOD5L6JA/track?origin=drive_webhook_v2",
"contactless": true,
"updated_at": "2024-08-07T14:39:17.936039Z",
"package_location":{
"city":"Los Angeles",
"state":"CA",
"zip_code":"91406",
"timezone":"US/Pacific"
},
"description":"Your package was received at a local facility and will go out for delivery shortly."
}


{
"created_at": "2024-08-07T08:35:41.935429Z",
"event_name": "DASHER_DROPPED_OFF",
"external_delivery_id": "DDNAP5V14ZOD5L6JA",
"dasher_id": 14293861,
"dasher_name": "TAS-DASHER-54 T.",
"dasher_phone_number": "+19452623875",
"dasher_dropoff_phone_number": "+19452623875",
"dasher_pickup_phone_number": "+16284660361",
"dasher_location": {
"lat": 30.4674176,
"lng": -97.6781026
},
"dasher_vehicle_make": "",
"dasher_vehicle_model": "",
"dasher_vehicle_year": "",
"pickup_address": "16270 Raymer Street, Los Angeles, CA 91406",
"pickup_phone_number": "+18559731040",
"pickup_instructions": "",
"pickup_reference_tag": "DDNAP5V14ZOD5L6JA",
"pickup_external_business_id": "DoorDash",
"pickup_external_store_id": "LAV-1",
"dropoff_address": "1201 3rd Avenue, Seattle, WA 98101",
"dropoff_phone_number": "+18559731040",
"dropoff_instructions": "please take it to floor 21",
"dropoff_contact_given_name": "John",
"dropoff_contact_family_name": "Doe",
"dropoff_contact_send_notifications": false,
"order_value": 15120,
"currency": "USD",
"pickup_time_estimated": "2024-08-07T08:35:39.000000Z",
"pickup_time_actual": "2024-08-07T08:35:39.039191Z",
"dropoff_time_estimated": "2024-08-08T18:50:00.000000Z",
"dropoff_time_actual": "2024-08-07T08:35:41.634432Z",
"fee": 1200,
"tip": 0,
"support_reference": "DDNAP5V14ZOD5L6JA",
"tracking_url": "https://track.doordash.com/order/2743268f-ae39-4863-93ee-fafa5ad02b90/track?origin=drive_webhook_v2",
"contactless": true,
"updated_at": "2024-08-07T08:32:49.035916Z",
"dropoff_verification_image_url": "https://developer.doordash.com/en-US/img/simulator/frontdoor.png",
"package_location": {
"city": "",
"state": "",
"zip_code": "",
"timezone": "US/Pacific"
},
"description":"Your package has been delivered."
}