Semarize

Automation

Automate Call Analysis with Zapier

A practical guide to building automated transcript analysis pipelines in Zapier. Connect your call recording platform to the Semarize API, extract structured scores and signals from every conversation, and route results to your CRM, Slack, or database - without writing code.

What you'll learn

  • How the Trigger → Semarize API → Route pattern works in Zapier
  • How to configure Webhooks by Zapier to call the Semarize /v1/runs endpoint
  • Why sync mode is recommended for Zapier and when to use async
  • Five ready-to-use Zap templates for common use cases — CRM scoring, Slack alerts, Sheets analytics, multi-Kit pipelines, and compliance
  • Common gotchas: data size limits, JSON parsing, error handling, and Zapier plan requirements

Context

Why Zapier for Automated Call Analysis

Zapier is the fastest path from "we want to automate call analysis" to a working pipeline. No code, no infrastructure, no DevOps. But it's not the right tool for every scenario.

Zapier strengths

No code required - connect apps visually
7,000+ app integrations for routing output
Built-in Salesforce, HubSpot, Slack actions
Sync mode support - results return inline
Rapid prototyping - build a pipeline in minutes
Auto-replay for transient failures

Consider alternatives when

Long transcripts (90+ min) - Zapier has data size limits n8n / Make
Batch processing (100+ calls at once) n8n / Make
Complex branching logic - Make's Router is more powerful Make
Self-hosted / data sovereignty requirements n8n
Cost sensitivity at high volume - Zapier tasks add up n8n

For most teams getting started with automated call analysis, Zapier is the fastest path to value. You can have a working pipeline from call recording to CRM in under 30 minutes. The key is using Semarize's sync mode, which returns structured results directly in the HTTP response - no polling, no callbacks, no complexity.

Architecture

How Zapier + Semarize Works

Every Zapier automation with Semarize follows the same three-stage pattern: a trigger fires when a new call is available, the transcript is sent to the Semarize API for structured analysis, and the results are routed to your destination system.

1. Trigger

What starts the Zap. Usually a new call recording from your meeting or dialer platform. The trigger provides the transcript text.

Gong, Fireflies, Recall.ai, Zoom, Webhooks

2. Analyse

Webhooks by Zapier sends the transcript to the Semarize API. Sync mode means the response comes back with structured scores and signals in the same HTTP call.

POST /v1/runs with mode: "sync"

3. Route

Extract the brick values you need - scores, flags, extracted text, evidence - and send them to any of Zapier's 7,000+ app integrations.

Salesforce, HubSpot, Slack, Sheets, Airtable

Example Zap flow
New Recording
Gong / Fireflies / Recall.ai
App: Gong
Event: New Call Recording
Output: transcript, call_id, participants
Webhooks by Zapier
POST /v1/runs (sync)
Method: POST
URL: https://api.semarize.com/v1/runs
Headers: Authorization: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Response returned inline
Formatter by Zapier
Extract brick values from JSON response
Extract: bricks.overall_score.value
Extract: bricks.risk_flag.value
Extract: bricks.pain_point.value
Salesforce - Update Record
Write extracted signals to Opportunity
Object: Opportunity
AI Score: {{overall_score}}
Risk Flag: {{risk_flag}}
Pain Point: {{pain_point}}

Why sync mode?

Zapier doesn't support native polling loops. Use mode: "sync" so results return directly in the HTTP response. If a sync run takes longer than Zapier's timeout (~30 seconds), the API returns 202 with sync_fallback: true - meaning the run is still processing. For most transcripts under 60 minutes, sync mode completes well within Zapier's timeout.

Setup Guide

Build Your First Zap: Step-by-Step

This walkthrough covers everything you need to connect a call recording trigger to the Semarize API and route the structured output to a destination - from start to finish.

1

Create a new Zap and choose your trigger

The trigger depends on your call recording platform. Choose the app that generates your transcripts and select the event that fires when a new call is available.

GongNew Call RecordingNative Zapier integration
Fireflies.aiNew MeetingNative integration
Recall.aiWebhook triggerPOST to Zapier catch hook
ZoomNew RecordingNative integration
Webhooks by ZapierCatch HookFor any system that can POST
Custom appVariesAny app with a recording trigger
The trigger must provide the transcript text. Some apps provide it directly; others give you a recording URL that requires an additional fetch step (see Step 2).
2

(Optional) Fetch the transcript if your trigger doesn't include it

Some triggers give you a recording ID or URL, not the transcript text itself. If that's the case, add a Webhooks by Zapier GET step to fetch the transcript from your platform's API.

GET https://api.gong.io/v2/calls/{callId}/transcript
Authorization: Bearer {gong_api_key}

Skip this step if your trigger already provides the full transcript text.

3

Configure the Semarize API call

Add an Action step: search for Webhooks by Zapier and choose Custom Request.

Configuration

MethodPOST
URLhttps://api.semarize.com/v1/runs
HeadersAuthorization: Bearer smz_live_...
HeadersContent-Type: application/json
Data Pass-Through?No

Request body

Webhooks by Zapier body
{
"kit_code": "YOUR_KIT_CODE",
"mode": "sync",
"input": {
"transcript": {{Transcript from Step 1}}
}
}
Where to find your credentials: Generate an API key at Settings → API Keys in the Semarize app. Copy the Kit code from your Kit's settings page.
4

Parse the response

The Semarize API returns structured JSON with brick values. Use Formatter by Zapier for simple extraction, or Code by Zapier (JavaScript) for complex nested JSON.

Fields to extract

output.bricks.{name}.valueThe evaluated value
output.bricks.{name}.confidenceConfidence score (0-1)
output.bricks.{name}.evidenceSupporting quotes
statusShould be "succeeded"
duration_msProcessing time

Code by Zapier (alternative)

JavaScript extraction
// Code by Zapier - JavaScript
const response = JSON.parse(
inputData.response
);
output = [{
score: response.output.bricks
.overall_score.value,
risk: response.output.bricks
.risk_flag.value,
pain: response.output.bricks
.pain_point.value
}];
5

Route the results to your destination

Map the extracted brick values to fields in your destination system. Here are the most common routing patterns:

Salesforce - Update Opportunity

AI_Score__c, Risk_Flag__c, Pain_Point__c

HubSpot - Update Deal

ai_score, risk_flag, pain_point properties

Slack - Send Channel Message

Formatted message with score, risk, pain

Google Sheets - Create Spreadsheet Row

call_id, date, score, risk, pain_point

6

Test and activate

Test each step individually using Zapier's built-in test button. Verify that:

The trigger provides a transcript (or the fetch step retrieves one)
The Semarize API returns 200 with status: "succeeded"
Brick values are extracted correctly (check for null/undefined)
The destination system receives the mapped values

Once all steps pass, turn on the Zap. It will run automatically whenever the trigger fires.

API Reference

API Request & Response Details

A deeper look at what you're sending and receiving when the Webhooks by Zapier step calls the Semarize API.

Request

POST /v1/runs
// POST https://api.semarize.com/v1/runs
// Authorization: Bearer smz_live_...
// Content-Type: application/json
{
"kit_code": "discovery_quality_v2",
"mode": "sync",
"input": {
"transcript": "Rep: Hi Sarah, thanks for..."
}
}

Response (200)

Sync response
{
"run_id": "run_8f3a...",
"status": "succeeded",
"duration_ms": 1200,
"output": {
"bricks": {
"overall_score": { "value": 72, "confidence": 0.94 },
"risk_flag": { "value": false, "confidence": 0.91 },
"pain_point": { "value": "Losing 3 hrs/week...", ... }
}
}
}

Brick value types

TypeExample brickExample valueZapier field type
Numeric (score)overall_score72Number
Boolean (flag)risk_flagfalseYes/No
Text (extraction)pain_point"Losing 3 hrs/week..."Text
Categoricalcall_stage"discovery"Text
Sync fallback: If a sync-mode run exceeds ~30 seconds, Semarize returns 202 with sync_fallback: true and a run_id. The run is still processing - you would need to poll GET /v1/runs/:runId for the result. For most transcripts under 60 minutes, sync completes well within the timeout.

Templates

Zap Templates for Common Use Cases

Five ready-to-use Zap patterns for common call analysis workflows. Each template shows the complete trigger-to-destination pipeline with the specific bricks and routing configuration.

Discovery Call Scoring to Salesforce

Every call gets an automatic quality score on the Opportunity

Bricks used

overall_score = 72next_steps = truepain_identified = truedecision_maker = present

Every discovery call gets an automatic quality score. Reps see their score on the Opportunity in Salesforce. Managers see aggregated scores in their CRM reports. No one has to listen to a recording.

Trigger: Gong "New Call Recording" → Kit: discovery_quality → Salesforce
Salesforce - Opportunity Record
OpportunityAcme Corp - Enterprise Deal
StageQualification
AI Score72
Risk FlagNo
Pain PointLosing 3 hrs/week on manual data entry
Next StepsTechnical demo scheduled
Confidence0.94

Updated by Zapier automation · 12 seconds ago

Deal Risk Alerts to Slack

Only flagged calls generate alerts - clean signal, no noise

Uses Filter

Bricks used

risk_flag = truerisk_reason = "budget not confirmed"overall_score = 38

When Semarize detects a risk signal, a formatted Slack message goes to the deals channel with the risk reason, score, and call details. Use a Zapier Filter step to gate: "Only continue if risk_flag equals true".

Trigger: Any recording → Kit: deal_risk → Filter → Slack
#deal-alerts
Semarize Bot2:34 PM

Deal Risk Detected

Deal: Acme Corp - Enterprise

Score: 38 / 100

Risk: Budget not confirmed, decision maker absent

Rep: Sarah K.

Call Signals to Google Sheets

Build a call analytics dataset without a BI tool

Bricks used

overall_score = 72risk_flag = falsepain_point = "..."question_count = 8

Every call appends a row with structured signals. Pivot tables, charts, and dashboards come from your own data. No BI tool needed - just Sheets.

Trigger: Fireflies.ai "New Meeting" → Kit: call_signals → Sheets
Call Signals - Google Sheets
CallDateScoreRiskPain PointQs
Acme CorpJan 2872NoManual data entry8
Beta IncJan 2838YesBudget concerns3
Gamma LtdJan 2785NoScaling bottleneck12

Auto-populated by Zapier · 47 rows

Multi-Kit Pipeline (Score + Coach)

One Zap, two evaluations - scores to CRM, coaching to Slack

Advanced

Two Kits in one Zap

Chain two Webhooks by Zapier steps, each calling a different Kit. The first Kit scores the call for deal quality. The second Kit extracts coaching insights. Scores go to the CRM, coaching notes go to a Slack DM to the rep.

Trigger: Any → Kit 1 + Kit 2 → Salesforce + Slack DM
Multi-Kit Pipeline Output
Kit 1Discovery Quality
score: 72pain: identifiednext_steps: set

→ Salesforce Opportunity

Kit 2Coaching Signals
talk_ratio: 0.65filler_words: hightip: ask more open questions

→ Slack DM to rep

Compliance Monitoring to Database

Every call checked for regulatory compliance

Bricks used

disclosure_given = trueconsent_obtained = trueprohibited_language = true

For regulated industries. Every call is checked against a compliance Kit. Violations are flagged and logged to a compliance database for audit. No manual review required unless a check fails.

Trigger: Any recording → Kit: compliance_check → Airtable / Postgres
Compliance Check - Call #4819
Disclosure given
Consent obtained
Prohibited language- Detected: guaranteed returns
Required disclaimers
Identity verification

4 of 5 checks passed · Flagged for review

Advanced

Advanced Zapier Patterns

Beyond the basic template - patterns for handling edge cases, scaling, and building more sophisticated automation pipelines.

Handling long transcripts

For calls over 90 minutes, use a "Code by Zapier" step to truncate the transcript before sending it to Semarize. Most evaluations produce reliable results from the first 60 minutes.

Code by Zapier - truncate transcript
// Code by Zapier - JavaScript
const transcript = inputData.transcript;
const MAX_CHARS = 100000;
output = [{
transcript: transcript.substring(0, MAX_CHARS)
}];

Conditional routing with Filters

Zapier's "Filter" step gates downstream actions based on Semarize output. Use "Paths" for multiple conditional branches.

Only send to Slack if risk_flag = true AND overall_score < 60

Filter before Slack step

Only update Salesforce if status = "succeeded"

Filter before CRM step

Route high-scoring calls to Path A, low-scoring to Path B

Paths step with score conditions

Skip processing if transcript is empty or null

Filter before Semarize API call

Error handling

Zapier treats 4xx/5xx responses as step failures and halts the Zap. Strategies for resilience:

Add a Paths step before the API call to validate the transcript exists and is non-empty
Enable Zapier's built-in "Auto-Replay" to retry transient failures (503, timeout) automatically
For critical pipelines, add an error-catching webhook that logs failures to a Slack channel or Google Sheet
Check for sync_fallback: true in the response - if present, the run is still processing and the Zap got a 202

Using multiple Kits per call

Chain multiple Webhooks by Zapier steps, each calling the Semarize API with a different kit_code. Each Kit evaluates the same transcript through a different lens. For example: Kit 1 = Discovery Quality, Kit 2 = Competitor Intelligence, Kit 3 = Compliance. All results can route to different destinations from the same Zap.

Reverse pattern: Semarize webhook → Zapier

Instead of calling Semarize from Zapier, you can trigger Zaps from Semarize. Configure a workspace webhook in Semarize to POST to a Zapier catch hook URL when runs complete. This approach is useful when you start runs from your own backend or the Semarize app, and want Zapier to handle the downstream routing.

How: In Semarize, go to API Console → Webhooks and add your Zapier catch hook URL. Select the run.completed event. Zapier will receive the full run output as the trigger data.

Watch out for

Common Challenges & Gotchas

These are the issues that come up most often when teams build call analysis automations in Zapier.

Zapier data size limits

Zapier steps have practical data size limits. Very long transcripts (90+ minutes) may be truncated or cause step failures. Test with your longest typical call before going live.

JSON parsing can be tricky

The Semarize response is nested JSON. Zapier's built-in Formatter may struggle with deeply nested objects. Use "Code by Zapier" (JavaScript) for reliable extraction of brick values.

Zapier task consumption

Each step in a Zap counts as a task. A 5-step Zap processing 100 calls/day uses 500 tasks/day. Factor this into your Zapier plan choice.

No native looping

Zapier doesn't have built-in loops. If you need to process multiple calls from a batch trigger, each call fires as a separate Zap run. For true batch processing, consider Make or n8n.

Webhooks by Zapier requires a paid plan

The "Webhooks by Zapier" action (Custom Request) is only available on Zapier's paid plans (Professional and above). The free plan does not support custom HTTP requests.

Sync timeout edge case

If a sync-mode run takes longer than ~30 seconds, Semarize returns 202 with sync_fallback: true instead of the full result. This is rare for standard-length transcripts but can happen with very long calls or complex Kits.

Transcript formatting matters

Send the transcript as clean text with speaker labels (e.g., "Rep: ... Prospect: ..."). Raw audio, HTML, or heavily formatted text will reduce evaluation quality.

API key security

Store your Semarize API key in the Webhooks by Zapier step's header field, not in the request body. Zapier encrypts header values at rest.

FAQ

Frequently Asked Questions

Explore

Explore Semarize