FR
Make.comIntegration guide

Make.com

Capture leads from Facebook Lead Ads, Typeform, custom Webhook via Make's HTTP module — step-by-step with screenshots.

Setup

Create a scenario with your source as trigger and the HTTP > Make a request module as action.

Create a new scenario

In Make.com, click Create a new scenario. Pick a trigger (Facebook Lead Ads, custom Webhook, Typeform — depending on your source).

Creating a scenario in Make

Add the HTTP module

After the trigger, add the HTTP > Make a request module. Not the generic "Webhook response" module — that one is for receiving, not sending.

HTTP Make a request module

Configure URL, method and headers

URL: https://app.capturia.io/api/v1/leads/capture

Method: POST

Headers:

  • Authorization: Bearer cap_live_xxxxxxxx
  • Content-Type: application/json

Body type: Raw

Content type: JSON (application/json)

URL method headers configuration

Build the JSON body

In Request content, write the literal JSON with Make variables between {{ }}:

{
  "phone": "{{1.phone_number}}",
  "sms_consent": true,
  "first_name": "{{1.first_name}}",
  "email": "{{1.email}}",
  "source_label": "make_scenario",
  "utm": {
    "source": "{{1.utm_source}}",
    "campaign": "{{1.utm_campaign}}"
  }
}

{{1.fieldname}} refers to module 1 (the trigger). Adapt to the module number in your scenario.

JSON body in Make HTTP module

Capture SMS consent

If your source has a consent field, map it: "sms_consent": "{{1.consent_field}}" (Capturia accepts true, "yes", "oui", etc.).

If no source field, hardcode "sms_consent": true but keep external proof (landing page checkbox, archived copy). See the LCAP section below.

Mapping sms_consent in Make

Test and activate

Click Run once to execute the scenario on the last trigger lead. Check the HTTP module: output 200 with body { "status": "created", ... } confirms the connection. Activate the scenario via the ON toggle at the bottom left.

Test and scenario activation

Field mapping

The mapping below is for a Facebook Lead Ads trigger. For other triggers (Typeform, custom Webhook), adapt source field names — the Capturia target stays the same.

Capturia fieldRequiredSource fieldNotes
phoneYes{{1.phone_number}}E.164 (+15145551234), NANP 10 or 11 digits, or formatted (514) 555-1234 / 514-555-1234. 10-digit numbers auto-prefixed with +1.
sms_consentYes{{1.consent}} ou trueBoolean true OR string 'true' / 'yes' / 'oui' / 'vrai' / '1' / 'on' / 'checked' (case-insensitive). Accepted at the body root or inside the `customData` object (GoHighLevel webhooks).
first_nameNo{{1.first_name}}Lead's first name
last_nameNo{{1.last_name}}Last name
emailNo{{1.email}}RFC 5322 valid email
source_labelNo"make_scenario"Free-form tag (e.g. 'webflow_form', 'fb_lead_ads')
utm.sourceNo{{1.utm_source}}Nested utm object (not flat)
utm.mediumNo{{1.utm_medium}}Nested utm object
utm.campaignNo{{1.utm_campaign}}Nested utm object
tagsNo[]Array of strings
pipeline.idNo(optionnel)Target pipeline UUID
pipeline.stage_idNo(optionnel)Target stage UUID

SMS Consent — CASL / Quebec Law 25

The sms_consent field is required. Canada's Anti-Spam Law (CASL) and Quebec's Law 25 require explicit consent before any commercial SMS. Capturia stores a timestamped record of this attestation for your legal protection.

Recommended pattern — consent captured at source

Add a custom consent question directly in the source form (FB Lead Form custom question, Typeform field, GHL form checkbox). Map this field to sms_consent. Consent is explicit, dated, and tied to the lead who gave it.

Alternative pattern — checkbox on the landing page

If the source form doesn't allow custom questions, add a consent checkbox on the landing page before the ad. Keep a copy of the page (Wayback Machine, dated screenshot) as evidence.

Legal grey area

Hardcoding sms_consent: true without real lead attestation = legal risk. In case of complaint, Capturia may be required to provide proof of consent. Without proof, liability falls on the SMB owner.

Step-by-step test

Click Run once to execute the scenario on the last trigger lead. Check the HTTP module: output 200 with body { "status": "created", ... } confirms the connection. Activate the scenario via the ON toggle at the bottom left.

Error catalog

CodeErrorCauseFix
401missing_api_keyAuthorization header absent or malformedAdd the header Authorization: Bearer cap_live_...
401invalid_api_keyKey revoked, expired, or typoCheck the key in the dashboard, generate a new one if needed
403terms_acceptance_requiredToS not accepted (or version bump forced re-consent)The SMB owner must re-accept ToS in the dashboard
403insufficient_scopeKey lacks the leads:capture scopeCreate a new key with the 'Lead capture' preset
422invalid_phonePhone format not recognizedUse E.164 (+15145551234) or NANP 10 digits (5145551234)
422missing_consentsms_consent absent, false, or unrecognized value — the field is looked up at the body root AND inside the customData object (GHL)Map the consent field to sms_consent (true / yes / oui). From GHL: fixed value true behind a condition on the consent checkbox
422invalid_payloadOther field malformed (email, utm object vs flat, etc.)Check the body format — see the leads:capture API doc
429rate_limited_keyPer-key quota exceeded (often 100 req/min)Throttle at source, or request a tier upgrade from support
429rate_limited_ipPer-IP quota exceededReduce the rate or contact support
400invalid_payloadBody is not valid JSON (Form or form-urlencoded sent instead)Configure Payload Type = JSON / Content-Type = application/json

FAQ — common pitfalls

SymptomCause
Platform test green (200 OK) but lead doesn't show up in pipelinePhone matches an existing contact — response status: idempotent_replay. The lead exists but isn't duplicated. Test sandboxes often reuse the same number.
400 "Body is not valid JSON"Payload Type set to Form instead of JSON, or body sent as x-www-form-urlencoded instead of application/json.
200 OK response but no SMS sent to leadsms_consent: true but AI agent not configured, or SMS AI agent disabled, or no Twilio number provisioned for the client.
Lead created without UTM trackingutm field sent as flat (utm_source) instead of nested object (utm.source). Server expects an object.
403 terms_acceptance_required after an update that used to workToS version bump on Capturia side forces the SMB owner to re-accept in the dashboard before the key works again.