Skip to main content

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_id integer

    The recall's id. Fetch it with GET /recalls/{id}/.

  • medicine_name string

    The recalled product.

  • batch_number string

    The recalled batch.

  • reason string

    The recall reason code.

  • severity_class string

    CLASS_I, CLASS_II, CLASS_III or CAUTION_IN_USE.

  • trigger_type string

    VOLUNTARY or STATUTORY.

  • instructions string

    What facilities should do.

  • initiated_at datetime

    When the recall was opened.

Example body
{
  "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_id integer

    The recall's id.

  • schema_name string

    The facility that was notified again.

  • pharmacy_name string

    That facility's name.

  • escalation_count integer

    How many times it has been notified again.

Example body
{
  "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_id integer

    The recall's id.

  • batch_number string

    The recalled batch.

  • schema_name string

    The facility that acknowledged.

  • pharmacy_name string

    That facility's name.

  • acknowledged_at datetime

    When it acknowledged.

  • acknowledged_by_name string

    Who acknowledged.

  • quantity_on_hand_at_recall integer

    Units it held when the recall was issued.

  • quantity_recovered integer or null

    Units it recovered, if recorded.

Example body
{
  "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_id integer

    The recall's id.

  • batch_number string

    The recalled batch.

Example body
{
  "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_id integer

    DawaTrack's id for this order.

  • po_number string

    The facility's purchase order number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    SENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.

  • order_date date

    When the order was raised.

  • expected_delivery date or null

    The delivery date the facility asked for.

  • total_amount string

    Order total, as a decimal string.

  • currency string

    Always KES.

  • confirmed_delivery_date date or null

    The delivery date you declared.

  • carrier_name string

    The carrier you declared.

  • tracking_reference string

    The tracking reference you declared.

  • supplier_notes string

    Your notes on the order.

  • items array of objects

    One per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.

Example body
{
  "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_id integer

    DawaTrack's id for this order.

  • po_number string

    The facility's purchase order number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    SENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.

  • order_date date

    When the order was raised.

  • expected_delivery date or null

    The delivery date the facility asked for.

  • total_amount string

    Order total, as a decimal string.

  • currency string

    Always KES.

  • confirmed_delivery_date date or null

    The delivery date you declared.

  • carrier_name string

    The carrier you declared.

  • tracking_reference string

    The tracking reference you declared.

  • supplier_notes string

    Your notes on the order.

  • items array of objects

    One per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.

Example body
{
  "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_id integer

    DawaTrack's id for this order.

  • po_number string

    The facility's purchase order number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    SENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.

  • order_date date

    When the order was raised.

  • expected_delivery date or null

    The delivery date the facility asked for.

  • total_amount string

    Order total, as a decimal string.

  • currency string

    Always KES.

  • confirmed_delivery_date date or null

    The delivery date you declared.

  • carrier_name string

    The carrier you declared.

  • tracking_reference string

    The tracking reference you declared.

  • supplier_notes string

    Your notes on the order.

  • items array of objects

    One per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.

  • reason string

    Your reason, or an empty string.

Example body
{
  "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_id integer

    DawaTrack's id for this order.

  • po_number string

    The facility's purchase order number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    SENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.

  • order_date date

    When the order was raised.

  • expected_delivery date or null

    The delivery date the facility asked for.

  • total_amount string

    Order total, as a decimal string.

  • currency string

    Always KES.

  • confirmed_delivery_date date or null

    The delivery date you declared.

  • carrier_name string

    The carrier you declared.

  • tracking_reference string

    The tracking reference you declared.

  • supplier_notes string

    Your notes on the order.

  • items array of objects

    One per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.

Example body
{
  "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_id integer

    DawaTrack's id for this order.

  • po_number string

    The facility's purchase order number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    SENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.

  • order_date date

    When the order was raised.

  • expected_delivery date or null

    The delivery date the facility asked for.

  • total_amount string

    Order total, as a decimal string.

  • currency string

    Always KES.

  • confirmed_delivery_date date or null

    The delivery date you declared.

  • carrier_name string

    The carrier you declared.

  • tracking_reference string

    The tracking reference you declared.

  • supplier_notes string

    Your notes on the order.

  • items array of objects

    One per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.

Example body
{
  "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_id integer

    DawaTrack's id for this order.

  • po_number string

    The facility's purchase order number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    SENT, CONFIRMED, CANCELLED, PARTIALLY_RECEIVED or RECEIVED.

  • order_date date

    When the order was raised.

  • expected_delivery date or null

    The delivery date the facility asked for.

  • total_amount string

    Order total, as a decimal string.

  • currency string

    Always KES.

  • confirmed_delivery_date date or null

    The delivery date you declared.

  • carrier_name string

    The carrier you declared.

  • tracking_reference string

    The tracking reference you declared.

  • supplier_notes string

    Your notes on the order.

  • items array of objects

    One per line: po_item_id, medicine_name, supplier_sku, quantity_ordered, quantity_confirmed, unit_price, declared_batch_number, declared_expiry_date.

  • received_items array of objects

    One per line: po_item_id and quantity_received.

Example body
{
  "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_id integer

    DawaTrack's id for this invoice.

  • invoice_number string

    The invoice number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    PENDING, PARTIAL, PAID, OVERDUE or DISPUTED.

  • invoice_date date

    The invoice date.

  • due_date date

    When payment is due.

  • total_amount string

    Invoice total, as a decimal string.

  • amount_paid string

    Paid so far, as a decimal string.

  • balance_due string

    Still owed, as a decimal string.

  • currency string

    Always KES.

  • last_payment_date date or null

    Date of the latest payment.

  • last_payment_method string

    Method of the latest payment.

  • last_payment_reference string

    Reference of the latest payment, to match against your statement.

Example body
{
  "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_id integer

    DawaTrack's id for this invoice.

  • invoice_number string

    The invoice number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • status string

    PENDING, PARTIAL, PAID, OVERDUE or DISPUTED.

  • invoice_date date

    The invoice date.

  • due_date date

    When payment is due.

  • total_amount string

    Invoice total, as a decimal string.

  • amount_paid string

    Paid so far, as a decimal string.

  • balance_due string

    Still owed, as a decimal string.

  • currency string

    Always KES.

  • last_payment_date date or null

    Date of the latest payment.

  • last_payment_method string

    Method of the latest payment.

  • last_payment_reference string

    Reference of the latest payment, to match against your statement.

Example body
{
  "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_id integer

    DawaTrack's id for this return.

  • return_number string

    The facility's return number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • medicine_name string

    The product returned.

  • batch_number string

    The batch returned.

  • quantity integer

    Units returned.

  • reason string

    The return reason code.

  • reason_display string

    The return reason, in words.

  • notes string

    The facility's notes.

  • status string

    SHIPPED or CONFIRMED.

  • shipped_at datetime or null

    When the facility shipped it.

  • confirmed_at datetime or null

    When it was confirmed.

  • credit_note_reference string

    Your credit note reference, once confirmed.

Example body
{
  "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_id integer

    DawaTrack's id for this return.

  • return_number string

    The facility's return number.

  • schema_name string

    The facility's identifier on DawaTrack.

  • pharmacy_name string

    The facility's name.

  • medicine_name string

    The product returned.

  • batch_number string

    The batch returned.

  • quantity integer

    Units returned.

  • reason string

    The return reason code.

  • reason_display string

    The return reason, in words.

  • notes string

    The facility's notes.

  • status string

    SHIPPED or CONFIRMED.

  • shipped_at datetime or null

    When the facility shipped it.

  • confirmed_at datetime or null

    When it was confirmed.

  • credit_note_reference string

    Your credit note reference, once confirmed.

Example body
{
  "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.

  • consignment object

    The 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.

Example body
{
  "consignment": ""
}

consignment.not_confirmed

A receiver outside DawaTrack hasn't answered 7 days after the consignment left. Sent once.

  • consignment object

    The 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.

Example body
{
  "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.