Help Center

Recipes for HubSpot, Pipedrive, Salesforce, Sheets and Slack

Short recipes and a field map for the places owners most often want their leads to land.

Once a webhook reaches Zapier, Make or n8n, the last step is a short one: create the record, or post the message. These recipes name the action to use for each destination and the fields to map.

Use this guide when

You already have a lead webhook reaching an automation tool and you need the last step for your CRM, your spreadsheet or your chat channel.

Before you start

  • Set up the receiving tool first. Use the Zapier, Make or n8n guide, and confirm that a test event passes your signature check.
  • Have your login details for the destination ready. Each tool asks you to connect the account once.
  • Decide which field identifies a person in your destination, usually the email address.

Steps

  1. Pick your destination below and add the action it names to the tool's workflow, after the signature check.
  2. Connect the account when the tool asks. The tool stores the connection for the next runs.
  3. Map the fields using the field map further down this guide. Set a fallback value for anything your destination requires and a lead may not have, such as an empty company.
  4. Add the duplicate step the recipe names, so a retry, a replay or a second form submission does not create a second record.
  5. Request one test from the Test history tab in Zapped, confirm the action runs, and then remove or route the invented test record.
  6. Capture one lead through your own published card and check the record it creates.

A test event carries invented values and null identifiers, so any rule you build on a card id will not match it. Keep a test path separate, and confirm the card rules with a real lead.

HubSpot

HubSpot's own webhook workflow trigger cannot create a contact from an incoming lead. It only enrols a record that already exists, matched on a unique property, and it is limited to the higher HubSpot plans. Route the lead through Zapier, Make or n8n instead.

In Zapier use Create or Update Contact. In Make use Create or Update a Contact. In n8n use the HubSpot node with Create/Update a contact. HubSpot needs at least one of email, first name or last name to create a contact, and the email address from the lead is the natural match, so map data.lead.email as the matching field.

Pipedrive

Pipedrive sends webhooks out; it does not receive them to create records. Create the person through your automation tool and let Pipedrive keep the record.

In Zapier use Find or Create Person, or Create Person when you already deduplicate by event id. In Make use Create a Person with a search before it. In n8n use the Pipedrive node with Create a person.

A Pipedrive lead needs a title, and it links to a person or an organization, so create the person first and use the email address as the match.

Salesforce

Salesforce has no listener that accepts an outside webhook directly, so route the lead through Zapier, Make or n8n and let the tool write the record.

In Zapier use Find or Create Record or Create Lead. In Make use Create a record. In n8n use the Salesforce node with Create a lead, or the upsert version so a repeat updates the same lead.

A Salesforce lead usually needs a last name and a company. When data.lead.company is empty, map a fixed value such as the card name from data.card.name so the record can be saved.

Google Sheets

A Google Apps Script web app cannot be a direct destination, because it answers with a redirect and Zapped never follows one. Add the row from your automation tool instead.

In Zapier use Create Spreadsheet Row, or Find or Create Row to avoid a second copy. In Make use Add a Row, with Search Rows and a filter before it. In n8n use the Google Sheets node with Append or Update Row and choose the column to match on.

Give your sheet a heading row first, then map the fields in the same order. Keep the event id in its own column so you can recognise a repeat.

Slack

Slack's incoming webhook is a posting address, not a receiver, so the message has to come from your automation tool.

In Zapier use Send Channel Message. In Make use Send a Message. In n8n use the Slack node with Send a message. Each tool asks you to connect your Slack account once.

Keep the message short: the name, the email address, the phone number, the message, and the card name. Add the custom answers as one line if you configured your own questions.

The field map

These are the fields in a lead event. Read them from the parsed body: data.lead, data.card, data.consent and data.custom_fields. A missing answer arrives as null, so give your destination a fallback where it cannot accept an empty value.

  • id: the event id. It is also sent as the webhook-id header, and it is what you compare to drop a repeat.
  • type: lead.created for a real lead, webhook.test for a test event.
  • occurred_at: when the lead was captured, in UTC. Use it when the order of leads matters.
  • data.lead.id: the lead's identifier in Zapped, as text. Null on a test.
  • data.lead.duplicate_of_lead_id: set when the same visitor sent the form again, otherwise null.
  • data.lead.capture_preset: which form template captured the lead.
  • data.lead.intent: what the form was set up for.
  • data.lead.source_channel: where the form was filled in.
  • data.lead.name, email, phone, company, message: the visitor's answers. Map email as the matching field for a person, and put message into a note or a description rather than the name.
  • data.card.id and data.card.block_id: the card and the block that captured the lead. Null on a test, so a card rule never matches a test.
  • data.card.name and data.card.url_alias: the card's name and address label at the time of capture.
  • data.consent.notice_language and privacy_notice_version: which privacy notice the visitor saw.
  • data.consent.marketing_consent_at: when the visitor agreed to marketing, or null. Check this before you add a contact to a list or start a sequence.
  • data.consent.marketing_consent_version and marketing_consent_source: which consent text the visitor agreed to, and where it was given.
  • data.custom_fields: null, or the form snapshot with schema_version, template_key, intent, form_headline and answers.
  • data.custom_fields.answers: a list. Each entry has question_id, question_label and type, then value for a typed answer or selected_options for a choice.
  • data.custom_fields.answers[].selected_options: a list of option_id and option_label. Join the labels into one line for a note or a message.

Before any marketing step

A visitor can send a message without agreeing to marketing, and the email address alone does not prove consent. Only continue into a marketing list, a sequence or an advertising audience when data.consent.marketing_consent_at has a value. The version and source fields tell you which text they agreed to, which is what you need if anyone asks later.

Plans and availability

Lead webhooks are included with Professional. Open Account, then Lead webhooks, and save your HTTPS destination to get started. Delivery begins only after you configure a destination and the service is available. Custom-plan access follows your agreement.

Good ways to use this

  • Write into one place per lead and let that place be the record of truth. Add the note or the message from the same action rather than from a second path.
  • Match on the email address in a CRM, and on the event id in a spreadsheet, so both a retry and a genuine second enquiry behave sensibly.
  • Keep a column or a field for the event id, so you can always explain why a row exists.
  • Check the consent date before any marketing step, every time, in the workflow itself rather than by hand.

Common questions

Can HubSpot create a contact from the webhook directly?

No. HubSpot's webhook workflow trigger only enrols a record that already exists, so it needs the contact before it can act. Create the contact through Zapier, Make or n8n, and let HubSpot's workflows take over from there.

Can I post to a Google Apps Script web app?

No, not as a destination. Google answers the request with a redirect to a one time address, and Zapped never follows a redirect. Add the row from your automation tool instead.

Which field should identify a person?

The email address, when the form asks for it. If a lead has no email address, use the phone number, or fall back to the name and company. Whichever you choose, use the same field every time so lookups keep working.

How do I keep two systems in step?

Send the webhook to one automation tool and let that tool write to both systems. Two paths from two destinations would need two destinations, and the account has one.

If something looks wrong

  • If the CRM record is missing although the delivery says Delivered, open the automation tool's own history. The action after the signature check is where the failure is.
  • If a record is created twice, the action is a plain create rather than a find or create, or the duplicate check sits after the write. Move it before the write.
  • If the destination rejects the record, one of its required fields is empty. Fill it from the card name or the email address, then run the test again.
  • If a card rule never matches, you tested it with a test event, which has no card id. Confirm the rule with a real lead from that card.
  • If a marketing step ran for someone who never agreed, the consent check is missing or is read from the wrong field. Compare data.consent.marketing_consent_at against null before the step.
  • If the spreadsheet has a shifted column, a quoted value in your heading row is being split on its comma. Rename that heading and re-map the fields.

Was this guide helpful?

Still have questions? Contact support and we'll help you out.