How-toIntegrationsLead generationZapier

Send Chatbot Leads to Google Sheets, Mailchimp or Any App With Zapier

Send chatbot leads to Google Sheets, Mailchimp, Notion or a CRM through a Zapier Catch Hook: the payload, the setup steps, duplicate rows and consent.

PepoChat TeamPublished Last verified 16 min read
A person at a white desk works on a laptop showing a colorful spreadsheet, beside a calculator and coffee

Short answer

A chatbot gets leads into Google Sheets, Mailchimp or another app by POSTing a JSON payload (name, email, a short summary) to a Zapier Catch Hook, and a Zap maps each field to a row or a subscriber. As of October 2026, Catch Hook is not on Zapier's Free plan: Professional costs $19.99 a month billed yearly or $29.99 monthly. Look rows up by email to stop duplicates, and subscribe people to Mailchimp only after a clear yes.

If you run an AI chatbot on your website and want each lead to land in a shared Google Sheet, a Mailchimp audience, a Notion or Airtable table, or a CRM without anyone copying it by hand, this guide is for you. You need no code, one Zap and a paid Zapier plan, because the webhook trigger is a paid feature.

The sections below cover when Zapier beats a native integration, the payload, the three setup steps, recipes for six destinations, Mailchimp consent, and why a Zap sometimes fires twice.

Zapier's plans, its Catch Hook, Google Sheets and Mailchimp steps, and Mailchimp's API and policies were read on their own pages on 19 October 2026. The examples use PepoChat, which is our product; its two ways of sending data out, a Send to Zapier action and a signed new-lead webhook, are described from its documentation and code, including what they leave out.

How does a chatbot send data to Google Sheets or Mailchimp?

A chatbot sends data out with a webhook: an HTTP POST that one app makes to another app's URL when something happens, carrying the details as JSON. Zapier receives it with a Catch Hook, a trigger that gives your Zap a unique URL and starts a run each time something is posted to it, and the Zap's next step writes the fields into Google Sheets, Mailchimp or any other app.

Visitor asks for a quote in the website chat
  |
  +-- agent collects name, email and what they need
  +-- agent calls "Send to Zapier" ---- POST JSON ----> Zapier Catch Hook
                                                          |
                                                          +-- Google Sheets: find the email, add a row if new
                                                          +-- optional steps: Slack, Notion, a CRM

PepoChat can feed a Zap from two places, and they suit different jobs.

Send to Zapier actionNew-lead webhook
Fires whenA request matches the action's "when to use" text, after the agent has collected its inputsThe first time an email is captured in your workspace, by any route
Sendsevent, customer_name, customer_email, detailsThe contact (ID, email, name, phone, company, source), a conversation link, deliveryId, createdAt, test
Set up inIntegrations → ZapierWidget Customization → When a new lead arrives
SignedNoYes, an HMAC-SHA256 signature header
RepeatsRuns at least once, so a rare retry can send twiceRetried after 1 and 10 minutes on a timeout or 5xx, with the same deliveryId
Chats in the Test the agent drawerRun it and post for realNever fire it; use Send a test
PepoChat planEvery planEvery plan

Read from PepoChat's documentation and code on 19 October 2026.

The action is a decision the agent makes mid-conversation, so it suits specific requests such as quotes and carries the agent's summary of the request. The webhook involves no AI and fires once per new contact, however the email arrived, which makes it the better feed for a complete lead log.

When should you use Zapier instead of a native integration?

Use a native integration when the chatbot has one for the app, and Zapier for everything else. A native action is one fewer service to pay for and monitor, while every row or subscriber a Zap writes uses part of your Zapier task allowance.

PepoChat's native integrations already cover several usual Zapier destinations: Mailchimp signups, Slack alerts and new-lead cards, HubSpot and Salesforce lookups with tickets or cases, and the helpdesk actions in the helpdesk ticket guide. No native action writes a lead into Google Sheets, Notion, Airtable, Kit or a CRM's contact list (PepoChat reads Notion and Google Drive only as knowledge sources), and that is where a Zap earns its cost; Zapier says it connects more than 9,000 apps. The integrations page lists the native ones.

The webhook trigger is the catch. On Zapier's pricing page, read on 19 October 2026, the Connections via webhooks row is unavailable on Free and included from Professional, as Zapier's Catch Hook guide also shows.

Zapier planFreeProfessional, 750 tasks
Price$0$19.99 a month billed yearly ($239.88), or $29.99 billed monthly
Tasks a month100750
Steps per ZapTwo: one trigger and one actionMulti-step
Webhooks by Zapier (Catch Hook)Not includedIncluded
Premium appsNot includedIncluded
At the task limitZaps pause until the next usage periodZaps pause, or keep running at a higher per-task rate if pay-per-task billing is on

Last verified 19 October 2026 on zapier.com/pricing.

A task is one action that Zapier completes successfully. Triggers and built-in tools such as Filter and Formatter use no tasks, so a Zap that catches a lead and creates one row uses one task per lead, and each further successful action, a lookup included, can add another.

If the paid plan is the blocker, PepoChat's Mailchimp action subscribes visitors with no Zapier at all, and Export CSV on the Contacts page downloads the loaded contacts (name, email, phone, company, source, first and last seen) for a manual import into a sheet. The new-lead webhook also accepts a Make or n8n webhook URL; check their current plans first.

What should the chatbot send to Zapier?

Send the fewest fields that let someone act without opening the chat: who the person is, how to reach them, what they want and when they asked. PepoChat's Send to Zapier action posts exactly four fields, all collected or written by the agent:

{
  "event": "quote request",
  "customer_name": "Rose O'Neil",
  "customer_email": "[email protected]",
  "details": "50 premium bouquets, needed by Friday"
}
FieldFilled in byExampleUse it in the Zap for
eventThe agent, as a short labelquote requestA column you can sort or filter by hand
customer_nameThe visitor, asked by the agentRose O'NeilName column, Mailchimp first name, CRM contact
customer_emailThe visitor, exactly as typed[email protected]The lookup key that stops duplicates
detailsThe agent, a one- or two-sentence summary50 premium bouquets, needed by FridayNotes column, task description, deal note

The event label is free text the AI writes, so one kind of request can arrive as "quote request" on Monday and "Quote" on Tuesday. Route different requests with separate actions, each with its own Catch Hook URL and "when to use" text, instead of filtering on event inside one Zap.

The payload has no timestamp, so add one in Zapier with a system variable such as Current time: UTC (ISO), under Library → Variables → System; ISO times sort correctly even as text. The action cannot carry the conversation ID or a transcript link, because its placeholders come only from inputs the agent collects, and the email is exactly what the visitor typed, typos included.

For more fields, a custom action can post any JSON body to the same Catch Hook, with up to 10 required inputs the agent collects and fixed values you type once:

{ "event": "quote_request", "source": "website-chat", "customer_name": "{{customer_name}}", "customer_email": "{{customer_email}}", "company": "{{company}}", "details": "{{details}}" }

The new-lead webhook sends a fixed payload with IDs that make de-duplication exact: deliveryId stays the same when a failed delivery is retried, createdAt is the time of each attempt, and test is true only for the card's test sends. The lead generation guide prints the full payload and shows how to verify the signature.

Step 1: How do you create the Catch Hook in Zapier?

Create a Zap whose trigger is Webhooks by Zapier with the Catch Hook event, then copy the URL it shows. Zapier's Catch Hook guide, last updated 29 May 2026, describes the same steps.

  1. Open a new Zap in the Zap editor and click the Trigger step.
  2. Search for Webhooks by Zapier, set Event to Catch Hook and click Continue.
  3. Leave Pick Off A Child Key empty so every field comes through, and click Continue.
  4. In the Test tab, click Copy next to the webhook URL, which looks like https://hooks.zapier.com/hooks/catch/123456/abcde/, and keep the editor open.

Treat the Catch Hook URL as a password: anyone who has it can post rows into your sheet, and every PepoChat workspace member can see it on the action card, so if it leaks, set up a new Catch Hook and paste the new URL into the chatbot. The URL changes when the Zap is transferred to another user, and a Zap that is turned off keeps answering 200 for up to several hours before returning 404, so a stopped Zap can look healthy from the sending side.

Step 2: How do you add the webhook in the chatbot, and when should it fire?

Paste the Catch Hook URL into the chatbot and tell it precisely which requests should fire it. The Zapier integration docs cover the action, and the lead notification docs cover the webhook.

The Send to Zapier action

  1. Open Integrations → Zapier, paste the URL, tick Send to Zapier and click Add actions.
  2. Click Test on the new action card and enter sample values. The test sends a real POST, and Zapier accepts any well-formed Catch Hook URL, so confirm in the Zap's history that the sample arrived.
  3. In Zapier, click Test trigger to pull the sample into the editor.
  4. Edit the action's When to use text, up to 500 characters, so the agent knows which requests should start the Zap.
  5. Switch the action on, because it starts switched off.

A good When to use text names the request, the inputs and the order. A sharper version of PepoChat's default for a quote Zap reads: "Use when a visitor asks for a quote, a callback or a custom order. First collect their name, email and what they need (product, quantity, date), confirm the email, then send it once." The chatbot instructions guide has more wording patterns.

Fire the action before any handoff. PepoChat runs actions only while the agent is still answering, so a conversation that has been escalated to the team inbox can no longer start the Zap.

The new-lead webhook

  1. Open Widget Customization and scroll to When a new lead arrives, under Lead Capture.
  2. Switch on Send to a webhook URL and paste the Catch Hook URL.
  3. Click Send a test, which posts a lead called "Test Lead" with the email [email protected] and test set to true.
  4. Click Save Settings, which also generates the signing secret shown to owners and admins.

The webhook fires once per contact. Returning visitors and Test the agent chats never fire it, so the card's test button is the way to send a sample.

Step 3: How do you map the fields and test with a real chat?

Add the destination step, map each payload field to a column or property, run one real conversation, and only then publish the Zap. The steps below use Google Sheets.

  1. In the spreadsheet, type the headers in row 1: Received, Event, Name, Email, Details. Zapier reads headers only from the first row.
  2. In the Zap, add an action, choose Google Sheets and set Action event to Lookup Spreadsheet Row.
  3. Choose the spreadsheet and worksheet, set Lookup Column to Email and Lookup Value to customer_email from the trigger.
  4. Tick Create Google Sheets Spreadsheet row if it doesn't exist yet? and map the remaining columns, with the current time in Received.
  5. Click Test step, which writes a real row, then Publish.
  6. In PepoChat, open Test the agent, ask for a quote the way a visitor would, and check the new row and the Zap's run history.

Test chats in PepoChat are free and do not count toward your AI replies, but the action inside them is real, so each test posts to Zapier and uses a task. Check the awkward paths too: a visitor who refuses to give an email should produce no row, and a repeat request from the same address should add none.

Which Zap recipe fits each destination?

Each destination needs its own Zapier action and has one setting worth checking first. The table lists the action, the fields to map and the gotcha for six common destinations.

DestinationZapier actionWhat to mapGotcha
Google SheetsLookup Spreadsheet Row with "create if it doesn't exist", or Find or Create RowEmail as the lookup column; name, details, current timeHeaders in row 1 only; sorting the sheet, deleting rows or adding columns while the Zap is on can break it
MailchimpAdd/Update SubscriberAudience, Subscriber Email, Status, first nameNeeds the visitor's consent; Double Opt-In set to True sends a confirmation email first
NotionFind or Create Data Source Item (Zapier's Notion app calls databases data sources)Email property as the search key; title, details, dateGrant Zapier access to the database first; Select options must already exist in Notion
AirtableFind or Create RecordEmail field as the search key; other fieldsMultiple-select values go in as one comma-separated list
SlackSend Channel MessageName, email, details, conversation linkOften unnecessary: PepoChat posts new-lead cards and alerts to Slack natively, without a task
Kit (formerly ConvertKit)Add Subscriber to Form, or Add Tag to SubscriberEmail, first nameZapier's Kit app needs a paid Kit account, and new subscribers stay unconfirmed until they click Kit's double opt-in email

Action names and gotchas read on Zapier's app pages and help articles on 19 October 2026.

For a Notion database, create the properties first (a title for the name, an Email property, text for the details and a date), then grant Zapier access to that database, or it will not appear in the Zap.

Hands type on a laptop on a wooden desk beside a second laptop, a white smartphone and a potted plant
One lead can feed several apps, but on Zapier each extra destination is another action step, and each successful action is another task.

A Zap that writes to a sheet and also posts to Slack is multi-step, which Professional covers, and each of its successful actions uses a task. The support stack guide for a bootstrapped SaaS shows where a sheet or a CRM fits on a small budget.

Add someone to a Mailchimp audience only when they asked for your emails, and let Mailchimp's matching on email address prevent duplicates. Mailchimp's API reference identifies each audience member by an MD5 hash of the lowercased email address, so one address can be in one audience only once.

An upsert is a single call that adds a record when it is new and updates it when it already exists. Mailchimp's add-or-update endpoint works that way, with status_if_new for an address it has not seen. Zapier's help text for its Add/Update Subscriber action says it "can be used to update an existing subscriber too"; setting Update Existing to No halts the step instead, and an existing subscriber cannot be set back to pending. Either way, a retried run cannot add the same person twice.

PepoChat's Mailchimp action adds rather than updates: an address already on the list comes back as "Member Exists", and the agent tells the visitor they are already subscribed. The action subscribes immediately with the status "subscribed" and the first name when known. Double opt-in means a new subscriber must click a link in a confirmation email before counting as subscribed; to use it, change "status": "subscribed" to "status": "pending" in the action's body, as the Mailchimp integration docs describe.

Consent is a Mailchimp rule, not a nicety. Its Acceptable Use Policy, updated 26 September 2025, requires senders to "point to an opt-in form or show other evidence of consent" for commercial or marketing email. A visitor who left an email for a quote agreed to a reply about that quote, not to a newsletter, so never wire the new-lead webhook straight into a subscribed status.

Close-up of a hand with white painted nails holding a smartphone in a marble case, ready to tap the screen
A newsletter signup in chat should be the visitor's own yes, given after they know what they will receive and how often.

Make the yes explicit, specific and recorded. PepoChat's Mailchimp action is built for this: its default When to use text lets the agent subscribe someone only when they explicitly ask, and only after confirming the address with them.

  • Let the visitor ask. Add "Send me the monthly newsletter" as one of the three default suggestions in Widget Customization. Tapping it starts the conversation with that sentence, so the request is in the visitor's own message.
  • Let the agent offer once. Add "After answering, you may offer the monthly newsletter once" to How to sound and behave, and extend the action's When to use text with "or clearly says yes after you offered it".
  • Say what they will get. Name the address, the content and the frequency: "Would you like our monthly product news at [email protected]? One email a month, and you can unsubscribe from any of them."
  • Treat anything but yes as no. "Maybe later", "thanks" and silence are not consent.

The conversation holding the yes is your record. PepoChat keeps it until someone deletes it, unless Data retention is on, which deletes resolved conversations after 30 to 365 days; in that case use double opt-in, so Mailchimp keeps its own record. None of this is legal advice; the GDPR guide for chatbots covers lawful basis.

Why did my Zap fire twice, and how do you stop duplicate rows?

A Zap fires twice when the same data reaches its Catch Hook twice, and Zapier does not filter the repeat for you. Zapier's article on duplicate data says instant triggers do not use deduplication, and that when an app allows duplicates, as Google Sheets does, Zapier creates the duplicate record.

At-least-once delivery means a sender guarantees that a message arrives but may occasionally deliver it twice, usually by retrying after a timeout that came after the receiver had accepted the first copy. PepoChat's actions run at least once, and its new-lead webhook retries after timeouts and server errors, so either can, rarely, post a lead twice.

CauseWhat you seeFix
A rare retry of the Send to Zapier actionTwo identical rows seconds apartLook up the email before creating a row
A webhook retry after a timeout or 5xxTwo rows with the same deliveryIdLook up deliveryId or contact.id before creating
The visitor asked twice or corrected their emailTwo rows with different details or addressesKeep both or update the existing row; the latest is usually right
The action and the webhook feed one sheetOne row from each sender for the same personGive each sender its own Zap and worksheet
Test sendsRows for "Test Lead" or your own test chatsAdd a Filter step that continues only when test is false
Replaying an entire Zap runA repeated row after a replayReplay only the errored steps

The lookup is the main fix. In Google Sheets, a Lookup Spreadsheet Row step with Create Google Sheets Spreadsheet row if it doesn't exist yet? ticked writes a row only when the email is not already in the column, as Zapier's find and update rows guide describes. Notion and Airtable follow the same pattern with Find or Create Data Source Item and Find or Create Record, and Mailchimp needs nothing extra.

Pick the lookup key by sender. For the new-lead webhook, deliveryId matches only true retries, while contact.id matches any repeat of the person. For the Send to Zapier action, which carries no ID, the email is the only key, and it also merges two genuine requests from one person; if the newest details should win, follow the lookup with an Update Spreadsheet Row step that uses the row ID from the lookup.

A lookup is not a lock. Two runs that arrive within a second or two can both find nothing and both add a row, so glance at the sheet now and then; a duplicate is a nuisance, not a lost lead.

Clean up with the Zap switched off. Zapier's Google Sheets formatting rules warn that deleting rows, sorting the worksheet or renaming columns while a Zap is on can make it error. To read the leads in another order, add a second worksheet with a formula such as =SORT(Leads!A2:E, 1, FALSE) and leave the sheet the Zap writes to untouched.

Keep money out of this path. PepoChat's documentation advises against wiring refunds or payments as actions because a retry can repeat a write, and the same applies to any Zap step that charges a card or sends an invoice.

Volunteer sign-ups are a common use of the same Zapier and Mailchimp actions; the AI chatbot guide for nonprofits and churches shows the flow.

What to do next

  • Pick the sender: the Zapier action for specific requests, or the new-lead webhook to log every contact.
  • Build the Google Sheets Zap with a lookup on the email column and test it with one real chat.
  • Read the lead generation guide on when to ask for an email, then start a free PepoChat workspace: every feature is on the free plan, including both senders and the Mailchimp action.

Frequently asked questions

Can a chatbot write to Google Sheets without code?
Yes. The chatbot posts each lead as JSON to a webhook URL, and a no-code tool such as Zapier writes it to a sheet. In Zapier that is a Catch Hook trigger followed by Google Sheets' Lookup Spreadsheet Row step, which adds a row only when the email is new. As of October 2026, Zapier's Catch Hook needs a paid plan from $19.99 a month billed yearly.
What is a Zapier Catch Hook?
A Catch Hook is a trigger in the Webhooks by Zapier app that gives your Zap its own URL. A chatbot or any other app sends data to that URL, Zapier answers with a 200 status, and the Zap runs once per request, or once per object when the body is a JSON array. As of October 2026, Catch Hook is on Professional, Team and Enterprise, not Free.
What data should a chatbot send to Zapier?
Send the fewest fields someone needs to act: the visitor's name and email, a short label for the request and a one- or two-sentence summary of what they want. Add an ID when the sender has one, because it makes de-duplication exact. PepoChat's Send to Zapier action posts event, customer_name, customer_email and details, so add the time in Zapier.
Can the chatbot add people to a Mailchimp audience?
Yes, but only people who ask for your emails. PepoChat's Mailchimp action subscribes a visitor after they explicitly request the newsletter and confirm their address, and an address already on the list returns Member Exists instead of a duplicate. For double opt-in, change the status in the action's body to pending. Mailchimp's Acceptable Use Policy requires evidence of consent for marketing email.
Why did my Zap fire twice?
The same data reached its Catch Hook twice. Webhook triggers do not deduplicate, and senders that deliver at least once can occasionally retry a request Zapier had already accepted. A visitor asking twice, test sends and replaying an entire Zap run also cause repeats. Look up the email or delivery ID before creating a row, for example with Lookup Spreadsheet Row and its create-if-missing option.
Is Zapier's free plan enough for this?
No. As of 19 October 2026, Zapier's Free plan does not include Webhooks by Zapier, so it cannot catch a chatbot's webhook, and it allows only 100 tasks a month and two-step Zaps. Professional includes webhooks and 750 tasks from $19.99 a month billed yearly, or $29.99 monthly. PepoChat's Mailchimp action and the Contacts CSV export are free routes that skip Zapier.

Try this on your own site in ten minutes

PepoChat includes every feature on the free plan — 200 AI replies and 5 knowledge sources a month, no credit card.