← All 12 CRMs · Make guide · Zapier guide
Connection type: API. HTTP modules only after they have said yes. Canonical crm value: effi. This pack does not invent an Effi endpoint.
If the answer is no, stop. Export settled clients to the Google Sheet and import 01e the same afternoon. Do not half-build an HTTP scenario you cannot authenticate.
Adviser / broker id should travel with the record so the broker task lands on the person who owns the file. Do not pull supporting-document contents into the prompt. Names, rates, gap, lender — that is enough.
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 | client_id | Yes | No |
| First name | first_name | first_name | Yes | No |
| Last name | last_name | last_name | No | No |
email | email | Yes | No | |
| Mobile | mobile | mobile | Recommended | No |
| Current rate | tbt_current_rate | tbt_current_rate | Yes | Map or create |
| New-money rate | tbt_new_money_rate | tbt_new_money_rate | Yes | YES - create or maintain |
| Loyalty gap (bps) | tbt_loyalty_gap_bps | tbt_loyalty_gap_bps | Yes | YES - create / compute |
| Lender | lender | lender | Recommended | No |
| Product name | product_name | product_name | Recommended | No |
| Existing client flag | existing_client | existing_client | Yes | Map |
| Email opt-out | email_optout | email_optout | Yes | No |
| Loyalty state | tbt_loyalty_state | tbt_loyalty_state | Yes | YES - create this |
| Last loyalty touch | tbt_last_loyalty_touch | tbt_last_loyalty_touch | Yes | YES - create this |
| Broker owner | broker_owner | broker_id | 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 Effi watch file. HTTP search using the URL they issued → canonical payload → outreach webhook. Or the Sheets bridge. See 02-notes.md.
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 task using the URL they issued. Title {{3.broker_task_title}}, body {{3.broker_task_body}}. |
| 8 · Write the CRM note — SWAP | HTTP note. Body {{3.crm_note}}. |
| 9 · Stamp loyalty touch — SWAP | HTTP update. Field-map names: tbt_loyalty_state, tbt_last_loyalty_touch. Confirm with the tenant. 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. Filter gap ≥ 25, existing clients. Then POST canonical payload to Zap B. Map client_id, first_name, tbt_*, broker_id. |
| Zap B step | Module |
|---|---|
| B6 Task | Webhooks → Custom Request. Task URL they issued. |
| 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].
- No key yet: copy
Google-Sheet-Bridge-template.csv, keep those headers, paste your rows, upload to Google Sheets, import01e. You are live on the bridge the same afternoon. - Leave
auto_email_clientasfalse. Default is email the broker, not the client.
01e)
If the group refuses the key, use the Sheets bridge (01e) the same week. Stamp the sheet. Add a note back in Effi by hand if you need it on the file.
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.