{"site":{"name":"Koji","description":"AI-native customer research platform that helps teams conduct, analyze, and synthesize customer interviews at scale.","url":"https://www.koji.so","contentTypes":["blog","documentation"],"lastUpdated":"2026-09-28T17:46:58.395Z"},"content":[{"type":"documentation","id":"7f8da9aa-1324-4042-856d-61c94a9923f9","slug":"zapier-research-automation","title":"Connect Koji to Zapier: Automate Customer Research Workflows in Minutes","url":"https://www.koji.so/docs/zapier-research-automation","summary":"A step-by-step guide for connecting Koji AI customer interviews to Zapier. Koji has no outbound webhooks, so the Zap runs on a schedule and calls the Koji REST API with a Custom Request step, filtering to interviews that are completed with an analysis. Covers setup, payload mapping, real-world workflow examples for Notion/Linear/Salesforce/Airtable, and when to poll from your own backend instead.","content":"**TL;DR:** Koji has no outbound webhooks yet, so the Zap pulls rather than waiting to be pushed. Set it up in under 10 minutes: (1) start a Zap on a schedule, (2) add a \"Webhooks by Zapier\" Custom Request step that calls the Koji read endpoint with your API key, filtered to interviews that are `completed` with an `analysis`, (3) map the returned fields to actions in any of Zapier's 6,000+ apps. From there, every completed AI interview can auto-create Notion pages, Linear tickets, Salesforce notes, Airtable rows, Gmail summaries — anything Zapier supports.\n\n## Why connect Koji to Zapier\n\nKoji handles the hard part of customer research: recruiting, moderation, transcription, theme analysis, reporting. But customer insights only create value when they reach the team and tool that can act on them. That's where Zapier fits.\n\nA few high-impact patterns we see Koji teams build:\n\n- **Notion research repository** — every completed interview becomes a new page in a Notion database, tagged with theme and segment\n- **Linear ticket creation** — when a participant raises a specific pain, auto-file a Linear ticket with the verbatim quote\n- **Salesforce account enrichment** — push interview insights onto the contact's record in Salesforce so AEs see customer voice mid-deal\n- **Airtable research CRM** — track participants across multiple studies in Airtable with rich metadata\n- **Slack alerts**: Koji has no native Slack app, so Zapier is how you route specific interviews (for example, a score above 4 on a `scale` question) to specific channels\n- **Email digests** — daily or weekly Gmail digests of new completions to stakeholders\n\nZapier supports 6,000+ apps, so almost any internal workflow can be wired up.\n\n## How the integration works\n\nKoji fires nothing: there are no outbound webhooks yet. Instead the Zap runs on a schedule and asks Koji for the interviews it is watching. The read endpoint returns the study ID, interview ID, completion timestamp, participant metadata, transcript URL, structured answers and the analysis. Zapier parses that JSON into named fields and exposes them to every downstream Zap action.\n\nThis is the standard Zapier pattern for products with no native Zapier app and no callbacks, and it works just as well. You get the full flexibility of Zapier without waiting for a dedicated integration.\n\n```\n[Customer completes interview]\n        ↓\n[Scheduled Zap calls GET /api/v1/interviews/{id}]\n        ↓\n[Filter passes: status completed and analysis present]\n        ↓\n[Zap runs your chosen action: Notion / Linear / Salesforce / etc.]\n```\n\n## Step-by-step setup (10 minutes)\n\n### Step 1: Create a scheduled Zap in Zapier\n\n1. In Zapier, click **Create Zap**.\n2. For the trigger app, search **Schedule by Zapier** and pick how often it should run.\n3. Add a **Webhooks by Zapier** step and choose **Custom Request** as the action.\n4. Method `GET`, URL `https://www.koji.so/api/v1/interviews/{id}`, and a header `Authorization: Bearer <your Koji API key>`.\n5. Add a **Filter** step that only continues when `status` is `completed` and `analysis` is present.\n\nThe Webhooks by Zapier step is included on paid Zapier plans. For high-volume studies you'll want a Starter or Professional Zapier subscription.\n\n### Step 2: Create a Koji API key and decide what the Zap watches\n\n1. In Koji, open **Settings** and create an API key with read access. Copy it once; it is only shown at creation.\n2. Paste it into the Zapier step's `Authorization: Bearer` header.\n3. Decide which interviews the Zap checks. The simplest version keeps a Zapier Storage or Airtable list of `interview_id` values you add when you send an interview link, and removes each one after it is handled.\n4. There is no Webhooks section in Koji and no event to subscribe to. Outbound webhooks are not available yet.\n\nFor the full set of patterns, see the [webhook setup guide](/docs/webhook-setup) and [research automation](/docs/research-automation-webhooks).\n\n### Step 3: Run a test request\n\nBack in Zapier, run the Custom Request step against an interview that has already finished. If you need one, run a test conversation from the **Preview** tab on your study's Interviews page first.\n\nWithin a few seconds, Zapier will display the response, something like:\n\n```json\n{\n  \"status\": \"completed\",\n  \"interview_id\": \"int_a1b2c3\",\n  \"study_id\": \"stu_x9y8z7\",\n  \"completed_at\": \"2026-05-15T14:32:11Z\",\n  \"participant\": {\n    \"email\": \"alex@example.com\",\n    \"name\": \"Alex\"\n  },\n  \"structured_answers\": [\n    {\"question_id\": \"q1\", \"type\": \"scale\", \"value\": 4},\n    {\"question_id\": \"q2\", \"type\": \"yes_no\", \"value\": true}\n  ],\n  \"transcript_url\": \"https://app.koji.so/interviews/int_a1b2c3/transcript\",\n  \"report_url\": \"https://app.koji.so/studies/stu_x9y8z7/report\"\n}\n```\n\nOnce Zapier sees this response, every field is available to map into downstream actions.\n\n### Step 4: Add your action\n\nNow wire up what should happen on each completion. A few quick examples:\n\n**Create a Notion page**\n- App: Notion → Action: Create Database Item\n- Map `participant.name` → Page Title\n- Map `transcript_url` → URL property\n- Map `structured_answers[0].value` → Score property\n\n**Create a Linear ticket (only when score is low)**\n- Add a **Filter** step: only continue if `structured_answers[0].value` is less than 3\n- App: Linear → Action: Create Issue\n- Title: \"Low CSAT from {{participant.name}}\"\n- Description: paste the transcript URL\n\n**Send a Slack message**\n- App: Slack → Action: Send Channel Message\n- Channel: `#customer-research`\n- Message: \"New interview from {{participant.name}}. Score: {{structured_answers[0].value}}. Read: {{transcript_url}}\"\n\n**Append to a Google Sheet**\n- App: Google Sheets → Action: Create Spreadsheet Row\n- Map each structured answer to a column\n\n### Step 5: Turn the Zap on\n\nTest once more end-to-end. If the response routes correctly, flip the Zap to **On**. Every scheduled run now picks up the interviews that finished since the last one.\n\n## Comparing Zapier to Koji's native integrations\n\nKoji has no native app for any destination and no outbound webhooks. What it does have is the public report link you can paste anywhere, CSV and JSON export, the [MCP connector](/docs/mcp-overview), and a REST API your own backend can poll. See [Slack](/docs/slack-research-insights-integration), [HubSpot](/docs/hubspot-research-integration) and [webhook setup](/docs/webhook-setup) for what each of those actually looks like.\n\nZapier is the right choice when:\n\n- You need to route to another app at all, since Koji has no native connectors (Notion, Linear, Salesforce, Airtable, Asana, Trello, Pipedrive, ClickUp, Monday, etc.)\n- You need conditional routing (filters, branches based on answer values)\n- You want to chain multiple actions in one workflow (e.g., create Notion page *and* file Linear ticket *and* email the PM)\n- Your team already maintains its automations in Zapier and you want consistency\n\nFor simply putting findings in front of people, the public report link is faster. For routing structured data into other tools, Zapier wins.\n\n## Real-world workflow examples\n\n**The \"PMF Detector\" Zap**\nTrack every Koji interview with a `scale` question on pain intensity. If the score is 5/5, file a Linear ticket tagged \"PMF candidate\" and DM the founder. Used by Koji-powered seed-stage teams to spot signal among 100+ interviews.\n\n**The \"Customer Quote Wall\" Zap**\nAppend every interview's top quote (from the `open_ended` answer field) into an Airtable base. Marketing pulls from this base for landing page social proof. A new quote candidate appears every time an interview completes.\n\n**The \"AE Briefing\" Zap**\nWhen a Koji interview is tagged with a specific company domain, push the transcript summary onto that company's Salesforce account. AEs see the latest customer voice when they open the record.\n\n**The \"Weekly Discovery Digest\" Zap**\nAggregate the past 7 days of interview completions into a daily-scheduled Zap that emails the product team every Monday with theme counts and links.\n\n## Best practices\n\n- **Use Zapier's filter step liberally.** Don't spam Linear with every interview — only the ones that meet a criteria.\n- **Map structured answers explicitly.** Zapier represents the `structured_answers` array as indexed items. Map by index (and ideally by `question_id`) so your Zap doesn't break when you reorder questions.\n- **Don't put participant PII into shared channels.** Many Zapier destinations (Slack channels, public Notion databases) are visible to your whole team. Strip or hash participant emails in the Zap if needed. See [anonymizing customer interview data](/docs/anonymizing-customer-interview-data) for the full privacy playbook.\n- **Monitor Zap history.** Zapier shows a log of every run. Check it weekly to catch silent failures.\n- **Beware of rate limits.** Some downstream apps (especially Notion, Airtable) have per-minute write limits. For high-volume studies, batch via Zapier's Digest or Storage steps.\n\n## When to poll from your own backend instead\n\nZapier adds latency (its schedule plus 1 to 15 minutes of queueing) and a per-task cost. For high-volume or low-latency workflows, poll the [Koji read endpoint](/docs/research-automation-webhooks) from your own backend every minute instead, and forward the embed widget's `koji:interview_completed` event when the interview runs in the embed. For most teams, Zapier is the right balance of speed-to-setup and flexibility.\n\n## Frequently Asked Questions\n\n**Do I need a paid Zapier subscription?**\nThe free tier supports basic webhooks but limits the number of Zaps and tasks. For production research automation, Zapier Starter or Professional is usually required.\n\n**Does Koji have a native Zapier app?**\nNot yet. The Catch Hook pattern described here is the standard integration approach and gives you full Zapier flexibility. A native Zapier app is on the roadmap.\n\n**Will Zapier expose participant emails?**\nThe API response includes whatever participant info you collected via your [intake form](/docs/intake-forms-and-consent). If you want to keep emails out of downstream tools, omit the email field from the intake or strip it inside Zapier using a Formatter step.\n\n**Can I trigger Koji actions *from* Zapier (not just receive from)?**\nYes — Koji also has a public REST API. You can use Zapier's \"Webhooks by Zapier → Custom Request\" action to call Koji endpoints (e.g., starting an interview, importing respondents). See the [user research API guide](/docs/user-research-api-guide) for the available endpoints.\n\n**What if a scheduled run fails?**\nKoji delivers nothing, so there is no delivery to retry: the interview simply stays on your watch list until the next run picks it up. Zapier's own Zap History shows every run and status code. For deeper integration debugging, see the [webhook setup guide](/docs/webhook-setup).\n\n**Is there an alternative to Zapier?**\nYes: Make.com (formerly Integromat), n8n (self-hosted), and Pipedream all run scheduled HTTP requests the same way. The setup is nearly identical: point their HTTP step at the Koji read endpoint with your API key.\n\n## Related Resources\n\n- [Structured Questions Guide: 6 Question Types Every Koji Study Needs](/docs/structured-questions-guide)\n- [Webhook Setup: Completion Signals Without Webhooks](/docs/webhook-setup)\n- [Research Automation: Build Near-Real-Time Pipelines](/docs/research-automation-webhooks)\n- [User Research API: Embed AI Interviews into Any Workflow](/docs/user-research-api-guide)\n- [Slack Research Insights Integration](/docs/slack-research-insights-integration)\n- [HubSpot Research Integration](/docs/hubspot-research-integration)","category":"API Reference","lastModified":"2026-09-20T18:39:51.032914+00:00","metaTitle":"Connect Koji to Zapier: Customer Research Automation (2026)","metaDescription":"Route every completed Koji AI interview to 6,000+ Zapier apps with a scheduled Zap that calls the Koji API. Step-by-step setup for Notion, Linear, Salesforce, Airtable, and more.","keywords":["zapier user research","zapier customer interview","automate user research zapier","koji zapier integration","zapier survey webhook","zapier research automation","customer research zapier","research workflow automation"],"aiSummary":"A step-by-step guide for connecting Koji AI customer interviews to Zapier. Koji has no outbound webhooks, so the Zap runs on a schedule and calls the Koji REST API with a Custom Request step, filtering to interviews that are completed with an analysis. Covers setup, payload mapping, real-world workflow examples for Notion/Linear/Salesforce/Airtable, and when to poll from your own backend instead.","aiPrerequisites":["A published Koji study","A Zapier account (free or paid)","Basic familiarity with webhooks"],"aiLearningOutcomes":["Set up a scheduled Zap that calls the Koji read endpoint","Create a Koji API key and list the interviews the Zap should watch","Map the Koji payload fields to Zapier actions","Build conditional routing with Zapier filters","Choose between Zapier and polling from your own backend"],"aiDifficulty":"intermediate","aiEstimatedTime":"10 min read"}],"pagination":{"total":1,"returned":1,"offset":0}}