Skip to main content

CallGrid

S2S Postback Integration Guide

Written by Madesh S

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:

  1. Place a test call to the CallGrid tracking number that appears in your CTV campaign.

  2. In CallGrid, open your call log or reporting screen and locate the row for your test call.

  3. Confirm that each of the five pixels fired and returned a 200 response status.

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

Did this answer your question?