GOHIGHLEVEL ANSWERS & PROMPTS: PLAYBOOK T23 · CALENDARS & BOOKING
AUTHOR: DANIEL HALLMAN
KEYWORD: CALENDAR
PLAYBOOK T23 · Calendars & Booking KEYWORD: CALENDAR

Why are GoHighLevel appointment start and end times blank in my webhook?

Short Answer: Trigger your workflow on 'Appointment Status' or 'Customer Booked Appointment' (never a Contact tag trigger), format the start/end timestamps with HighLevel's native Date/Time Formatter, and test with a real calendar booking instead of the 'Test Workflow' button.

Fixing Empty Appointment Start and End Times in GoHighLevel Outbound Webhooks
VISUAL PLAYBOOK · PLAYBOOK T23 (CALENDARS & BOOKING) Follow the 3 Simple Steps Below ↓
SIMPLE STEP-BY-STEP INSTRUCTIONS

How to Set This Up in GoHighLevel (Under 2 Minutes)

  1. STEP 1
    Switch to an Appointment Trigger: Set your workflow trigger to 'Appointment Status' (with filter Event Type = Normal and Status = Confirmed) or 'Customer Booked Appointment' so HighLevel loads the full appointment object.
  2. STEP 2
    Add a Native Date/Time Formatter Step: Before your webhook, add 'Format Data -> Date/Time Formatter' to convert '{{appointment.start_time}}' and '{{appointment.end_time}}' into standard ISO-8601 format (YYYY-MM-DDTHH:mm:ssZ).
  3. STEP 3
    Map Custom Webhook Keys & Book a Live Slot: In your Outbound Webhook action, add Custom Data keys ('start_time_iso', 'end_time_iso', 'calendar_name') and test by booking a real test slot on the live calendar page.
What Usually Happens

When a workflow starts from a Contact Tag, Pipeline Stage, or the 'Test Workflow' button, HighLevel runs in Contact scope rather than Appointment scope—so {{appointment.start_time}} and {{appointment.end_time}} are sent as empty strings.

How We Fix It in HighLevel

Switch the workflow trigger to an Appointment event ('Appointment Status = Confirmed' or 'Customer Booked Appointment'), add a native Date/Time Formatter step to output clean ISO-8601 timestamps, and pass those formatted fields in your Outbound Webhook.

MODE: AGENT PROMPT
PASTE THIS PROMPT INTO CLAUDE CODE, CURSOR, CHATGPT, OR YOUR GHL ASSISTANT SAFE READ-FIRST WORKFLOW
Fix our GoHighLevel Outbound Webhook workflow where appointment.start_time and appointment.end_time arrive blank:
1. Check the workflow trigger and replace any Contact-scoped trigger (like Contact Tag Added or Opportunity Changed) with "Appointment Status" (Status = Confirmed) or "Customer Booked Appointment".
2. Add a native "Format Data — Date/Time Formatter" action before the Outbound Webhook to format {{appointment.start_time}} and {{appointment.end_time}} as ISO-8601 timestamps.
3. Map the formatted timestamps into explicit Custom Data keys on the Outbound Webhook action.

Similar GoHighLevel Questions & Fixes

RUN THIS IN 30 SECONDS · GHL-TOOLS MCP + OPERATOR COMMUNITY

Want your AI agent to inspect and build this inside GoHighLevel automatically?

Connect Claude Code, Cursor, or OpenAI Codex to our ghl-tools MCP Server & Rust CLI for 30-second sub-account doctor checks, --dry-run previews, and snapshot diffs—or start/upgrade your GoHighLevel plan through our partner link to unlock up to $612+ in implementation kits (including GHL Workflow Recipe Pack ($47 — or Free with Trial)) and our weekly live engineering clinics.