Skip to main content

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

EventTriggerKey Fields
order.createdOrder createdid, status, externalRef
order.assignedDriver assigneddriver, assignedAt
order.picked_upPackage picked updriver, pickedUpAt
order.in_transitIn transitdriver, driverLocation, inTransitAt
order.deliveredDelivereddriver, deliveredAt, proofOfDelivery
order.failedDelivery faileddriver, failedAt, failureReason
order.cancelledOrder cancelledcancelledAt, 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