Webhook Event Types
Complete list of webhook events sent by Courimax.
Order Events
order.created
Triggered when a new order is created.
{
"id": "event-uuid",
"event": "order.created",
"payload": {
"id": "order-uuid",
"status": "pending",
"externalRef": "YANGO-ORDER-123",
"pickupAddress": "Rothschild Blvd 1, Tel Aviv",
"dropoffAddress": "Dizengoff Center, Tel Aviv",
"recipientName": "Jane Doe",
"recipientPhone": "+972501234567",
"packageSize": "small",
"createdAt": "2026-08-19T10:00:00.000Z"
},
"at": "2026-08-19T10:00:00.000Z"
}
order.assigned
Triggered when a driver is assigned to an order.
{
"id": "event-uuid",
"event": "order.assigned",
"payload": {
"id": "order-uuid",
"status": "assigned",
"externalRef": "YANGO-ORDER-123",
"driver": {
"id": "driver-uuid",
"name": "David Cohen",
"phone": "+972501234567"
},
"assignedAt": "2026-08-19T10:05:00.000Z"
},
"at": "2026-08-19T10:05:00.000Z"
}
order.picked_up
Triggered when the driver picks up the package.
{
"id": "event-uuid",
"event": "order.picked_up",
"payload": {
"id": "order-uuid",
"status": "picked_up",
"externalRef": "YANGO-ORDER-123",
"driver": {
"id": "driver-uuid",
"name": "David Cohen"
},
"pickedUpAt": "2026-08-19T10:15:00.000Z"
},
"at": "2026-08-19T10:15:00.000Z"
}
order.in_transit
Triggered when the package is in transit to the destination.
{
"id": "event-uuid",
"event": "order.in_transit",
"payload": {
"id": "order-uuid",
"status": "in_transit",
"externalRef": "YANGO-ORDER-123",
"driver": {
"id": "driver-uuid",
"name": "David Cohen"
},
"driverLocation": {
"latitude": 32.07,
"longitude": 34.78
},
"inTransitAt": "2026-08-19T10:20:00.000Z"
},
"at": "2026-08-19T10:20:00.000Z"
}
order.delivered
Triggered when the package is successfully delivered.
{
"id": "event-uuid",
"event": "order.delivered",
"payload": {
"id": "order-uuid",
"status": "delivered",
"externalRef": "YANGO-ORDER-123",
"driver": {
"id": "driver-uuid",
"name": "David Cohen"
},
"deliveredAt": "2026-08-19T10:30:00.000Z",
"proofOfDelivery": {
"recipientNameConfirmed": "Jane Doe",
"gpsLat": 32.0753,
"gpsLng": 34.7749,
"photoUrl": "https://storage.courimax.com/pod/photo.jpg",
"signatureUrl": "https://storage.courimax.com/pod/signature.jpg"
}
},
"at": "2026-08-19T10:30:00.000Z"
}
order.failed
Triggered when delivery fails.
{
"id": "event-uuid",
"event": "order.failed",
"payload": {
"id": "order-uuid",
"status": "failed",
"externalRef": "YANGO-ORDER-123",
"driver": {
"id": "driver-uuid",
"name": "David Cohen"
},
"failedAt": "2026-08-19T10:30:00.000Z",
"failureReason": "Customer not available",
"notes": "Attempted delivery 3 times"
},
"at": "2026-08-19T10:30:00.000Z"
}
order.cancelled
Triggered when an order is cancelled.
{
"id": "event-uuid",
"event": "order.cancelled",
"payload": {
"id": "order-uuid",
"status": "cancelled",
"externalRef": "YANGO-ORDER-123",
"cancelledAt": "2026-08-19T10:10:00.000Z",
"reason": "Customer requested cancellation"
},
"at": "2026-08-19T10:10:00.000Z"
}
Event Summary
| Event | Trigger | Key Fields |
|---|---|---|
order.created | Order created | id, status, externalRef |
order.assigned | Driver assigned | driver, assignedAt |
order.picked_up | Package picked up | driver, pickedUpAt |
order.in_transit | In transit | driver, driverLocation, inTransitAt |
order.delivered | Delivered | driver, deliveredAt, proofOfDelivery |
order.failed | Delivery failed | driver, failedAt, failureReason |
order.cancelled | Order cancelled | cancelledAt, reason |
Filtering Events
Filter events in your webhook handler:
app.post('/webhooks/courimax', (req, res) => {
const event = req.body.event;
switch (event) {
case 'order.created':
handleOrderCreated(req.body.payload);
break;
case 'order.delivered':
handleOrderDelivered(req.body.payload);
break;
case 'order.failed':
handleOrderFailed(req.body.payload);
break;
default:
logger.info('Unhandled event', { event });
}
res.status(200).send('OK');
});
Event Ordering
Events are delivered in the order they occur, but network delays may cause out-of-order delivery. Use timestamps to determine the actual order:
function processEvents(events) {
// Sort by timestamp
events.sort((a, b) => new Date(a.at) - new Date(b.at));
// Process in order
events.forEach(event => processEvent(event));
}
Idempotency
Use the event id to deduplicate events:
const processedEvents = new Set();
app.post('/webhooks/courimax', (req, res) => {
const eventId = req.body.id;
if (processedEvents.has(eventId)) {
return res.status(200).send('Already processed');
}
processedEvents.add(eventId);
handleEvent(req.body);
res.status(200).send('OK');
});
Next Steps
- Payload Format - Complete payload structure
- Webhooks Overview - Webhook configuration and security