← All 12 CRMs · Make guide · Zapier guide
Connection type: API. HTTP modules only after they have said yes. Canonical crm value: connective.
If the answer is no, stop. Use the Sheets bridge the same week. Do not half-build an HTTP scenario you cannot authenticate.
Current rate, lender and product usually live on the opportunity / loan. The email lives on the client. Your HTTP search should join them, or you run two requests using the URLs they issued. Create the five TBT fields on one object and stay there.
Exclude opportunities still in lodgement or unconditionally approved. This engine is for settled existing clients.
Fields for this CRM
Create the ones marked YES. Map the ones you already store. Do not invent a second current-rate field.
| Purpose | Canonical | This CRM | Required | Create? |
|---|---|---|---|---|
| Contact ID | contact_id | contactId | Yes | No |
| First name | first_name | firstName | Yes | No |
| Last name | last_name | lastName | No | No |
email | email | Yes | No | |
| Mobile | mobile | mobile | Recommended | No |
| Current rate | tbt_current_rate | custom.tbt_current_rate | Yes | Map or create |
| New-money rate | tbt_new_money_rate | custom.tbt_new_money_rate | Yes | YES - create or maintain |
| Loyalty gap (bps) | tbt_loyalty_gap_bps | custom.tbt_loyalty_gap_bps | Yes | YES - create / compute |
| Lender | lender | lender | Recommended | No |
| Product name | product_name | productName | Recommended | No |
| Existing client flag | existing_client | existingClient | Yes | Map |
| Email opt-out | email_optout | emailOptOut | Yes | No |
| Loyalty state | tbt_loyalty_state | custom.tbt_loyalty_state | Yes | YES - create this |
| Last loyalty touch | tbt_last_loyalty_touch | custom.tbt_last_loyalty_touch | Yes | YES - create this |
| Broker owner | broker_owner | ownerId | Recommended | No |
| Broker email | broker_email | set in watch mapper | Yes | Set in the watch |
Full translation and notes: 05-templates/CRM-Field-Map.csv. Gap is in basis points. Example: current 6.40 and new-money 5.90 is a 50 bps gap. Default watch threshold is 25 bps.
Make — watch file to import
No dedicated watch file for this CRM. There is no dedicated Connective watch file. HTTP search using the URL they issued → map to the canonical payload → POST to the outreach webhook. Or import the Sheets bridge until access is granted. See 02-notes.md. Everyone still imports the outreach blueprint.
Fallback file: 02-make-blueprints/01e-TBT-Loyalty-Tax-Watch-GoogleSheets-Bridge.blueprint.json.
Everyone also imports 02-make-blueprints/02-TBT-Loyalty-Tax-Outreach.blueprint.json. Import outreach first so you have the webhook URL. Walkthrough: MAKE-Setup-Guide.html.
Make — last-step swap
On the outreach scenario, modules 7, 8 and 9 are HTTP placeholders labelled SWAP. Replace them. The middle (consent, gap gate ≥ 25 bps, OpenAI, broker Gmail) does not change.
| Outreach module | Swap for |
|---|---|
| 7 · Create the broker task — SWAP | HTTP request to the task/activity URL they issued. Title {{3.broker_task_title}}, body {{3.broker_task_body}}, linked to contact_id. |
| 8 · Write the CRM note — SWAP | HTTP POST a note. Body {{3.crm_note}}. |
| 9 · Stamp loyalty touch — SWAP | HTTP PATCH using field-map names (custom.tbt_loyalty_state, custom.tbt_last_loyalty_touch). Confirm with the aggregator. Do not skip. |
Stamp body (use this CRM’s field names from the table):
{
"tbt_loyalty_state": "touched",
"tbt_last_loyalty_touch": "{{formatDate(now; \"YYYY-MM-DD\")}}"
}
Zapier — first module and last three
Zapier cannot import a Make blueprint. Build two Zaps by hand. Full click-path: ZAPIER-Setup-Guide.html. This page is the CRM-specific first and last steps only.
| Where | What |
|---|---|
| Zap A · first module | Webhooks by Zapier → Custom Request against the search URL they issued (Mercury / Connective CRM, whichever they grant). Filter gap ≥ 25, settled, not opted out. Then POST the canonical payload to Zap B. Map contactId, firstName, custom.tbt_*. |
| Zap B step | Module |
|---|---|
| B6 Task | Webhooks → Custom Request. Task URL they issued. Title from broker_task_title. |
| B7 Note | Webhooks → Custom Request. Note URL they issued. Body from crm_note. |
| B8 Stamp | Webhooks → Custom Request. Update URL they issued. State = touched, last touch = today. |
Zap A then POSTs the canonical keys (see the field-map Canonical column) to Zap B’s Catch Hook. Leave auto_email_client as false. Replace [YOUR BROKER EMAIL], [YOUR FIRST NAME], [YOUR BUSINESS NAME].
- Some groups already store a current rate. Map it rather than creating a second number you will forget to update.
- Leave
auto_email_clientasfalse. Default is email the broker, not the client.
01e)
If API access is refused, export settled clients with current rate, new-money rate and gap into the Google Sheet and import 01e the same week.
T Test on yourself before any live send
- Create yourself as a settled existing-client test record with a real email you read, a current variable rate, a new-money / retention reference, and
tbt_loyalty_gap_bpsat or above 25. Statedueorqueued. Last touch empty. - Run the watch (Make scenario 01, or Zap A) with a limit of 1, filtered to only this record.
- Confirm the broker email arrives. Confirm you did not get a client email.
auto_email_clientstaysfalse. - Confirm the broker task, the CRM note (or sheet write-back), and the stamp: state
touched, last touch = today. - Run again the same day. The engine must not draft you a second time. Then set state to
opt_outand run again — must not draft.
If the stamp fails, stop. Fix it before anyone else is in the set. After the loop is proven on you, you may flip auto_email_client — not before. Read 04-compliance first.