Docs · Recipes

Check leads in Make before they reach your sequencer

A short scenario: a new lead comes in, Precleared checks it, and a router sends cleared leads to your sequencer and everything else back to your sheet with the next step.

New lead → Precleared check → Router ─┬─ verdict is ok_to_email → Add to sequencer → Record it in the sheet
                                       └─ anything else ─────────────────────────→ Record it in the sheet

1. The trigger

Use Google Sheets → Watch New Rows if your leads live in a sheet, or Webhooks → Custom webhook so Clay, your CRM or a form can post leads to the scenario. You need each lead's email, first name, last name, company and address source. A company number and recipient country are optional.

2. The check

Add HTTP → Make a request.

SettingValue
Authentication typeNo authentication
URLhttps://precleared.dev/api/v1/check
MethodPOST
HeadersName Authorization, value Bearer pc_live_...
Body content typeapplication/JSON
Body input methodJSON string
Parse responseYes
Return error if HTTP request fails (advanced settings)No

Body, with the fields from your trigger mapped in:

{
  "recipient_email": "{{1.email}}",
  "address_source": "{{1.address_source}}",
  "sender_country": "GB",
  "pitch": "route-planning software for delivery firms",
  "company_number": "{{1.company_number}}",
  "recipient_country": "{{1.recipient_country}}"
}

Change sender_country to US if your business is based in the US, and pitch to what you offer. Blank optional fields are ignored, and a blank address source counts as unknown. With "Return error if HTTP request fails" set to No, a used-up allowance comes back as data instead of stopping the scenario, and the router treats it as not cleared.

Module numbers such as {{1.email}} and {{2.data.verdict}} depend on the order you add modules. Click into each field and pick the value from the list rather than typing it.

3. The router

Add a Router with two routes, each with a filter.

RouteCondition
Cleared{{2.data.verdict}}, Text operators: Equal to, ok_to_email
Not cleared{{2.data.verdict}}, Text operators: Not equal to, ok_to_email

4. Add cleared leads to your sequencer

On the Cleared route, use Make's own module for your sequencer, or add HTTP → Make a request with the settings for your tool below. Use the same body settings as in step 2. Each one keeps the receipt id {{2.data.receipt.id}} with the lead where the tool allows it. Your campaign or sequence id is in its URL in the sequencer.

Instantly

URL https://api.instantly.ai/api/v2/leads/add, method POST, header Authorization: Bearer YOUR_INSTANTLY_API_KEY. The key needs the leads:create scope.

{
  "campaign_id": "YOUR_CAMPAIGN_ID",
  "skip_if_in_workspace": true,
  "leads": [{
    "email": "{{1.email}}",
    "first_name": "{{1.first_name}}",
    "last_name": "{{1.last_name}}",
    "company_name": "{{1.company_name}}",
    "custom_variables": { "precleared_receipt": "{{2.data.receipt.id}}" }
  }]
}

Smartlead

URL https://server.smartlead.ai/api/v1/campaigns/YOUR_CAMPAIGN_ID/leads?api_key=YOUR_SMARTLEAD_API_KEY, method POST.

{
  "lead_list": [{
    "email": "{{1.email}}",
    "first_name": "{{1.first_name}}",
    "last_name": "{{1.last_name}}",
    "company_name": "{{1.company_name}}",
    "custom_fields": { "precleared_receipt": "{{2.data.receipt.id}}" }
  }]
}

lemlist

URL https://api.lemlist.com/api/campaigns/YOUR_CAMPAIGN_ID/leads/?deduplicate=true, method POST, header Authorization with the value Basic {{base64(":YOUR_LEMLIST_API_KEY")}}. That's lemlist's basic authentication: an empty username and your API key as the password.

{
  "email": "{{1.email}}",
  "firstName": "{{1.first_name}}",
  "lastName": "{{1.last_name}}",
  "companyName": "{{1.company_name}}",
  "precleared_receipt": "{{2.data.receipt.id}}"
}

Apollo

Two HTTP modules, both with the header x-api-key: YOUR_APOLLO_MASTER_API_KEY. Adding contacts to a sequence needs a master key.

First, POST to https://api.apollo.io/api/v1/contacts to create or match the contact:

{
  "email": "{{1.email}}",
  "first_name": "{{1.first_name}}",
  "last_name": "{{1.last_name}}",
  "organization_name": "{{1.company_name}}",
  "run_dedupe": true
}

Then POST to https://api.apollo.io/api/v1/emailer_campaigns/YOUR_SEQUENCE_ID/add_contact_ids, mapping the contact id from the module before:

{
  "emailer_campaign_id": "YOUR_SEQUENCE_ID",
  "contact_ids": ["{{4.data.contact.id}}"],
  "send_email_from_email_account_id": "YOUR_MAILBOX_ID"
}

To find your mailbox id, call GET https://api.apollo.io/api/v1/email_accounts with the same header. Apollo starts sending as soon as a contact joins an active sequence, so test with a paused one first.

5. Record the result

End both routes in Google Sheets. If the trigger is Watch New Rows, use Update a Row, map Row number from the trigger, and write the verdict, the next step and the receipt id. If the trigger is a webhook, use Add a Row to a results sheet instead. On the Cleared route, also note that the lead was added.

Running it

Schedule it every 15 minutes, or run it straight away from a webhook. Each lead uses one Precleared check: a free key covers 25 a day and a £39 pack covers 2,000. Make doesn't trigger twice for the same row, so to check a lead again, for example after adding a company number to an unknown one, run the scenario on that lead by hand.

See footers and receipts, which work the same way in every recipe.

Decision support with sources, not legal advice.