CRM 01 · Salesforce · Native

Salesforce. Sign in and go.

Make and Zapier both have a native Salesforce app. Import the Salesforce watch. Create the five TBT fields on Contact (Salesforce appends __c) before you import or the modules show as invalid.

Nativev1.0Five TBT fieldsGap default 25 bps$99 AUD once

← All 12 CRMs · Make guide · Zapier guide

Connection type: Native. OAuth to the org that holds settled clients. Do not include Leads. This engine is for existing clients only.

Object

Contact by default. If rates live on a custom Loan / Opportunity, keep Contact as the person the broker email is about and look the loan fields up, or filter a Report that already joins them. Person Accounts: create the five fields on Account and map those instead.

Setup → Object Manager → Contact → Fields & Relationships → New. Use the API names in the table. Exclude DoNotCall = true in the search as well as in the gate.

Fields for this CRM

Create the ones marked YES. Map the ones you already store. Do not invent a second current-rate field.

PurposeCanonicalThis CRMRequiredCreate?
Contact IDcontact_idIdYesNo
First namefirst_nameFirstNameYesNo
Last namelast_nameLastNameNoNo
EmailemailEmailYesNo
MobilemobileMobilePhoneRecommendedNo
Current ratetbt_current_ratetbt_current_rate__cYesMap or create
New-money ratetbt_new_money_ratetbt_new_money_rate__cYesYES - create or maintain
Loyalty gap (bps)tbt_loyalty_gap_bpstbt_loyalty_gap_bps__cYesYES - create / compute
LenderlenderLender__cRecommendedNo
Product nameproduct_nameLoan_Product__cRecommendedNo
Existing client flagexisting_clienttbt_existing_client__c or Account record typeYesMap
Email opt-outemail_optoutHasOptedOutOfEmailYesNo
Loyalty statetbt_loyalty_statetbt_loyalty_state__cYesYES - create this
Last loyalty touchtbt_last_loyalty_touchtbt_last_loyalty_touch__cYesYES - create this
Broker ownerbroker_ownerOwnerIdRecommendedNo
Broker emailbroker_emailset in watch mapperYesSet 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/01b-TBT-Loyalty-Tax-Watch-Salesforce.blueprint.json.

Import this file as the watch scenario. Sign in. Confirm the SOQL object is the one that has the rates (Contact by default). Then import the outreach blueprint.

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 moduleSwap for
7 · Create the broker task — SWAPSalesforce → Create a Task. Title {{3.broker_task_title}}, body {{3.broker_task_body}}, WhoId = Contact Id, due today.
8 · Write the CRM note — SWAPSalesforce → Create a Record (Task with Type = Note, or ContentNote linked to the Contact Id). Body {{3.crm_note}}.
9 · Stamp loyalty touch — SWAPSalesforce → Update a Record (Contact). Set tbt_loyalty_state__c = touched and tbt_last_loyalty_touch__c = today. 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.

WhereWhat
Zap A · first moduleSchedule by Zapier (daily 09:00) + Salesforce Find Record / Find Records (Contact). Filter tbt_loyalty_gap_bps__c ≥ 25, email exists, existing client, state is not opt_out or touched. Then Webhooks by Zapier → POST the canonical payload to Zap B’s Catch Hook. Field names from the table below.
Zap B stepModule
B6 TaskSalesforce → Create Task. Subject from broker_task_title, description from broker_task_body, WhoId = contact_id, due today.
B7 NoteSalesforce → Create Record (Note or ContentNote) on that Contact. Body from crm_note.
B8 StampSalesforce → Update Record (Contact). tbt_loyalty_state__c = touched, tbt_last_loyalty_touch__c = 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].

Fallback — Google Sheets bridge (01e)

If Salesforce OAuth is blocked (sandbox only, missing licences, licensee policy), export settled clients with current rate, new-money rate and gap into the Google Sheet and import 01e-TBT-Loyalty-Tax-Watch-GoogleSheets-Bridge.blueprint.json the same week.

T Test on yourself before any live send

  1. 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_bps at or above 25. State due or queued. Last touch empty.
  2. Run the watch (Make scenario 01, or Zap A) with a limit of 1, filtered to only this record.
  3. Confirm the broker email arrives. Confirm you did not get a client email. auto_email_client stays false.
  4. Confirm the broker task, the CRM note (or sheet write-back), and the stamp: state touched, last touch = today.
  5. Run again the same day. The engine must not draft you a second time. Then set state to opt_out and 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.