Last Updated: Oct, 2026
This guide explains how to configure CallGrid to send call tracking data to Kayzen. In CallGrid, you'll create five postbacks — one per call lifecycle event — each firing out to Kayzen's postback URL. Kayzen uses call_id to link all events for the same call, and number to identify which campaign or creative generated the call.
The five events fire in the following order over the life of a call: Call Inbound → Call Answered → Call Ended → Call Billable → Call Paid. Billability and payout are only determined once the call itself has ended.
Scope of this guide
This integration is built for hard-coded tracking numbers with no landing page — the number is displayed directly in the CTV creative, and there is no click-through or click_id involved. Attribution runs entirely on call-based matching (caller_id + number + call_id).
Prerequisites
A CallGrid account with access to create postbacks on your call flow (Integrations > Webhooks).
A CallGrid tracking number assigned to the campaign or creative you're tracking. This is the number displayed in your CTV ad.
Your Kayzen API key — the advertiser-level API key for your account. You'll use this to replace the KAYZEN_PROVIDED placeholder in each URL below. You can obtain your API key from your Kayzen account manager or from the advertiser settings in the kayzen UI. You can check the Kayzen documentation here for instructions on where to find and use the Advertiser API key.
The five postback URLs below, which you will configure in CallGrid as separate webhooks — one per lifecycle event.
Step-by-Step Configuration
How to Set Up Your Postbacks in CallGrid:
1. In CallGrid, go to Integrations > Webhooks (in the left-hand navigation, under Integrations). This is where outbound call events are configured — note this is a separate section from “Postbacks,” which sits right below it in the same menu but is a different CallGrid feature. All pixels are to be added under Webhooks section.
2. Create a new webhook and set its Name and Event exactly as shown for each of the five pixels below.
3. Set the HTTP Method to GET and paste the full Request Data URL exactly as shown — do not introduce line breaks or extra spaces.
4. Leave Timeout at its default (5.0s) and leave “Use Static IP for requests” unchecked unless your Kayzen contact has told you Kayzen requires a static sending IP.
5. Repeat until all five pixels are created, then attach them to the call flow or campaign that manages your CTV call traffic.
Important: Replace KAYZEN_PROVIDED in all five postback/pixel URLs with the advertiser-level API key.
Webhook 1: Call Inbound
This pixel fires as soon as the call appears in CallGrid, regardless of outcome. It sends information about every inbound call and establishes the call_id that later events for the same call will reuse.
Name | Kayzen CTV - Call Inbound - call_inbound |
Event | Call Inbound |
HTTP Method | GET |
Request Data URL:
Webhook 2: Call Answered
This pixel fires when the call is answered. It always fires fewer times than Call Inbound, since it does not fire unless the incoming call is actually picked up.
Name | Kayzen CTV - Call Answered - call_answered |
Event | Call Answered |
HTTP Method | GET |
Request Data URL:
Webhook 3: Call Ended
This pixel fires when the call finishes and the call record is finalized in CallGrid — including calls that failed to connect. Despite the app_event value (call_completed), this is the webhook CallGrid's UI labels “Call Ended”. This event fires before Call Billable and Call Paid, since CallGrid evaluates billability and payout only once the call has ended.
Name | Kayzen CTV - Call Ended - call_completed |
Event | Call Ended |
HTTP Method | GET |
Request Data URL:
Note: The duration_sec parameter (using CallGrid's [[tag:CallDurationFromConnect]] macro) is appended to this pixel only, giving Kayzen the call length once the call has ended. The screenshot below was taken before this parameter was added — append &duration_sec=[[tag:CallDurationFromConnect]] to the end of the URL shown in your CallGrid webhook.
Webhook 4: Call Billable
This pixel fires after the call has ended, once CallGrid determines the completed call meets your campaign's billable/conversion criteria (for example, a minimum call duration). It carries revenue_USD, the gross revenue value for the call.
Name | Kayzen CTV - Call Billable - call_converted |
Event | Call Billable |
HTTP Method | GET |
Request Data URL:
Webhook 5: Call Paid
This pixel fires last in the call flow, once a payout is credited for the call. Not all billable calls generate a payout — check your CallGrid campaign settings if you expect Call Paid events but are not receiving them.
Name | Kayzen CTV - Call Paid - call_paid |
Event | Call Paid |
HTTP Method | GET |
Request Data URL:
Attaching Webhooks/Pixels to Your Call Flow
Once all five pixels are created, attach them to the CallGrid campaign that manages the calls generated by your CTV creative, so that each of the five events fires for every call on that number.
Note: This is done from the same Integrations > Webhooks screen — attach the webhooks to the campaign, and it fires out to Kayzen's postback URL for each qualifying call.
Verification
After creating all five pixels under Integrations > Webhooks and attaching them to your call flow, use the following steps to confirm the integration is working:
Place a test call to the CallGrid tracking number that appears in your CTV campaign.
In CallGrid, open your call log or reporting screen and locate the row for your test call.
Confirm that each of the five pixels fired and returned a 200 response status.
Share the test call's call_id with your Kayzen account manager so they can confirm Kayzen received data from all five pixels.
Troubleshooting
Call events aren't appearing in Kayzen
Check that all five pixels are created and attached to the correct call flow or campaign. Confirm the api_key parameter in each URL matches exactly what's shown above, with no line breaks or extra characters.
My pixel test doesn't return a 200 status
The pixel Request Data URL likely has a formatting error. Copy the URL from this guide again and confirm you didn't drop any part of it or introduce a line break.
Why aren't Call Billable events appearing?
Call Billable only fires once a call meets your CallGrid conversion/billable threshold. Confirm that threshold is configured correctly in CallGrid, and check whether the call was flagged as a duplicate (is_duplicate), since duplicate calls may not qualify depending on your settings.
Why am I seeing 0.00 revenue on calls?
The revenue_USD value comes from CallGrid's own campaign/payout configuration. If Kayzen is showing 0.00, check the revenue configuration on the CallGrid side.
How do I check whether a call failed or errored out?
A failed call still fires the Call Ended pixel — CallGrid doesn't send a separate error event. To check, look at that call's CallStatus in CallGrid (COMPLETED, NO_ANSWER, CANCELED, NO_ROUTE, or BUSY — NO_ROUTE means a routing/connection failure) along with related tag fields like CallNoConnect, CallConnectFailed, or CallBlocked.
How do I get help with issues during setup?
Reach out to your Kayzen account manager or contact Kayzen support. When reporting an issue, include: a screenshot of the webhook delivery log from CallGrid, the call_id of the test call, and the HTTP status code returned for each pixel.
