n8n Automation
Connect Tymeslot to n8n via webhooks. Automate your scheduling workflows, sync CRM data, and send notifications.
Full reference for Tymeslot webhook events — payloads, headers, retry behaviour, and security verification.
Technical Product Builder & AI Developer
You will need:
By the end of this guide, you will know how to configure, verify, and consume Tymeslot webhook events in your own application.
Tymeslot sends an HTTP POST request to your configured endpoint URL whenever a scheduling event occurs. Your endpoint receives a JSON payload describing what happened. Key behaviours to understand before you begin:
X-Delivery-ID header — use it to deduplicate retries.
meeting.created
Meeting Created
Fired when an attendee completes a booking. This is the primary event for triggering downstream automation — CRM updates, calendar invites, Slack notifications, and similar. The payload includes full attendee details, meeting time, and the video conference URL if one was generated.
meeting.cancelled
Meeting Cancelled
Fired when a meeting is cancelled — by the host or by the attendee. The payload includes a cancelled_by field indicating which party initiated the cancellation (host or attendee). Use this to decide whether to send an apology email, update a CRM record, or free up a resource.
meeting.rescheduled
Meeting Rescheduled
Fired when a meeting is moved to a new date or time. The payload includes both the original scheduled time (under previous_start_time) and the new time (under start_time), so you can update downstream records correctly.
Every webhook delivery includes these headers:
X-Tymeslot-Token: <your-configured-secret-token>
Content-Type: application/json
User-Agent: Tymeslot-Webhook/1.0
X-Webhook-ID: <webhook-configuration-id>
X-Delivery-ID: <unique-per-delivery-attempt-id>
X-Tymeslot-Token
Your configured secret token. Verify this on every request before processing the payload — reject anything that does not match.
Content-Type
Always application/json. Parse the body as JSON.
User-Agent
Always Tymeslot-Webhook/1.0. Useful for filtering in access logs but not a security mechanism.
X-Webhook-ID
The ID of the webhook configuration that triggered this delivery. Useful when you have multiple webhooks configured and want to route deliveries differently.
X-Delivery-ID
A unique identifier for this delivery attempt. Different on each retry of the same event. Use this for idempotency — store delivery IDs you have successfully processed and skip reprocessing if the same ID arrives again.
All events use the same envelope. The event field identifies the type; the data field carries the event-specific payload:
{
"event": "meeting.created",
"timestamp": "2026-03-01T10:00:00Z",
"webhook_id": "wh_abc123",
"data": {
"meeting": {
"id": "mtg_xyz789",
"title": "30-Minute Consultation",
"start_time": "2026-03-05T14:00:00Z",
"end_time": "2026-03-05T14:30:00Z",
"timezone": "Europe/Berlin",
"status": "confirmed",
"cancelled_by": null,
"previous_start_time": null,
"attendee": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"host": {
"name": "Alex Johnson",
"username": "alex"
},
"location": {
"type": "video",
"url": "https://meet.google.com/abc-defg-hij"
},
"urls": {
"view": "https://tymeslot.yourdomain.com/dashboard/meetings/mtg_xyz789"
}
}
}
}
cancelled_by — "host" or "attendee" for meeting.cancelled events; null otherwise.
previous_start_time — the original time before rescheduling for meeting.rescheduled events; null otherwise.
location.url — present only when a video conference link was generated; omitted for in-person or custom locations.
All timestamps are ISO 8601 in UTC. Apply the timezone field when displaying times to users.
Always compare the X-Tymeslot-Token header against your expected secret before processing any payload. Use a constant-time string comparison — a naive equality check (===) is vulnerable to timing attacks that could allow an attacker to guess your token one character at a time.
Examples in common languages:
// Node.js
const crypto = require('crypto');
function isValidToken(received, expected) {
const a = Buffer.from(received);
const b = Buffer.from(expected);
if (a.length !== b.length) return false;
return crypto.timingSafeEqual(a, b);
}
# Python
import hmac
def is_valid_token(received: str, expected: str) -> bool:
return hmac.compare_digest(received, expected)
<?php
// PHP
function is_valid_token(string $received, string $expected): bool {
return hash_equals($expected, $received);
}
X-Tymeslot-Token header is absent or does not match. Do not process the payload at all. Without this check, anyone who discovers your webhook URL can inject arbitrary events into your system.
Because Tymeslot retries failed deliveries, your endpoint may receive the same event more than once. Design your handler to be idempotent — processing the same delivery twice should produce the same result as processing it once.
The simplest approach: store every X-Delivery-ID you successfully process in a database or cache with a short TTL (72 hours covers the full retry window). On each incoming request, check whether the delivery ID was already processed. If it was, return 200 immediately without re-executing the handler logic.
X-Delivery-ID changes with each retry attempt. Store it after successfully processing, not before — if your handler fails partway through, the same ID will arrive again on retry and you should reprocess it.
A delivery is considered failed when your endpoint returns a non-2xx status code, returns a 3xx redirect, or does not respond within 10 seconds. Failed deliveries are retried on this schedule:
After 5 failed attempts, the delivery is marked as permanently failed. You can manually retry individual deliveries from [Dashboard] → [Settings] → [Webhooks] → [Delivery Logs].
The delivery log is your primary debugging tool. To access it:
When debugging a failed integration, start here — the response body column often shows the exact error your endpoint returned.
Endpoint returns 200 but deliveries keep retrying
Your endpoint may be returning a redirect (3xx). Tymeslot does not follow redirects — a 301 or 302 is treated as a failure. Ensure your endpoint URL is the final destination URL, not one that redirects. Check the [Delivery Logs] — the status code column will show the 3xx your endpoint returned.
All deliveries show as failed immediately
Check your endpoint's SSL certificate. Tymeslot rejects self-signed certificates and certificates from untrusted CAs. Use a certificate from a public CA (Let's Encrypt, ZeroSSL, or your cloud provider's managed certificate). The [Delivery Logs] response body will typically show an SSL error message.
Deliveries succeed but events are being processed twice
Implement idempotency using the X-Delivery-ID header as described in the "Handling Retries" section above. Store processed delivery IDs and skip reprocessing on duplicates.
Test event delivered successfully but real events do not arrive
The test event is sent immediately when you save the webhook. Real events are queued and delivered asynchronously. If real events are not arriving, check whether your Tymeslot instance's background job worker (Oban) is running. Also confirm the webhook is still active — navigate to [Dashboard] → [Settings] → [Webhooks] and verify the webhook shows as Active.
Tymeslot sends your configured secret token verbatim in the X-Tymeslot-Token header on every delivery. On your endpoint, read that header and compare it to the secret you configured — if the values do not match, reject the request with a 401 and do not process the payload.
Always use a constant-time comparison rather than a plain equality check. A timing-safe comparison prevents attackers from inferring your token character by character by measuring how long the comparison takes:
// Node.js
const received = req.headers['x-tymeslot-token'];
const expected = process.env.WEBHOOK_SECRET;
const a = Buffer.from(received ?? '');
const b = Buffer.from(expected);
const valid = a.length === b.length && crypto.timingSafeEqual(a, b);
The most common cause is a mismatch between the secret you saved in Tymeslot and the value your endpoint is comparing against. Check for:
To rule out configuration issues quickly, use Tymeslot's [Delivery Logs] to send a test delivery and inspect the exact headers that were sent.
Tymeslot retries a delivery whenever your endpoint does not return a 2xx HTTP status code, or does not respond within 10 seconds. To stop retries, ensure your endpoint:
200 OK (or any other 2xx status) as the final HTTP response — not a 3xx redirect, which Tymeslot treats as a failure.Acknowledge the webhook immediately, then process the event in a background job. The pattern is:
X-Tymeslot-Token header.200 OK immediately — before any slow work begins.This prevents Tymeslot from treating your endpoint as slow or unresponsive while still giving you time to handle complex operations like CRM updates or outbound API calls.
No. Tymeslot delivers events as they occur, but retries on failure can cause earlier events to arrive after later ones. For example, a meeting.rescheduled event that was retried three times may arrive after a meeting.cancelled event for the same meeting.
To handle out-of-order delivery correctly:
timestamp field in the payload envelope to determine which event is more recent.X-Delivery-ID header to detect and skip duplicate deliveries of the same attempt.X-Tymeslot-Token using a constant-time comparison before processing
X-Delivery-ID values and skips reprocessing duplicates
meeting.created event arrived at your endpoint with the correct payload
Connect Tymeslot to n8n via webhooks. Automate your scheduling workflows, sync CRM data, and send notifications.
Sync Tymeslot with Google Calendar. Availability checks, booking creation, and conflict detection — all automatic.
Sync Tymeslot with Outlook Calendar. Works with personal Outlook.com accounts and Microsoft 365 work accounts.