Configure Sayify REST Hook triggers in Zapier, map flattened payload fields, and troubleshoot live Zap delivery.
Zapier Integration
Zapier connects Sayify to thousands of apps without custom code. Sayify uses Zapier REST Hooks, so a Zap receives an immediate POST whenever a subscribed event occurs.
Use Zapier when you want to create CRM contacts, send emails, update spreadsheets, create tasks, or route Sayify responses into another no-code workflow.
Requirements
| Requirement | Details |
|---|---|
| Sayify plan | Workspace must include zapier_integration. |
| API key | Create one from API Management in the Sayify app. |
| Zapier account | A free Zapier account can test Zaps, but Zapier plan limits still apply. |
| Sayify Zapier app | If Sayify is in preview, accept the invite link before searching for the app. |
If the workspace plan does not include Zapier, authentication, sample data, subscription, and live delivery are blocked.
Configure Zapier
- In Sayify, open API Management.
- Create an API key for Zapier.
- In Zapier, create a new Zap.
- Choose Sayify as the trigger app.
- Choose a trigger:
- New Response Started
- New Response Submitted
- Select the Sayify form whose fields you want to map.
- Connect your Sayify account using the API key.
- Test the trigger to load sample fields.
- Add your Zapier action, such as HubSpot, Gmail, Google Sheets, Slack, Notion, or Airtable.
- Turn on the Zap.
When the Zap turns on, Zapier sends Sayify a target_url. If a form was selected, Sayify stores it as a form-specific Zapier integration destination and only POSTs events from that form to the Zapier hook.
REST Hook Lifecycle
| Step | What Happens |
|---|---|
| Auth test | Zapier validates the API key and workspace plan. |
| Form list | Zapier loads the workspace's forms for an exact-field dropdown. |
| Sample data | Zapier requests flattened sample data for field discovery. |
| Subscribe | Zapier registers a target_url for the selected event. |
| Live event | Sayify sends the flattened payload to Zapier. |
| Unsubscribe | Zapier deletes the hook when the Zap is turned off or removed. |
Events
| Trigger | Event Key | Timing | Payload |
|---|---|---|---|
| New Response Started | response.started |
When a respondent opens a form | Session, respondent, workspace, use case. |
| New Response Submitted | response.submitted |
After submission and AI enrichment | Full response, contact, AI, custom fields, metrics, key points. |
Use New Response Submitted for campaign automation, CRM updates, lead routing, and workflows that need extracted fields.
Payload Format
Zapier receives flattened JSON. Nested objects use __ between levels, and arrays become comma-separated strings.
Zapier field mapping is static per Zap. For exact fields, configure the trigger for one specific form. A workspace-wide Zap can only rely on common fields because each form can have different question keys, extraction fields, and use-case metrics.
Example:
{
"event": "response.submitted",
"session__link_name": "Lead Qualification",
"contact__email": "alex@example.com",
"responses__company_size": "51-200",
"use_case": "lead_qualification",
"use_case_metrics__lead_score": 88,
"custom_fields__decision_process": "Finance approval required"
}
This format makes Zapier fields easier to map in downstream actions.
response.started Payload
{
"event": "response.started",
"timestamp": "2026-02-17T10:13:15.123Z",
"session__uuid": "abc123-session-uuid-456",
"session__link_name": "Lead Qualification",
"session__link_slug": "lead-qualification",
"session__link_uuid": "def789-link-uuid-012",
"session__started_at": "2026-02-17T10:13:15.123Z",
"respondent__ip_address": "192.0.2.1",
"respondent__user_agent": "Mozilla/5.0",
"respondent__location__country": "US",
"respondent__location__city": "San Francisco",
"workspace__uuid": "workspace-uuid-123",
"workspace__name": "Acme Corp",
"use_case": "lead_qualification"
}
response.started does not include answers or AI metrics because the respondent has not submitted yet.
response.submitted Payload
{
"event": "response.submitted",
"timestamp": "2026-02-17T10:13:30.794Z",
"session__uuid": "abc123-session-uuid-456",
"session__link_name": "Lead Qualification",
"session__link_slug": "lead-qualification",
"session__started_at": "2026-02-17T10:13:15.123Z",
"session__completed_at": "2026-02-17T10:13:30.794Z",
"session__duration_seconds": 85.79,
"contact__name": "Alex Johnson",
"contact__email": "alex@example.com",
"contact__phone": "+14155551234",
"contact__company": "Acme Corp",
"metadata__total_questions": 4,
"metadata__answered_questions": 4,
"metadata__completion_percentage": 100,
"ai_evaluation__clarity_score": 85,
"ai_evaluation__completion_status": "complete",
"ai_evaluation__insights__sentiment_score": 8,
"ai_evaluation__insights__urgency_level": "medium",
"ai_evaluation__insights__executive_summary": "The respondent is a strong fit and asked about implementation timing.",
"responses__company_size": "51-200",
"responses__company_size__question": "How large is your company?",
"responses__company_size__response_type": "dropdown",
"responses__current_solution": "We use spreadsheets today.",
"responses__current_solution__question": "What are you using today?",
"responses__current_solution__response_type": "voice_text_fallback",
"use_case": "lead_qualification",
"extracted_data__company_size": "Mid-Market",
"custom_fields__decision_process": "Finance approval required",
"use_case_metrics__lead_score": 88,
"use_case_metrics__icp_fit": "Strong Fit",
"use_case_key_points__buying_signals": "Asked about implementation timeline",
"Metric:lead_score": 88,
"Field:decision_process": "Finance approval required"
}
Field Reference
| Field Pattern | Description |
|---|---|
event |
Event key, such as response.submitted. |
timestamp |
Event timestamp. |
session__<field> |
Session and form metadata. |
contact__<field> |
Contact identity captured from the response. |
respondent__<field> |
Browser, IP, and location metadata. |
metadata__<field> |
Completion and question counts. |
responses__<field_key> |
Answer value for a question. |
responses__<field_key>__question |
Original question prompt. |
responses__<field_key>__response_type |
Question response type. |
responses__<field_key>__audio_url |
Audio URL when available. |
responses__<field_key>__transcript |
Transcript when available. |
ai_evaluation__<field> |
Overall AI analysis. |
use_case |
Form use-case key. |
extracted_data__<key> |
AI-extracted case data. |
custom_fields__<key> |
Custom extraction fields. |
use_case_metrics__<key> |
Dynamic use-case metrics. |
use_case_key_points__<key> |
Dynamic key point groups. |
Metric:<key> |
Legacy metric alias for Zapier field mapping. |
Field:<key> |
Legacy extracted-field alias for Zapier field mapping. |
Dynamic Use-Case Fields
Every form can produce a different set of metrics and key points.
Lead qualification example:
{
"use_case": "lead_qualification",
"use_case_metrics__lead_score": 88,
"use_case_metrics__icp_fit": "Strong Fit",
"use_case_metrics__buyer_intent": "Ready to Buy"
}
Support intake example:
{
"use_case": "support_intake",
"use_case_metrics__issue_category": "Billing",
"use_case_metrics__urgency_level": "High",
"use_case_key_points__reported_issues": "Invoice mismatch, failed payment"
}
Custom fields example:
{
"custom_fields__account_id": "ACME-1042",
"custom_fields__decision_process": "Finance approval required"
}
After changing a form's use case, questions, or custom extraction fields, retest the Zap trigger so Zapier discovers the latest fields.
Exact Form Fields
Sayify exposes form-specific field discovery for Zapier:
| Endpoint | Purpose |
|---|---|
GET /api/zapier/links |
Returns forms for Zapier's form dropdown. |
GET /api/zapier/hooks/sample/response.submitted?link_uuid=<form_uuid> |
Returns sample data with that form's exact responses__*, extracted_data__*, custom_fields__*, and use_case_metrics__* fields. |
POST /api/zapier/hooks/subscribe with link_uuid |
Creates a form-specific Zapier subscription. |
If the user edits questions, field keys, use case, or extraction schema later, retest the trigger in Zapier and remap any changed fields.
Mapping Fields in Zapier
Recommended mappings:
| Destination Goal | Useful Fields |
|---|---|
| Create CRM lead | contact__name, contact__email, contact__company, use_case_metrics__lead_score, use_case_metrics__icp_fit. |
| Create support ticket | contact__email, responses__<issue_field>, use_case_metrics__urgency_level, ai_evaluation__insights__executive_summary. |
| Send notification | session__link_name, contact__email, ai_evaluation__insights__executive_summary. |
| Add spreadsheet row | timestamp, session__link_name, response fields, metrics, custom fields. |
Testing Before Launch
- In Zapier, test the Sayify trigger.
- Confirm the selected form is correct.
- Confirm sample fields include the values you need.
- Submit a real response from the campaign form.
- Confirm the Zap run includes
use_case_metrics__*andcustom_fields__*fields. - Turn the Zap on.
For campaign launches, run at least one test per important form/use case combination.
Troubleshooting
| Problem | What To Check |
|---|---|
| Sayify app not found | Accept the Sayify Zapier invite if the app is in preview. |
| API key rejected | Confirm the key is active and belongs to the correct workspace. |
| Auth fails after key works elsewhere | Confirm the workspace plan includes Zapier. |
| Trigger does not fire | Confirm the Zap is on, the form is active, and the event is the one you subscribed to. |
| AI fields are empty | Use response.submitted, submit a response that can be enriched, and wait for AI processing. |
| New custom fields do not appear | Retest the trigger in Zapier after changing the form. |
| Fields belong to another form/use case | Select the correct form in the Zap trigger and test the trigger again. |
| Duplicate actions | Check whether you created multiple Zaps or multiple Zapier destinations for the same event. |