How it works
- Subscribe to the booking and servicing events you need.
- Read each entry in
data.customer_emails. - Render the content with your own templates and branding.
- Send the email to the address in
customer_emails[].to.
Before you start
Create a webhook subscription for your tenant on the Webhooks page in the dashboard. The Webhooks guide explains endpoint registration, signature verification, retries, and replay. This page covers the email data carried by those events.Events and the emails they carry
Seat confirmation: Jinko sends
booking.completed and the flight booking confirmation email once the flight is ticketed, even if a seat is still pending. Read booked_ancillaries for each seat’s outcome. Keep the seat pending in your confirmation email until its outcome is known. See Webhooks and Seat maps.
- One event can carry several emails. A trip with a flight and a hotel can produce two entries in one
booking.completedevent. - When Jinko emails are on, Jinko sends its email before the event.
booking.partialcarries nocustomer_emailsbecause Jinko sends no email at that moment.- Treat
event_idas an opaque value. Retries of the same event reuse it. - The Fallback column shows whether Jinko sends its email when your endpoint does not receive the event.
events on POST /v1/webhooks.
What an event carries
Each event keeps the six envelope fields and anydata it already had (see Webhooks). Its data gains one customer_emails entry per email and, when the email carries it, the manage-booking link:
The example shows only some fields of each
content. The content shape of each template is a schema named after the template: for example FlightTicketingConfirmationEmailContent or HotelCancellationEmailContent. They are in the OpenAPI contract, and in the API reference under the delivery payload of GET /v1/webhooks/{id}/deliveries. A later version can add fields to content and entries to customer_emails, so ignore what you don’t use.
The three new servicing.* events also carry operation_kind (cancel, void, exchange or refund) and, when known for that operation, booked_item_id, booking_ref and operation. servicing.completed keeps every field described in Webhooks. booking.failed keeps failure_reason and failure_message.
Use your own email delivery
Jinko can turn off its customer emails for one tenant. Email dev@gojinko.com with the tenant ID and environment.- Per tenant and environment: sandbox and production are configured separately.
- All or nothing: Jinko turns off every email in the table for that tenant, except fallback emails.
- Tenant-key bookings only: bookings made with legacy person-bound keys keep Jinko emails.
- Fast activation: the change applies within about a minute, including to bookings already in progress.
- No webhook change: events and
customer_emailsstay the same.
When Jinko still sends its email
When Jinko emails are off, an event marked yes in the Fallback column still triggers a Jinko email if none of the tenant’s subscriptions receive it:- No subscription includes the event.
- Every delivery reaches its last failed attempt after 8 attempts over about 80 minutes.
- The delivery outcome is still unknown 3 hours after the event.
booking.processing has no fallback: with emails off, Jinko does not send the payment-authorized email.
Handle delivery issues
Every delivery attempt is recorded. Use the delivery log to inspect failures and replay an event.- Dashboard: open Webhooks in the dashboard, select the webhook, then open Deliveries.
- API with a legacy person-bound key:
GET /v1/webhooks/{id}/deliverieslists deliveries.POST /v1/webhooks/{id}/deliveries/{delivery_id}/replayreplays one.
A replay sends the same event again: same
event_id, same payload, signed with a new X-Jinko-Timestamp. It starts a fresh set of attempts and adds one to the delivery’s replay_count. Replay is accepted for a delivered or exhausted delivery. It is refused with delivery_in_progress while the delivery is pending or failed, and with payload_purged once its payload has been deleted, 30 days after the delivery’s last attempt or replay.
Because a replay keeps the event_id, a receiver that deduplicates on X-Jinko-Event-Id treats it as the event it already processed, if it did.