Webhook events
Every event you can subscribe to, when it's sent, who receives it, and what its body contains.
Amounts are decimal strings and dates are ISO 8601. New fields may be added to a payload, so ignore fields you don't recognise.
Recalls
Sent to the manufacturer that owns the recall, and to distributor and pharmacy partners linked to an affected facility.
recall.issued
A recall is opened, through the API or the supplier portal.
-
recall_idintegerThe recall's id. Fetch it with GET /recalls/{id}/.
-
medicine_namestringThe recalled product.
-
batch_numberstringThe recalled batch.
-
reasonstringThe recall reason code.
-
severity_classstringCLASS_I, CLASS_II, CLASS_III or CAUTION_IN_USE.
-
trigger_typestringVOLUNTARY or STATUTORY.
-
instructionsstringWhat facilities should do.
-
initiated_atdatetimeWhen the recall was opened.
{
"recall_id": 42,
"medicine_name": "Amoxicillin 500 mg capsules",
"batch_number": "BTH-2026-041",
"reason": "CONTAMINATION",
"severity_class": "CLASS_II",
"trigger_type": "VOLUNTARY",
"instructions": "Quarantine the batch and await collection instructions.",
"initiated_at": "2026-10-10T09:00:00Z"
}
recall.escalated
A facility hasn't acknowledged within its severity window and is notified again.
-
recall_idintegerThe recall's id.
-
schema_namestringThe facility that was notified again.
-
pharmacy_namestringThat facility's name.
-
escalation_countintegerHow many times it has been notified again.
{
"recall_id": 42,
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"escalation_count": 42
}
recall.acknowledged
One facility acknowledged the recall. Sent for each facility.
-
recall_idintegerThe recall's id.
-
batch_numberstringThe recalled batch.
-
schema_namestringThe facility that acknowledged.
-
pharmacy_namestringThat facility's name.
-
acknowledged_atdatetimeWhen it acknowledged.
-
acknowledged_by_namestringWho acknowledged.
-
quantity_on_hand_at_recallintegerUnits it held when the recall was issued.
-
quantity_recoveredinteger or nullUnits it recovered, if recorded.
{
"recall_id": 42,
"batch_number": "BTH-2026-041",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"acknowledged_at": "2026-10-10T09:00:00Z",
"acknowledged_by_name": "",
"quantity_on_hand_at_recall": 1284,
"quantity_recovered": 1284
}
hold.lifted
Every facility affected by the recall has acknowledged it.
-
recall_idintegerThe recall's id.
-
batch_numberstringThe recalled batch.
{
"recall_id": 42,
"batch_number": "BTH-2026-041"
}
Orders
Sent only to partners linked to the supplier account the order belongs to.
order.created
A facility sends you a purchase order.
-
order_idintegerDawaTrack's id for this order.
-
po_numberstringThe facility's purchase order number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringSENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.
-
order_datedateWhen the order was raised.
-
expected_deliverydate or nullThe delivery date the facility asked for.
-
total_amountstringOrder total, as a decimal string.
-
currencystringAlways KES.
-
confirmed_delivery_datedate or nullThe delivery date you declared.
-
carrier_namestringThe carrier you declared.
-
tracking_referencestringThe tracking reference you declared.
-
supplier_notesstringYour notes on the order.
-
itemsarray of objectsOne per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.
{
"order_id": 42,
"po_number": "PO-000317",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"order_date": "2026-10-10",
"expected_delivery": "2026-10-14",
"total_amount": "45000.00",
"currency": "KES",
"confirmed_delivery_date": "2026-10-14",
"carrier_name": "",
"tracking_reference": "",
"supplier_notes": "",
"items": [
{
"po_item_id": 912,
"medicine_name": "Amoxicillin 500 mg capsules",
"supplier_sku": "AMX500",
"quantity_ordered": 3000,
"quantity_confirmed": null,
"unit_price": "15.00",
"declared_batch_number": "",
"declared_expiry_date": null
}
]
}
order.confirmed
The order is confirmed: accepted in the portal, or confirmed by declaring delivery.
-
order_idintegerDawaTrack's id for this order.
-
po_numberstringThe facility's purchase order number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringSENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.
-
order_datedateWhen the order was raised.
-
expected_deliverydate or nullThe delivery date the facility asked for.
-
total_amountstringOrder total, as a decimal string.
-
currencystringAlways KES.
-
confirmed_delivery_datedate or nullThe delivery date you declared.
-
carrier_namestringThe carrier you declared.
-
tracking_referencestringThe tracking reference you declared.
-
supplier_notesstringYour notes on the order.
-
itemsarray of objectsOne per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.
{
"order_id": 42,
"po_number": "PO-000317",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"order_date": "2026-10-10",
"expected_delivery": "2026-10-14",
"total_amount": "45000.00",
"currency": "KES",
"confirmed_delivery_date": "2026-10-14",
"carrier_name": "",
"tracking_reference": "",
"supplier_notes": "",
"items": [
{
"po_item_id": 912,
"medicine_name": "Amoxicillin 500 mg capsules",
"supplier_sku": "AMX500",
"quantity_ordered": 3000,
"quantity_confirmed": null,
"unit_price": "15.00",
"declared_batch_number": "",
"declared_expiry_date": null
}
]
}
order.rejected
You rejected the order in the portal.
-
order_idintegerDawaTrack's id for this order.
-
po_numberstringThe facility's purchase order number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringSENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.
-
order_datedateWhen the order was raised.
-
expected_deliverydate or nullThe delivery date the facility asked for.
-
total_amountstringOrder total, as a decimal string.
-
currencystringAlways KES.
-
confirmed_delivery_datedate or nullThe delivery date you declared.
-
carrier_namestringThe carrier you declared.
-
tracking_referencestringThe tracking reference you declared.
-
supplier_notesstringYour notes on the order.
-
itemsarray of objectsOne per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.
-
reasonstringYour reason, or an empty string.
{
"order_id": 42,
"po_number": "PO-000317",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"order_date": "2026-10-10",
"expected_delivery": "2026-10-14",
"total_amount": "45000.00",
"currency": "KES",
"confirmed_delivery_date": "2026-10-14",
"carrier_name": "",
"tracking_reference": "",
"supplier_notes": "",
"items": [
{
"po_item_id": 912,
"medicine_name": "Amoxicillin 500 mg capsules",
"supplier_sku": "AMX500",
"quantity_ordered": 3000,
"quantity_confirmed": null,
"unit_price": "15.00",
"declared_batch_number": "",
"declared_expiry_date": null
}
],
"reason": "CONTAMINATION"
}
order.cancelled
The facility cancelled the order.
-
order_idintegerDawaTrack's id for this order.
-
po_numberstringThe facility's purchase order number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringSENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.
-
order_datedateWhen the order was raised.
-
expected_deliverydate or nullThe delivery date the facility asked for.
-
total_amountstringOrder total, as a decimal string.
-
currencystringAlways KES.
-
confirmed_delivery_datedate or nullThe delivery date you declared.
-
carrier_namestringThe carrier you declared.
-
tracking_referencestringThe tracking reference you declared.
-
supplier_notesstringYour notes on the order.
-
itemsarray of objectsOne per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.
{
"order_id": 42,
"po_number": "PO-000317",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"order_date": "2026-10-10",
"expected_delivery": "2026-10-14",
"total_amount": "45000.00",
"currency": "KES",
"confirmed_delivery_date": "2026-10-14",
"carrier_name": "",
"tracking_reference": "",
"supplier_notes": "",
"items": [
{
"po_item_id": 912,
"medicine_name": "Amoxicillin 500 mg capsules",
"supplier_sku": "AMX500",
"quantity_ordered": 3000,
"quantity_confirmed": null,
"unit_price": "15.00",
"declared_batch_number": "",
"declared_expiry_date": null
}
]
}
order.delivery_declared
A delivery was declared, with quantities, date, carrier and tracking reference.
-
order_idintegerDawaTrack's id for this order.
-
po_numberstringThe facility's purchase order number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringSENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.
-
order_datedateWhen the order was raised.
-
expected_deliverydate or nullThe delivery date the facility asked for.
-
total_amountstringOrder total, as a decimal string.
-
currencystringAlways KES.
-
confirmed_delivery_datedate or nullThe delivery date you declared.
-
carrier_namestringThe carrier you declared.
-
tracking_referencestringThe tracking reference you declared.
-
supplier_notesstringYour notes on the order.
-
itemsarray of objectsOne per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.
{
"order_id": 42,
"po_number": "PO-000317",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"order_date": "2026-10-10",
"expected_delivery": "2026-10-14",
"total_amount": "45000.00",
"currency": "KES",
"confirmed_delivery_date": "2026-10-14",
"carrier_name": "",
"tracking_reference": "",
"supplier_notes": "",
"items": [
{
"po_item_id": 912,
"medicine_name": "Amoxicillin 500 mg capsules",
"supplier_sku": "AMX500",
"quantity_ordered": 3000,
"quantity_confirmed": null,
"unit_price": "15.00",
"declared_batch_number": "",
"declared_expiry_date": null
}
]
}
order.received
The facility posted a goods received note.
-
order_idintegerDawaTrack's id for this order.
-
po_numberstringThe facility's purchase order number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringSENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.
-
order_datedateWhen the order was raised.
-
expected_deliverydate or nullThe delivery date the facility asked for.
-
total_amountstringOrder total, as a decimal string.
-
currencystringAlways KES.
-
confirmed_delivery_datedate or nullThe delivery date you declared.
-
carrier_namestringThe carrier you declared.
-
tracking_referencestringThe tracking reference you declared.
-
supplier_notesstringYour notes on the order.
-
itemsarray of objectsOne per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.
-
received_itemsarray of objectsOne per line: po_item_id and quantity_received.
{
"order_id": 42,
"po_number": "PO-000317",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"order_date": "2026-10-10",
"expected_delivery": "2026-10-14",
"total_amount": "45000.00",
"currency": "KES",
"confirmed_delivery_date": "2026-10-14",
"carrier_name": "",
"tracking_reference": "",
"supplier_notes": "",
"items": [
{
"po_item_id": 912,
"medicine_name": "Amoxicillin 500 mg capsules",
"supplier_sku": "AMX500",
"quantity_ordered": 3000,
"quantity_confirmed": null,
"unit_price": "15.00",
"declared_batch_number": "",
"declared_expiry_date": null
}
],
"received_items": [
{
"po_item_id": 912,
"quantity_received": 3000
}
]
}
Invoices
Sent only to partners linked to the supplier account the invoice belongs to.
Frozen. These events are still sent when a facility records an invoice or a payment, but invoices aren't being developed further, and these events may be removed. Don't build new work on them.
invoice.created
A facility recorded your invoice.
-
invoice_idintegerDawaTrack's id for this invoice.
-
invoice_numberstringThe invoice number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringPENDING, PARTIAL, PAID, OVERDUE or DISPUTED.
-
invoice_datedateThe invoice date.
-
due_datedateWhen payment is due.
-
total_amountstringInvoice total, as a decimal string.
-
amount_paidstringPaid so far, as a decimal string.
-
balance_duestringStill owed, as a decimal string.
-
currencystringAlways KES.
-
last_payment_datedate or nullDate of the latest payment.
-
last_payment_methodstringMethod of the latest payment.
-
last_payment_referencestringReference of the latest payment, to match against your statement.
{
"invoice_id": 42,
"invoice_number": "INV-2026-0091",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"invoice_date": "2026-10-10",
"due_date": "2026-10-10",
"total_amount": "45000.00",
"amount_paid": "20000.00",
"balance_due": "25000.00",
"currency": "KES",
"last_payment_date": "2026-10-14",
"last_payment_method": "",
"last_payment_reference": ""
}
invoice.payment_recorded
A facility recorded a payment against your invoice.
-
invoice_idintegerDawaTrack's id for this invoice.
-
invoice_numberstringThe invoice number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
statusstringPENDING, PARTIAL, PAID, OVERDUE or DISPUTED.
-
invoice_datedateThe invoice date.
-
due_datedateWhen payment is due.
-
total_amountstringInvoice total, as a decimal string.
-
amount_paidstringPaid so far, as a decimal string.
-
balance_duestringStill owed, as a decimal string.
-
currencystringAlways KES.
-
last_payment_datedate or nullDate of the latest payment.
-
last_payment_methodstringMethod of the latest payment.
-
last_payment_referencestringReference of the latest payment, to match against your statement.
{
"invoice_id": 42,
"invoice_number": "INV-2026-0091",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"status": "OPEN",
"invoice_date": "2026-10-10",
"due_date": "2026-10-10",
"total_amount": "45000.00",
"amount_paid": "20000.00",
"balance_due": "25000.00",
"currency": "KES",
"last_payment_date": "2026-10-14",
"last_payment_method": "",
"last_payment_reference": ""
}
Returns
Sent only to partners linked to the supplier account the return belongs to.
return.shipped
A facility shipped stock back to you.
-
return_idintegerDawaTrack's id for this return.
-
return_numberstringThe facility's return number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
medicine_namestringThe product returned.
-
batch_numberstringThe batch returned.
-
quantityintegerUnits returned.
-
reasonstringThe return reason code.
-
reason_displaystringThe return reason, in words.
-
notesstringThe facility's notes.
-
statusstringSHIPPED or CONFIRMED.
-
shipped_atdatetime or nullWhen the facility shipped it.
-
confirmed_atdatetime or nullWhen it was confirmed.
-
credit_note_referencestringYour credit note reference, once confirmed.
{
"return_id": 42,
"return_number": "RET-000021",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"medicine_name": "Amoxicillin 500 mg capsules",
"batch_number": "BTH-2026-041",
"quantity": 2600,
"reason": "CONTAMINATION",
"reason_display": "Contamination",
"notes": "",
"status": "OPEN",
"shipped_at": "2026-10-10T09:00:00Z",
"confirmed_at": "2026-10-10T09:00:00Z",
"credit_note_reference": ""
}
return.confirmed
You confirmed the return in the portal.
-
return_idintegerDawaTrack's id for this return.
-
return_numberstringThe facility's return number.
-
schema_namestringThe facility's identifier on DawaTrack.
-
pharmacy_namestringThe facility's name.
-
medicine_namestringThe product returned.
-
batch_numberstringThe batch returned.
-
quantityintegerUnits returned.
-
reasonstringThe return reason code.
-
reason_displaystringThe return reason, in words.
-
notesstringThe facility's notes.
-
statusstringSHIPPED or CONFIRMED.
-
shipped_atdatetime or nullWhen the facility shipped it.
-
confirmed_atdatetime or nullWhen it was confirmed.
-
credit_note_referencestringYour credit note reference, once confirmed.
{
"return_id": 42,
"return_number": "RET-000021",
"schema_name": "pharmacy_a",
"pharmacy_name": "Pharmacy A",
"medicine_name": "Amoxicillin 500 mg capsules",
"batch_number": "BTH-2026-041",
"quantity": 2600,
"reason": "CONTAMINATION",
"reason_display": "Contamination",
"notes": "",
"status": "OPEN",
"shipped_at": "2026-10-10T09:00:00Z",
"confirmed_at": "2026-10-10T09:00:00Z",
"credit_note_reference": ""
}
Consignments
Sent to the partner that sent the consignment, to partners linked to the supplier account that declared it on the portal, or to partners linked to the facility that dispatched it. For a delivery a party outside DawaTrack declared, to whoever recorded that party.
consignment.received
A receiver recorded receiving a line, or reported it short, damaged or refused. One delivery per change: a confirmation of several lines sends one.
-
consignmentobjectThe consignment as GET /consignments/{number}/ returns it: number, biz_transaction, receiver (never its contact), state, and its lines with received, short, damaged, refused and how each was confirmed.
{
"consignment": ""
}
consignment.not_confirmed
A receiver outside DawaTrack hasn't answered 7 days after the consignment left. Sent once.
-
consignmentobjectThe consignment as GET /consignments/{number}/ returns it: number, biz_transaction, receiver (never its contact), state, and its lines with received, short, damaged, refused and how each was confirmed.
{
"consignment": ""
}
Test events
webhook.test is sent only when you call POST /webhooks/{id}/test/. You can't subscribe to it. Its body has message, subscription_id and sent_at.
Partner API v1. The API reference is generated from the API's own code.