Documentation

Events, reservations, and tickets

CRM-side appointment scheduling, service queues, reservations, and support tickets.

The CRM events module covers two distinct flows: reservations (appointment scheduling, service requests, walk-up queues) and tickets (support cases tied to a customer). It is separate from the standalone Events module which handles paid ticketed events with sessions and check-ins. Use this when you're booking time on a stylist's calendar; use the standalone module when you're selling a concert.

Events

GET/crm/events/get/:id?JWT
POST/crm/events/createJWT
POST/crm/events/updateJWT
DELETE/crm/events/delete/:idJWT

A CRM event is a calendar entry attached to a contact, lead, or merchant — a meeting, demo, follow-up call. It's lightweight and integrates with the activity log so a sales rep sees events in the timeline.

Reservations

Reservations are bookable time slots against a service or service point.

GET/crm/reservations/definitionsJWT
POST/crm/reservations/slotsNo auth
POST/crm/reservations/createNo auth
POST/crm/reservations/updateJWT
GET/crm/reservations/get/:id?JWT
GET/crm/reservations/by-email/:email/:reservationNumber?No auth
DELETE/crm/reservations/cancel/:email/:reservationNumberNo auth
DELETE/crm/reservations/delete/:idJWT

definitions returns the bookable services the org has configured (haircut, consultation, demo) — each with duration, price, required staff, and buffer time. slots accepts a date range and a definition ID and returns available time windows; a public booking widget calls this to render an availability grid.

// POST /crm/reservations/create
{
  "definitionId": "def-haircut-30",
  "slot": { "start": "2026-05-10T14:00:00Z", "end": "2026-05-10T14:30:00Z" },
  "customer": { "email": "[email protected]", "name": "Alice", "phone": "+15551234567" },
  "notes": "First-time client"
}

Cancellation is by email + reservation number, no auth required, so confirmation emails can carry a "cancel" link that works without login.

Service points and queues

A service point is a physical location with capacity (a chair, a counter, a service desk). Customers either reserve a slot in advance or join a walk-up queue.

GET/crm/reservations/service-point/get/:id?JWT
POST/crm/reservations/service-point/createJWT
POST/crm/reservations/service-point/updateJWT
DELETE/crm/reservations/service-point/delete/:idJWT

Walk-up queue

POST/crm/reservations/queue/joinNo auth
POST/crm/reservations/queue/check-in/:idJWT
POST/crm/reservations/queue/start/:idJWT
POST/crm/reservations/queue/complete/:idJWT
POST/crm/reservations/queue/no-show/:idJWT
GET/crm/reservations/queue/status/:servicePointNo auth

A customer scans a QR code, calls queue/join, and receives a position number. Staff calls start when serving them, complete when done, or no-show after a grace period. queue/status is public so display screens and mobile lookups don't need auth.

Service requests

GET/crm/reservations/service-request/get/:servicePoint?JWT
POST/crm/reservations/service-request-queue/joinJWT
POST/crm/reservations/service-request/update/:idJWT

Service requests are richer than queue entries — they carry diagnostic notes, parts, and labour estimates. Used for repair shops and service desks.

Reminders and meetings

POST/crm/reservations/send-reminder/:reservationIdJWT
GET/crm/reservations/meeting/tokenJWT
POST/crm/reservations/meeting/createJWT
POST/crm/reservations/meeting/validateJWT

meeting/create provisions a video room (Daily.co or similar via the integrations module) and returns the token customers use to join. Reminders fire on a schedule defined per definition.

Support tickets

POST/crm/tickets/createJWT
POST/crm/tickets/create-ticketJWT
POST/crm/tickets/email/create/:emailNo auth
GET/crm/tickets/get/:number?JWT
GET/crm/tickets/get-by-email/:email/:number?No auth
POST/crm/tickets/updateJWT
DELETE/crm/tickets/delete/:idJWT

Tickets attach to a contact and carry status (open, in-progress, resolved, closed), priority, assignee, SLA, and a thread of messages.

Replies and comments

POST/crm/tickets/reply/:ticketIdJWT
GET/crm/tickets/messages/:ticketIdJWT
POST/crm/tickets/comments/:ticketIdJWT
GET/crm/tickets/comments/:ticketIdJWT

Replies are customer-visible. Comments are internal staff notes.

Escalation and SLA

POST/crm/tickets/escalate/:ticketIdJWT
POST/crm/tickets/calculate-sla/:ticketIdJWT
GET/crm/tickets/sla-status/:ticketIdJWT
GET/crm/tickets/canned-responsesJWT
POST/crm/tickets/bulk-updateJWT

SLA breaches trigger the escalation processor in the Sync module, which fires automation rules and notification jobs.

Reservation and ticket events feed the activity log automatically. A reservation cancellation creates an "appointment_cancelled" activity on the linked contact; SLA breaches create "sla_breach" activities.