Automate workflows with Zapier¶
The Zapier integration sends a Call Completed trigger to Zapier after each call, with the call, its attribution and its AI labels. Use it to add calls to a spreadsheet, alert a sales channel, or create records in systems Call Tracking doesn't integrate with directly.
Before you begin¶
- You have a Zapier account. Each call uses one Zapier task, so check the plan's task limit against the site's call volume.
- You have the Owner or Editor role in the Call Tracking project.
Create the integration and get a token¶
- In the Enfonica Console, open the tracking site and click Integrations.
- On the Zapier card, click Connect.
- Enter a display name, leave Enable integration on, and click Connect.
- The API token is shown once. Click Copy and store it somewhere safe, then click Done.
The token is shown once
The token identifies this tracking site and isn't shown again. If you lose it, rotate it.
Build the Zap¶
- In Zapier, create a Zap and choose Enfonica Call Tracking as the trigger app.
- Choose the Call Completed trigger.
- When asked to connect an account, paste the API token.
- Click Test trigger. Zapier receives a sample call so you can map fields.
- Add the action, such as Google Sheets: Create Spreadsheet Row or Slack: Send Channel Message, map the fields, and publish the Zap.
Zapier receives calls that end after the Zap is published. Add a filter step in Zapier if you only want some calls, for example those with the label Qualified.
The trigger payload¶
The trigger fires once per call, after the call ends and after AI Call Insights finishes if it is on. It fires for every outcome, connected or not.
Sample payload
{
"spec_version": "enfonica.calltracking.v1",
"event_type": "call.completed",
"event_id": "trk_evt_...",
"occurred_at": "2026-09-14T03:15:27.123Z",
"call": {
"id": "...",
"start_time": "2026-09-14T03:15:27.123Z",
"end_time": "2026-09-14T03:18:02.410Z",
"direction": "inbound",
"from": "+61400123456",
"to": "+61255501234",
"number_type": "dynamic"
},
"project": { "id": "projects/..." },
"tracking_site": { "id": "projects/.../trackingSites/...", "display_name": "Example Plumbing" },
"session": {
"session_guid": "...",
"gclid": "...", "gbraid": null, "wbraid": null, "fbclid": null,
"landing_url": "https://www.example.com/?utm_source=google&utm_medium=cpc&utm_campaign=plumbing&gclid=...",
"referrer": "https://www.google.com/",
"device_category": "mobile", "browser": "Chrome", "os": "Android",
"ga_client_id": "1234567890.1234567890",
"ga_session_id": "1705776123",
"hostname": "www.example.com"
},
"attribution": {
"source": "google", "medium": "cpc", "campaign": "plumbing",
"term": null, "content": null, "channel": "Paid Search"
},
"labels": ["Qualified"],
"labels_list": "Qualified",
"summary": "Caller asked for a quote to replace a hot water system..."
}
| Field | Description |
|---|---|
event_id |
Unique ID for this delivery. Use it to ignore duplicates. |
call.id |
The call's ID. |
call.start_time, call.end_time |
When the call started and ended, in UTC. |
call.from |
The caller's number in E.164 format. This is personal information; handle it accordingly. |
call.to |
The tracking number dialled. |
call.number_type |
dynamic for a number pool, static for a static number. |
tracking_site.display_name |
The site's name, useful when one Zap serves several sites. |
session.* |
The matched session's click IDs, landing URL, referrer, Google Analytics IDs, hostname, and device category, browser and operating system. Empty for static numbers and unattributed calls. |
attribution.* |
Source, medium, campaign, term, content and channel. |
labels, labels_list |
The AI labels as a list and as a comma-separated string. Empty when Call Insights is off. |
summary |
The AI summary. Empty when Call Insights is off. |
Each delivery also carries the headers X-Enfonica-Event-Id, X-Enfonica-Call-Id and X-Enfonica-Tracking-Site-Id.
Rotate or delete the token¶
- To rotate, click Rotate token on the integration. The old token stops working immediately and the new one is shown once. Update the Zapier connection with it.
- To stop sending without deleting, turn off Enable integration under Edit.
- To remove the integration, click Delete. The token is revoked and Zaps that use it stop receiving calls.
Troubleshooting¶
| Problem | Check |
|---|---|
| Zapier can't connect | The token was pasted completely and hasn't been rotated or deleted. The integration is enabled. |
| The Zap doesn't fire | The Zap is published. In Zapier's Zap history, check whether the trigger received the call. The Zapier chip on the call's page shows delivered or failed. |
| Too many tasks | The trigger fires for every call, including missed ones. Add a Zapier filter, or reduce the calls reaching the Zap by using a separate tracking site. |
API reference¶
The Zapier app is built on four endpoints. They are documented here so you can see exactly what Zapier calls, and so you can subscribe your own endpoint to the same events if you prefer not to use Zapier.
Base URL: https://calltracking.api.enfonica.com
Authentication: every request carries the tracking site's API token, in either header.
Authorization: Bearer <token>
X-Enfonica-Zapier-Token: <token>
The token identifies one tracking site, so there is no site parameter on any endpoint. A missing, rotated, deleted or disabled token returns 401 Unauthorized.
| Method and path | Purpose |
|---|---|
GET /zapier/auth/test |
Confirms the token and returns the site it belongs to. |
POST /zapier/hooks/subscribe |
Registers a URL to receive call-completed events. |
POST /zapier/hooks/unsubscribe |
Stops deliveries to a subscription. |
GET /zapier/triggers/call-completed/sample |
Returns a sample event for field mapping. |
Test the token¶
GET /zapier/auth/test
Zapier calls this when you connect an account, and uses the site's name to label the connection.
{
"project": { "id": "projects/prj_example" },
"tracking_site": {
"id": "projects/prj_example/trackingSites/ts_example",
"display_name": "Example Plumbing"
}
}
Subscribe¶
POST /zapier/hooks/subscribe
Registers an absolute http or https URL. Every call that completes on the site is delivered to it as a POST with the trigger payload as the JSON body. A site can have any number of subscriptions.
{ "targetUrl": "https://hooks.example.com/calls" }
{ "id": "7c1d2e3f4a5b6c7d8e9f0a1b2c3d4e" }
Returns 400 Bad Request when targetUrl is missing or is not an absolute http(s) URL.
Unsubscribe¶
POST /zapier/hooks/unsubscribe
Stops deliveries to the subscription. Unsubscribing an ID that is already gone succeeds, so it is safe to retry.
{ "id": "7c1d2e3f4a5b6c7d8e9f0a1b2c3d4e" }
{ "id": "7c1d2e3f4a5b6c7d8e9f0a1b2c3d4e" }
Sample event¶
GET /zapier/triggers/call-completed/sample
Returns a list containing one fictional call in the exact shape of a delivery, so Zapier's Test trigger step can offer fields to map before any real call has happened. It contains no customer data.
Deliveries¶
Each delivery is a POST to the subscribed URL with the JSON payload described under The trigger payload and these headers:
| Header | Value |
|---|---|
X-Enfonica-Event-Id |
The event_id from the body. Use it to ignore duplicates. |
X-Enfonica-Call-Id |
The call's ID. |
X-Enfonica-Tracking-Site-Id |
The tracking site's resource name. |
Respond with any 2xx status within 10 seconds. A delivery that fails or times out is not retried; the Zapier chip on the call's page in the Console shows whether it was delivered.