⚡Webhooks

Webhooks let you receive real-time notifications when events happen in Ring Tonic. Instead of polling our API, we push data to your server the moment a call comes in, a recording is ready, or a lead is qualified.
Available Events
call.started
Fires when a call starts ringing
call.completed
Fires when a call ends (includes duration and status)
call.missed
Fires when a call is missed (busy, no-answer, failed)
recording.available
Fires when call recording is ready
transcription.available
Fires when call transcription is complete
lead.qualified
Fires when you qualify a lead in the dashboard
call.blocked
Fires when a blocked number attempts to call
voicemail.received
Fires when a caller leaves a voicemail
voicemail.transcribed
Fires when voicemail transcription is complete
appointment.booked
Fires when an appointment is booked
appointment.rescheduled
Fires when an appointment's time is changed
appointment.cancelled
Fires when an appointment is cancelled
appointment.status_changed
Fires when an appointment is marked completed / no-show, or reverted
Appointment events fire for both AI-booked and manually-booked appointments — see Appointments.
Attribution Fields in Call Payloads
Every call payload includes a nested visitor_session object with the full attribution context captured by the website tracker script when the caller's session was created.
Where to find GA fields: ga_client_id and ga_session_id live inside data.visitor_session, not at the top level of data. Only utm_source and utm_medium are promoted to the top level for convenience.
data.visitor_session.gclid
Google Ads click ID
data.visitor_session.gbraid
Google iOS app click ID
data.visitor_session.wbraid
Google privacy-restricted web click ID
data.visitor_session.fbclid
Facebook/Instagram click ID
data.visitor_session.msclkid
Microsoft/Bing click ID
data.visitor_session.ttclid
TikTok click ID
data.visitor_session.li_fat_id
LinkedIn click ID
data.visitor_session.ga_client_id
Google Analytics Client ID (from _ga cookie)
data.visitor_session.ga_session_id
GA4 Session ID (from _ga_XXXXXX cookie)
data.visitor_session.utm_campaign
Campaign name from URL
data.visitor_session.utm_term
Search term from URL
data.visitor_session.utm_content
Ad variant/content from URL
data.visitor_session.referrer_url
The referring page that brought the visitor
data.visitor_session.landing_page_url
The first page the visitor landed on
If the caller could not be matched to a website visitor session (e.g., they dialed the number directly without visiting your site), data.visitor_session will be null.
Timestamps & Time Zones
Every timestamp in a webhook payload is in UTC (Coordinated Universal Time), formatted as an ISO 8601 string ending in +00:00 — for example, 2026-06-09T07:25:37+00:00. The trailing +00:00 is the time-zone offset, and it confirms the value is UTC.
Webhook times are UTC; your dashboard shows local time. Your call logs and analytics pages convert times into your campaign or workspace time zone so they're easy to read, but webhooks always send UTC. A time that looks an hour (or more) different from your dashboard is the same moment shown in two time zones — not a mismatch.
For example, a call that starts at 07:25 UTC arrives in the webhook as 2026-06-09T07:25:37+00:00. If that campaign uses UK time, the call's detail page shows it as 8:25 AM, because the UK runs one hour ahead of UTC during British Summer Time (UTC+1). Both values are correct — they describe the same instant.
Timestamp fields
created_at
Top level — when the webhook event was generated
data.started_at
All call events — when the call started
data.qualified_at
lead.qualified — when the lead was qualified
data.summarized_at
transcription.available and lead.qualified — when the AI summary was generated
data.voicemail.transcribed_at
voicemail.transcribed — when the voicemail was transcribed
Working with the times: Because each timestamp carries the +00:00 offset, most date libraries parse it correctly out of the box. Convert it to your preferred time zone for display, or store it as UTC and convert on read.
Creating a Webhook Endpoint

Go to Automations > Webhooks in the sidebar
Click Add Endpoint
Fill in the endpoint details:
Name: A friendly name (e.g., "GoHighLevel Integration")
Endpoint URL: Your HTTPS URL that will receive the webhook
Events: Select which events to subscribe to
Click Create Endpoint
HTTPS Required: Your endpoint URL must use HTTPS. HTTP URLs are not accepted for security reasons.
Signing Secret
Each webhook endpoint has a unique signing secret (e.g., whsec_abc123...). Use this to verify that requests are genuinely from Ring Tonic.
We sign every webhook request using HMAC-SHA256. The signature is included in the Signature header.
Verifying Signatures (PHP Example)
Pro Tip: You can regenerate your signing secret anytime from the Edit page if you suspect it's been compromised.
Testing Your Endpoint
Go to your webhook endpoint's detail page
Click Send Test
Select an event type from the dropdown (only events you're subscribed to are shown)
Click Send Test to dispatch a sample webhook with realistic data
Check your server logs for the test payload
Verify the delivery status in the Recent Deliveries table

Payload Examples
All webhooks follow the same structure with event-specific data in the data object.
Delivery & Retries
Ring Tonic automatically retries failed deliveries with exponential backoff. You can monitor delivery status from the endpoint detail page:
Success: Your server returned 2xx
Retrying: Delivery failed, retrying automatically
Failed: All retry attempts exhausted
Circuit Breaker: After 10 consecutive failures, the endpoint is automatically disabled to prevent further issues. Re-enable it from the detail page after fixing the problem.
Manual Retry
For failed deliveries, click the Retry button in the delivery detail modal to manually queue a retry.

Integration Example: GoHighLevel
This example shows how to connect Ring Tonic with GoHighLevel (GHL) to automatically create contacts and trigger automations when calls come in.
How It Works
Ring Tonic handles inbound calls - Your tracking number lives in Ring Tonic. We record the call and attribute the source (Google Ads, SEO, etc.) which GHL can't do natively.
Ring Tonic pushes data to GHL - When a call ends, we fire a webhook to GHL with full call details and attribution data.
GHL automations fire - Your GHL workflow creates the contact, adds tags (e.g., "PPC Lead"), and triggers SMS/email follow-ups.
Create the GHL Workflow
In GoHighLevel, go to Automation → Workflows
Click Create Workflow → Start from Scratch
Click Add New Trigger → Select Inbound Webhook
Copy the generated Webhook URL (you'll need this for Ring Tonic)
Click Save Trigger
For more details, see GHL's Inbound Webhook documentation.
Create the Ring Tonic Endpoint
In Ring Tonic, go to Automations > Webhooks → Add Endpoint
Enter a name:
GoHighLevel IntegrationPaste the GHL Webhook URL from Step 1
Select events:
call.completed,call.missed(and optionallyrecording.available)Click Create Endpoint
Test the Connection
In Ring Tonic, click Send Test on your new endpoint
Back in GHL, your workflow should show the test data received
You can now map the incoming fields to GHL contact fields
Build the GHL Workflow
After the Inbound Webhook trigger, add these actions:
Create/Update Contact
Phone:
{{data.from_number}}First Name: (optional, or use a placeholder)
Tags: Add tags based on campaign, e.g.,
{{data.campaign_name}}
Add to Campaign/Sequence (optional)
Enroll the contact in a follow-up sequence
Send SMS (optional)
"Thanks for calling! We'll be in touch shortly."
Field Mapping Reference
data.from_number
Contact Phone
data.caller_name
Contact Name
data.campaign_name
Contact Tag or Custom Field
data.utm_source
Lead Source
data.utm_medium
Custom Field (e.g., "ppc", "organic")
data.caller_location.city
Contact City
data.caller_location.state
Contact State
data.is_first_time_caller
Tag: "New Caller" vs "Repeat Caller"
data.duration
Custom Field (call length in seconds)
data.recording_url
Custom Field (link to recording)
data.visitor_session.gclid
Custom Field (Google Ads click ID for offline conversion upload)
data.visitor_session.fbclid
Custom Field (Facebook click ID for CAPI conversions)
data.visitor_session.ga_client_id
Custom Field (stitch the call to a GA4 session)
data.visitor_session.utm_campaign
Custom Field (campaign name)
data.visitor_session.landing_page_url
Custom Field (entry page)
Pro Tip: Use is_first_time_caller to branch your workflow. Send a welcome message to new callers and a "thanks for calling again" to repeat callers.
Common Questions
Last updated