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).

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.

Configure URL, method and headers
URL: https://app.capturia.io/api/v1/leads/capture
Method: POST
Headers:
Authorization:Bearer cap_live_xxxxxxxxContent-Type:application/json
Body type: Raw
Content type: JSON (application/json)

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.

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.

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.

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 field | Required | Source field | Notes |
|---|---|---|---|
| phone | Yes | {{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_consent | Yes | {{1.consent}} ou true | Boolean 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_name | No | {{1.first_name}} | Lead's first name |
| last_name | No | {{1.last_name}} | Last name |
| No | {{1.email}} | RFC 5322 valid email | |
| source_label | No | "make_scenario" | Free-form tag (e.g. 'webflow_form', 'fb_lead_ads') |
| utm.source | No | {{1.utm_source}} | Nested utm object (not flat) |
| utm.medium | No | {{1.utm_medium}} | Nested utm object |
| utm.campaign | No | {{1.utm_campaign}} | Nested utm object |
| tags | No | [] | Array of strings |
| pipeline.id | No | (optionnel) | Target pipeline UUID |
| pipeline.stage_id | No | (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
| Code | Error | Cause | Fix |
|---|---|---|---|
| 401 | missing_api_key | Authorization header absent or malformed | Add the header Authorization: Bearer cap_live_... |
| 401 | invalid_api_key | Key revoked, expired, or typo | Check the key in the dashboard, generate a new one if needed |
| 403 | terms_acceptance_required | ToS not accepted (or version bump forced re-consent) | The SMB owner must re-accept ToS in the dashboard |
| 403 | insufficient_scope | Key lacks the leads:capture scope | Create a new key with the 'Lead capture' preset |
| 422 | invalid_phone | Phone format not recognized | Use E.164 (+15145551234) or NANP 10 digits (5145551234) |
| 422 | missing_consent | sms_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 |
| 422 | invalid_payload | Other field malformed (email, utm object vs flat, etc.) | Check the body format — see the leads:capture API doc |
| 429 | rate_limited_key | Per-key quota exceeded (often 100 req/min) | Throttle at source, or request a tier upgrade from support |
| 429 | rate_limited_ip | Per-IP quota exceeded | Reduce the rate or contact support |
| 400 | invalid_payload | Body is not valid JSON (Form or form-urlencoded sent instead) | Configure Payload Type = JSON / Content-Type = application/json |
FAQ — common pitfalls
| Symptom | Cause |
|---|---|
| Platform test green (200 OK) but lead doesn't show up in pipeline | Phone 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 lead | sms_consent: true but AI agent not configured, or SMS AI agent disabled, or no Twilio number provisioned for the client. |
| Lead created without UTM tracking | utm 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 work | ToS version bump on Capturia side forces the SMB owner to re-accept in the dashboard before the key works again. |