← All 12 CRMs · Make guide · Zapier guide
Connection type: Sheets bridge. Export settled clients that have a current rate and a new-money / retention reference. Keep column headers exact.
Copy 05-templates/Google-Sheet-Bridge-template.csv into a new Google Sheet. Keep the header row. Name the first tab Loyalty tax (that is what the watch looks for — rename the tab or change the module to match).
- Paste settled clients only. Map onto the canonical headers.
existing_clientmust beTRUE.source_crm=activepipe. - Fill
tbt_current_rate,tbt_new_money_rate,tbt_loyalty_gap_bps(current − new-money) × 100. Seedtbt_loyalty_stateasdue. - Map ActivePipe’s own unsubscribe list onto
email_optoutbefore the first run. - Share the Sheet with the Google account you will connect to Make / Zapier.
If you rename tbt_loyalty_gap_bps to Gap, module 1 finds nobody. The TEST-YOU row is the one you run first.
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 | contact_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_owner | Recommended | No |
| Broker email | broker_email | broker_email | 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
Import 02-make-blueprints/01e-TBT-Loyalty-Tax-Watch-GoogleSheets-Bridge.blueprint.json.
Import this file — not the HubSpot watch. Connect Google Sheets. Pick the spreadsheet. Sheet name defaults to Loyalty tax. Paste the outreach webhook URL. Replace broker placeholders. Leave auto_email_client false.
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 | There is no ActivePipe task module in this pack. Keep the broker Gmail (already in blueprint 02) as the task. Optionally append a row to a Write-back tab: contact_id, title, stamp. |
| 8 · Write the CRM note — SWAP | Optional: Google Sheets → Add a row on a Write-back tab with {{3.crm_note}}. Re-import into ActivePipe only if you need the marketing list annotated. Honouring opt_out on the Sheet is not optional. |
| 9 · Stamp loyalty touch — SWAP | Google Sheets → Update a row on the Loyalty tax tab. Set tbt_loyalty_state = touched and tbt_last_loyalty_touch = today. Match on contact_id. 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 | Schedule by Zapier (daily 09:00) + Google Sheets Lookup Spreadsheet Rows (or New Spreadsheet Row if you append). Filter existing_client TRUE, gap ≥ 25, state not opt_out / touched. Then Webhooks → POST canonical keys to Zap B. Set crm from source_crm or activepipe. |
| Zap B step | Module |
|---|---|
| B6 Task | Skip a native ActivePipe task. The broker Gmail in Zap B is the task. Optional: Google Sheets Create Spreadsheet Row on a Write-back tab. |
| B7 Note | Optional Sheets write-back of crm_note. Add a CRM note in ActivePipe by hand that week if you need it on the file. |
| B8 Stamp | Google Sheets → Update Spreadsheet Row. tbt_loyalty_state = touched, tbt_last_loyalty_touch = today. Lookup key = contact_id. |
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].
- Do not also send the same people an ActivePipe “keep in touch” drip in the same week as a loyalty-tax draft.
- Leave
auto_email_clientasfalse. Default is email the broker, not the client.
01e)
This bridge is the path. If you later get a different CRM with native access, swap to that watch. Until then, stay on 01e.
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.