For the complete documentation index, see llms.txt. This page is also available as Markdown.

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.

Webhooks are available on the Agency plan only. Perfect for CRM integrations like GoHighLevel, HubSpot, and Zapier.


Available Events

Event
Description

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

Forms vs. webhooks: Webhooks fire for call events only. The website tracker script also injects attribution data (UTMs, click IDs, ga_client_id, ga_session_id) into your website's forms as hidden fields — but that data is sent to your form handler (HubSpot, Squarespace, your CRM, etc.), not back to Ring Tonic. There is no form.submitted webhook.


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.

Field
Description

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.


Creating a Webhook Endpoint

Create a webhook endpoint form
  1. Go to Automations > Webhooks in the sidebar

  2. Click Add Endpoint

  3. 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

  4. Click Create Endpoint


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)


Testing Your Endpoint

  1. Go to your webhook endpoint's detail page

  2. Click Send Test

  3. Select an event type from the dropdown (only events you're subscribed to are shown)

  4. Click Send Test to dispatch a sample webhook with realistic data

  5. Check your server logs for the test payload

  6. Verify the delivery status in the Recent Deliveries table

Realistic Sample Data: Test webhooks include sample data that matches the real payload structure for each event type. This helps you test your integration logic before real calls come in.

Test a webhook endpoint

Payload Examples

All webhooks follow the same structure with event-specific data in the data object.

call.blocked

Fires when a call from a blocked number is rejected. This event has a different payload structure than other call events since the call is never connected.

call.completed (base payload — shared by all call.* events)

This is the full base payload shared by call.started, call.completed, call.missed, recording.available, transcription.available, lead.qualified, voicemail.received, and voicemail.transcribed. Event-specific fields are appended on top (see the sections below).

recording.available

Includes all base fields plus:

transcription.available

Includes all base fields plus:

lead.qualified

Includes all base fields plus:

voicemail.received

Fires when a caller leaves a voicemail. Includes all base fields plus:

voicemail.transcribed

Fires when a voicemail transcription is complete. Includes all base fields plus:


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

Manual Retry

For failed deliveries, click the Retry button in the delivery detail modal to manually queue a retry.

Manual retry a webhook delivery

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

  1. 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.

  2. Ring Tonic pushes data to GHL - When a call ends, we fire a webhook to GHL with full call details and attribution data.

  3. GHL automations fire - Your GHL workflow creates the contact, adds tags (e.g., "PPC Lead"), and triggers SMS/email follow-ups.

1

Create the GHL Workflow

  • In GoHighLevel, go to AutomationWorkflows

  • Click Create WorkflowStart from Scratch

  • Click Add New Trigger → Select Inbound Webhook

  • Copy the generated Webhook URL (you'll need this for Ring Tonic)

  • Click Save Trigger

2

Create the Ring Tonic Endpoint

  • In Ring Tonic, go to Automations > WebhooksAdd Endpoint

  • Enter a name: GoHighLevel Integration

  • Paste the GHL Webhook URL from Step 1

  • Select events: call.completed, call.missed (and optionally recording.available)

  • Click Create Endpoint

3

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

4

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

Ring Tonic Field
GHL Use Case

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)


Common Questions

What HTTP method is used?

All webhooks are sent as POST requests with a JSON body. The Content-Type header is set to application/json.

How many times will you retry a failed delivery?

Each delivery is retried up to 3 times with exponential backoff. After all retries are exhausted, that delivery is marked as failed. If 10 consecutive deliveries fail (each after exhausting retries), the endpoint is automatically disabled via circuit breaker.

How quickly are webhooks sent?

Webhooks are dispatched immediately when the event occurs, typically within seconds.

What response should my server return?

Return any 2xx status code (200, 201, 204, etc.) to acknowledge receipt. We ignore the response body.

How long do you store delivery logs?

Delivery logs are retained for 30 days.

Can I have multiple endpoints for the same event?

Yes, you can create multiple endpoints subscribing to the same events. Each will receive the webhook independently.

Last updated