01When does it fire?
- When a cashier shift is closed (the CLOSED status) — once per shift.
- Opening and internal updates generate no events — the close is the event.
02Full payload example
{
"id": "mwh:shift-closed:9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b:5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"type": "shift.closed",
"api_version": "v2",
"tenant_id": "9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b",
"data": {
"shift_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"cashier_name": "Mona Abdullah",
"staff_id": "6a7b8c9d-0e1f-4a2b-9c3d-4e5f6a7b8c9d",
"branch_id": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a",
"opened_at": "2026-10-20T09:00:12.442018+00:00",
"closed_at": "2026-10-20T17:05:40.990214+00:00",
"starting_float": 500,
"closing_cash_counted": 3145.25,
"cash_sales": 2870.25,
"card_sales": 1240,
"other_sales": 90,
"total_refunds": 225,
"expected_cash": 3145.25,
"variance": 0,
"notes": "Normal close"
}
}03data fields
| Field | Meaning |
|---|---|
| shift_id | The shift id (UUID). |
| cashier_name / staff_id | The cashier name and id (UUID). |
| branch_id | The branch id (UUID). |
| opened_at / closed_at | The open and close times, ISO 8601. |
| starting_float | The starting float in the store currency. |
| closing_cash_counted | The cash counted at close. |
| cash_sales / card_sales / other_sales | Cash, card and other-method sales. |
| total_refunds | Total refunds during the shift. |
| expected_cash | The arithmetically expected cash. |
| variance | The difference between counted and expected. |
| notes | The free-form close notes. |
04Event identity
Pattern: mwh:shift-closed:<tenant_id>:<shift_id> — once per shift.
COMPLETE YOUR INTEGRATION
