WF-F1 · Advocate Eligibility and the Satisfaction Gate
Why this exists: the fastest way to destroy a referral program is to ask the wrong people. One referral ask sent to a customer with an unresolved complaint costs more goodwill than ten successful asks earn. This workflow decides who is allowed to be asked, and it is the only route into the program.
Trigger: service completion event. Appointment marked complete, invoice marked paid, or opportunity moved to a closing stage. Pick exactly one and use it everywhere, or customers will be asked twice.
Entry conditions (all must be true):
- suppress_referral_asks = false and no advocate-declined tag.
- referral_ask_count is less than 3.
- last_referral_ask_at is empty or more than 90 days ago.
- No open complaint, dispute, unpaid overdue invoice, or recovery-open tag.
- A consented channel exists.
- This is not a first-ever appointment that has yet to be delivered. Ask after value, never before.
Actions, in order:
- Stamp service_completed_at; write service_type and staff_member from the job record.
- Wait 1 hour. Long enough that the service is genuinely finished, short enough that the feeling is intact.
- Branch on quiet hours: outside 09:00–19:00 local, hold until 09:00 next day.
- Send the one-tap satisfaction question: "Hi {{first_name}}, quick one: how did we do today, 0 to 10? {{score_link}}" Capture on tap.
- Wait up to 48 hours for a response, with one reminder at 24 hours.
- Branch on satisfaction_score:
- 9–10 → add advocate-eligible, move to Eligible, continue to WF-F2 immediately.
- 7–8 → eligible, but wait 7 days before asking and use the softer copy variant. These customers refer, just less readily, and a hard ask puts them off.
- 0–6 → no referral ask, now or for 90 days. Set suppress_referral_asks = true, route to service recovery, and create a task for a human. Re-eligibility is a human decision, recorded in a note.
- No response → eligible at the lower tier only if there is other positive evidence. A repeat purchase, a long tenure, a public review. Silence is not satisfaction.
Exit conditions: score below threshold; cap reached; opt-out; suppress_referral_asks set; open complaint detected at any point.
WF-F2 · The Ask, Timed to the Peak
Trigger: tag advocate-eligible added.
Conditions: all WF-F1 gates still true at send time. Re-check them, because a complaint can arrive in the intervening hour.
Actions, in order:
- Wait 4 minutes after the score. Not an hour. Not the next day. The ask should feel like part of the same conversation as the compliment they just gave you.
- Send the primary ask by SMS: "That's really good to hear, {{first_name}}, thank you. Can I ask one favor? Most of our work comes from people like you telling someone else. Is there one person who might need {{service_type}} right now? Here's a link you can send them, and a message you can use if it's easier: {{toolkit_link}}"
- The copy rules that do the work. Ask for one person, not "anyone you know". A specific small request converts several times better than a vague large one. Name the service they actually had. Say why it matters to the business. Give them the words so they do not have to compose anything. Keep it under 320 characters.
- Email variant for contacts without SMS consent. Subject "One favor, if you don't mind", four lines, the toolkit button, and the prewritten message visible in the body so it can be copied without clicking anything.
- Increment referral_ask_count; stamp last_referral_ask_at; add advocate-asked; move to Asked.
- Wait 3 days. Condition: toolkit not opened and no referral submitted. Send one nudge, and make it easier rather than louder: "No pressure at all {{first_name}}, if it's useful, here's the link again. Even one name helps more than you'd think: {{toolkit_link}}"
- Wait 7 days. Condition: still nothing. Stop. Do not send a third message in this cycle. The next contact is the 120-day re-ask in WF-F8.
- If they reply with words rather than tapping ("sure, who do I send it to", "my brother might") hand the thread to BO, which is the highest-converting path in the whole build.
Exit conditions: toolkit opened; referral submitted; any reply; opt-out; cap reached; two nudges sent.
WF-F3 · Enrollment and the Share Toolkit
Trigger: advocate toolkit page opened, or referral_link_code first generated.
Actions:
- Generate referral_link_code if empty: short, human-readable, permanent. Never regenerate it; links live in people's message history for years.
- Add advocate-enrolled; move to Enrolled; cancel the remaining nudges in WF-F2.
- Wait 10 minutes. Condition: no share action and no submission. Send one message containing the link as text in the message body, not behind a button: "Here's your link if you'd rather just copy it: {{referral_link}}". A surprising share of advocates want to paste it into their own app rather than use a share button.
- Wait 2 days. Condition: link opened but no click-throughs recorded on it. Send the single most useful nudge in the build: "If it helps, here's a message you can just forward: '{{prewritten_message}}'". The full text, ready to copy. The barrier is almost never willingness; it is composition.
- Record every share action by channel so you learn which channel this audience actually uses, then reorder the buttons to match.
- Wait 14 days. No referral activity → exit to WF-F8's dormancy watch.
Exit: referral submitted; link click recorded; opt-out.
WF-F4 · Referral Capture and Attribution
Why it matters more than the ask: an unattributed referral is indistinguishable from an inbound lead. Every path into the business has to be able to answer "who sent you", and the answer has to land in a field rather than a note.
Triggers (four separate paths, one shared outcome):
- Path A: Advocate link clicked and landing-page form submitted. Cleanest. The code carries the attribution automatically.
- Path B: Advocate submits a name on the toolkit form, with the permission tick.
- Path C: Referred person contacts you directly by phone, chat or form and names the referrer. BO or the receptionist asks the question.
- Path D: Partner or professional referrer submits through the partner form.
Actions, in order:
- Create or match the referred contact. Deduplicate hard: if this person is already an existing customer or an open lead created before the referral, do not attribute. Log it as "already known" and tell the advocate honestly. Paying out on a lead you already had is how referral programs lose the owner's trust.
- Write referred_by_contact, referred_by_name, referral_channel, referral_relationship and referral_submitted_at.
- Set referral_consent_basis by path: this is the branch that keeps the build lawful:
- Path A → Opted in on landing page. Outbound SMS and email permitted, within the consent captured.
- Path B → Advocate-submitted: no consent. Move to Awaiting Permission. No automated outbound of any kind. Continue to WF-F5.
- Path C → Self-initiated contact. Reply in the channel they used; capture consent for anything further.
- Path D → Partner with documented consent, only where the partner has confirmed in writing that the person agreed to the introduction.
- Increment the advocate's referrals_submitted_count; set first_referral_at if empty; stamp last_referral_at; move the advocate to Active Advocate, or Repeat Advocate at two or more.
- Post to the internal channel: "Referral in: {{referred_name}} from {{referred_by_name}} ({{referral_relationship}}). Consent basis: {{referral_consent_basis}}. Respond within 15 minutes."
- Create a task for the owner of referred leads, due in 15 minutes during business hours.
- Send the advocate an immediate acknowledgement: on every path, including the ones that cannot be contacted: "Got it, {{first_name}}, thank you. I'll let you know how it goes." Then actually do that in WF-F6.
Exit: referred record created and attributed, or logged as duplicate and the advocate told.
WF-F5 · Referred-Lead Intake Without Consent (the permission path)
Why this workflow is non-negotiable: when an advocate hands over a friend's number, the friend has given you nothing. Texting them is unsolicited marketing to a person who never asked, it reads as a privacy breach to the recipient, and it is the fastest way to turn a goodwill program into a complaint. This workflow gets permission before it gets a lead.
Trigger: referred record enters Awaiting Permission.
Actions: and note what is absent:
- No message is sent to the referred person. Not one. Every action in this workflow is directed at the advocate or at a human on your team.
- Send the advocate the forwardable introduction: "Thanks for passing on {{referred_first_name}}'s details, {{first_name}}. Rather than cold-calling them, could you send them this? It's quicker and it'll come from someone they trust: '{{prewritten_message}}', or if you'd rather we reached out directly, just reply OK and confirm they're happy to hear from us."
- Branch on the advocate's reply. If the advocate confirms the referred person is expecting contact, set referral_consent_basis = Advocate-confirmed permission, record the reply verbatim with its timestamp, and permit one personal outreach attempt. A phone call from a named human, not an automated sequence, and not SMS marketing. Whether that is sufficient under the rules in force is a question for the client's own counsel, and the answer differs by jurisdiction and by channel.
- If the referred person clicks the forwarded link and opts in, they re-enter at Path A with a proper consent basis and the normal sequence runs.
- Wait 7 days. No permission and no self-initiated contact → move to Not Now, keep the attribution, send nothing, and tell the advocate plainly: "I didn't want to contact {{referred_first_name}} out of the blue. If they'd like to reach us, your link is here whenever they're ready."
- Never pass the referred person's details to another advocate, add them to a broadcast list, or include them in any campaign audience while they sit in Awaiting Permission. Exclude this stage explicitly from every bulk send in the account.
Exit: consent obtained; self-initiated contact made; 7 days elapsed.
WF-F6 · The Advocate Progress Loop
Why it is the most under-built workflow in referral programs: advocates refer again because they learn that referring produced something. Silence teaches the opposite, and it teaches it permanently. Three short messages here are worth more than any reward.
Trigger: any stage change on a referred record that has a referred_by_contact.
Actions, by referred-lead stage:
- Contact Made → within 1 hour, message the advocate: "Just spoke to {{referred_first_name}}, thanks again for the introduction."
- Booked → immediately: "{{referred_first_name}} is booked in for {{appointment_day}}. Genuinely appreciated, {{first_name}}."
- Converted → immediately, and continue to WF-F7: "{{referred_first_name}} is all sorted and happy. That's the second time you've sent someone our way: thank you."
- Not Interested or Not Now → wait 2 days (do not deliver bad news instantly) then: "We spoke to {{referred_first_name}}; it's not the right time for them. Thanks for thinking of us anyway, {{first_name}}, it still means a lot." Thank the advocate for the act, never for the outcome. An advocate who feels judged on conversion stops referring.
- Stamp referral_outcome_notified_at on every path, so loop closure is auditable and a gap in it is visible in reporting.
- Privacy limit on every message: name the person and the stage, nothing else. Never share what the referred person bought, what they paid, what they discussed, or anything they disclosed. If the referred person has asked that the referral not be acknowledged, suppress this entire workflow for that record: build that flag.
Exit: referred record reaches a terminal stage and the advocate has been told.
WF-F7 · Reward Trigger, Approval and Fulfillment
Trigger: referred record moves to Converted.
Conditions: attribution is clean and not a duplicate; the referred person is past any cooling-off or refund window; the advocate holds no reward-ineligible flag; the reward is permissible for this advocate: see the constraint below.
Actions, in order:
- Increment referrals_converted_count; set reward_status = Due; move the advocate to Reward Due; add reward-due.
- Create a human approval task. No reward is ever fulfilled automatically. The approver checks the attribution, the duplicate test and the eligibility rule, then approves or declines with a reason. Record reward_approved_by.
- Wait for approval. On approval: fulfill according to reward_type: apply account credit, issue the gift, trigger the donation, or activate the upgrade, then stamp reward_fulfilled_at, set reward_status = Fulfilled, add reward-fulfilled.
- Send the thank-you, and write it as a thank-you rather than a receipt: "{{first_name}}, {{referred_first_name}} is sorted and delighted. Your {{reward_type}} is on its way, but honestly, the recommendation mattered more. Thank you."
- Wait 3 days. Send one light line that keeps the door open without asking again: "Your link's always live if anyone else comes to mind: {{referral_link}}". Then stop.
- On decline: notify the approver's note to nobody but the internal channel, and still send the advocate a genuine thank-you. Never tell an advocate they are being refused a reward through an automation.
- At 2 and 5 cumulative referrals: set advocate_tier and create a task for the owner to make personal contact. Remove repeat advocates from the automated ask cadence entirely. They have earned a human.
Constraints you must settle before building this workflow:
- Reward structure, value and form are commercial decisions for the business, and in several sectors they are regulated or prohibited. Paying for patient or client referrals is unlawful in parts of healthcare and restricted in finance, law and insurance in many jurisdictions. Confirm with the client's own counsel what may be offered, to whom, and with what disclosure: before a single reward is configured. Where cash-equivalent rewards are not permissible, the build still works: a thank-you, a named mention with permission, or a charitable donation path carries most of the effect.
- Never make the reward the headline of the ask. An ask led by a reward converts worse and attracts the wrong referrals.
- Never reward the referred person for being referred without checking the same rules apply to them.
- Disclose the arrangement where disclosure is required, in the advocate's share message itself.
Exit: reward fulfilled, declined, or the advocate opts out of rewards.
WF-F8 · Dormancy, Re-Ask and Natural Moments
Trigger: scheduled daily sweep, plus event-based entry on the natural moments listed below.
Conditions for any re-ask: referral_ask_count under 3; last_referral_ask_at more than 90 days ago; satisfaction still at or above threshold with no complaint since; not advocate-declined; suppress_referral_asks false.
Actions:
- Dormancy sweep. Advocates enrolled with no referral activity for 120 days → move to Dormant, one re-ask built around something new rather than a repeat of the first message: "{{first_name}}, we've started doing {{new_service}}, if anyone you know needs it, your link still works: {{referral_link}}". No response in 14 days → leave alone for a year.
- Natural moment: repeat purchase or return visit. Re-ask 1 hour after the second completion, where the gates allow. A returning customer is a stronger advocate than a first-timer.
- Natural moment: public review posted. Somebody who just wrote a five-star review in public has demonstrated willingness. Wait 2 days, then ask once, referencing the review with thanks: never as leverage.
- Natural moment: milestone. One year as a customer, a course completed, a contract renewed. One ask, tied to the milestone.
- Natural moment: unprompted praise. BO detects a clear compliment in an inbound message, creates a task rather than sending anything, and a human decides whether to ask in that conversation. This is the highest-converting ask in the build and it should stay human.
- The cap is absolute. Three asks per rolling 12 months across every path in this workflow, enforced by referral_ask_count, not by step counting in any single workflow. On the third, add referral-ask-cap-hit and exclude the contact from all referral asks for a year.
Exit: cap hit; declined; opted out; dormant for a year.
WF-F9 · Partner and Professional Referrer Track
Why it is separate: a neighbor who sends one person and a professional who sends four a month need completely different handling. Running a partner through the consumer ask sequence insults them; running a consumer through the partner process confuses them.
Trigger: contact tagged partner-referrer, or a submission through the partner form.
Actions:
- Set advocate_tier = Partner. Exclude from WF-F2 and WF-F8 entirely: partners are never put on an automated ask cadence.
- Issue a named partner link and a co-branded landing page carrying their name, so their client sees continuity rather than a handoff.
- On each submission: acknowledge within 15 minutes, confirm receipt to the partner by their preferred channel, and create a task with a response SLA that is shorter than for any other lead source in the account.
- Close the loop at every stage, in the partner's language: contacted, booked, outcome. A professional referrer's reputation is attached to the introduction, which makes feedback a professional courtesy rather than a nicety.
- Monthly: send a volume and outcome summary. Counts and stages only, never clinical, financial or personal detail about the people referred.
- Quarterly: create a task for the owner to book a partner review slot. Partner relationships decay on a quarterly clock, not an annual one.
- Document the consent position once, in writing, covering what the partner may share, on what basis, and what the business may do with it. For regulated referrers this is a formal matter and belongs with counsel, not in a workflow description.
Exit: partnership ends, or the partner asks to stop.
WF-F10 · Weekly Referral Reporting and Attribution Hygiene
Trigger: scheduled, Monday 08:00.
Actions:
- Email the owner one digest: asks sent, enrollment rate, referrals submitted by channel, referrals converted, loop-closure coverage, rewards due and unfulfilled, and the current list of repeat advocates.
- Hygiene sweep: flag every referred record with no referred_by_contact, every referred record whose referral_outcome_notified_at is empty more than 48 hours after a stage change, and every reward sitting at Due for more than 5 days. These three leaks account for most referral program decay.
- Flag any advocate whose referrals consistently fail to qualify, not to penalize them, but because it usually means the ask copy is attracting the wrong audience.
- Flag any referred record that has sat in Awaiting Permission for more than 7 days, so it is closed properly rather than quietly contacted by someone who did not know the rule.
Exit: runs indefinitely.