Policy red-pen sheet
Every line below is a DRAFT the copilot may show a rep word for word. Nothing reaches a rep until you approve it.
How to approve
- Open
policy/src/playbook-onboarding.jsonorpolicy/src/playbook-customer-success.jsonand find the line by itstext_id. - To approve it, set
"status": "approved","approved_by": "<email>"(one ofstevan@currencytransfer.com, frompolicy/approvers.json) and"approved_at": "<YYYY-MM-DD>". - A line marked VERIFY contains a
[VERIFY …]marker: confirm the fact or rewrite it, then remove the marker. The loader refuses any approved line that still contains[VERIFY. - A line marked CONCRETE FACT names a time, date, decimal rate or "yesterday"-style detail from one call. The loader refuses it in an approved line: generalise it or delete it.
- To drop a line, delete its object. Do not renumber the other
text_ids. A line with"status": "retired"is out of use and never shown; it is listed under "retired lines" with the rule it breaks. Delete it once you agree, or set it back todraftto reconsider it. - Move headlines, concern headlines, caution notes, call-purpose labels and client fact labels and templates are approved the same way (same three fields), each in its own object:
- a move headline is the
headlineof the move inpolicy/src/playbook-<scenario>.json(headline.<move id>): the situation in the client's words, 8 words or fewer; - a concern headline is
concerns.<topic>.headlinein the same file (concern.<topic>.headline), one per objection topic plus the bucketsmoneyandprocess; - a caution note is the
live_noteof the risk rule inpolicy/src/rules-<scenario>.json(caution.<risk id>): one line, never starting with "Careful", "Say", "Worth saying" or "Ask first", because the view already shows that tag. The build refuses one that does. - a call-purpose label is the
labelof the purpose inpolicy/src/plan-<scenario>.json(plan.purpose.<purpose id>): what the live view's purpose line shows, one per option of the purpose Choice. - a client fact label is one of the
labelsof a fact slot inpolicy/src/plan-<scenario>.jsonfact_slots(plan.fact.<slot>.<value>, a country id forresidency): the chip the live view shows for that value. The amount and currency-pair slots have atemplate(plan.fact.<slot>.template) instead, whose{amount},{currency},{sell}and{buy}code fills with digits and ISO 4217 codes only; keep those placeholders. - a plan template item's
title,hintandnot_needed_reasonsit intemplates.<purpose>ofpolicy/src/plan-<scenario>.json(plan.template.<purpose>.<item>.title,.hint,.not_needed); the rate-pressure item's title israte_pressure.title(plan.rate_pressure.title). An item that does not always apply needs a not-needed reason; the build refuses an item naming a move, line, checklist id, fact, slot, stage or situation that does not exist.
- a move headline is the
- Situations (rate objections,
docs/policy/rate-objections.md) sit under their move insituations: approve a point like a line (theverbatimones are the approved playbook wording and are never rewritten), and theheadline(situation.<id>.headline, the client's words) andhint(situation.<id>.hint) like a move headline. The build refuses acore_text_idthat is not one of the situation's points, and a do-not flag that is not a risk rule. - Checklist rows: change
appliesinpolicy/src/rules-<scenario>.json; the wording that ticks an item is the noul of the same id in the scenario bank. - Re-run
node scripts/redpen.mjsand commit the JSON together with this file.
Onboarding
Source: policy/src/playbook-onboarding.json, policy/src/rules-onboarding.json. 14 moves, 53 lines: 21 approved, 32 to review; 3 carry [VERIFY, 0 a concrete fact. 7 retired.
Onboarding lines
| text_id | move | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
open_with_agenda.1 |
Set the agenda | draft | Thanks for making time. In about ten minutes I'd like to understand the transfer you're planning, get you activated, and show you how booking works. Does that suit? | ||
open_with_agenda.2 |
Set the agenda | draft | This is the activation call: I'll check a couple of things on your registration, and then we can talk through your first transfer. | ||
open_with_agenda.3 |
Set the agenda | draft | Before I explain anything, can I just check what you're looking to do, so I don't waste your time? | ||
open_with_agenda.h1 |
Set the agenda | approved | My name is [your name]. I'm calling from Currency Transfer. It's just regarding an application you made with us to transfer {currency pair}. | ||
check_serviceability_first.1 |
Check we can serve them | draft | Before we go further, can I confirm where you're resident and which country your bank account is in? Some of our partners have country restrictions. | ||
check_serviceability_first.2 |
Check we can serve them | draft | For a company account, which country is the business registered in, and are all the directors and owners resident there? | ||
check_serviceability_first.3 |
Check we can serve them | draft | I want to be straight with you: if we can't open an account for your country I'd rather tell you now than after you've sent documents. | ||
check_serviceability_first.h1 |
Check we can serve them | approved | Have you been working in {country} for a while? | ||
check_serviceability_first.h2 |
Check we can serve them | approved | Do you have a UK address? | ||
ask_about_the_transfer.1 |
Ask an open question about the transfer | draft | Tell me about the transfer you're planning: what it's for, which currencies, and roughly when. | ||
ask_about_the_transfer.2 |
Ask an open question about the transfer | draft | How have you been sending money abroad so far, and what's changed? | ||
ask_about_the_transfer.3 |
Ask an open question about the transfer | draft | What's the money for, and is there a date it needs to be there by? | ||
ask_about_the_transfer.h1 |
Ask an open question about the transfer | approved | And how much are you looking to transfer? | ||
ask_about_the_transfer.h2 |
Ask an open question about the transfer | approved | When are you looking to make your first transfer? | ||
pin_down_timing_and_amount.1 |
Pin down amount and date | draft | Roughly how much are we talking about for the first transfer, and is that a one-off or something that repeats? | ||
pin_down_timing_and_amount.2 |
Pin down amount and date | draft | Is there a hard date, like a completion or a payroll run, that the money has to be in the account by? | ||
pin_down_timing_and_amount.3 |
Pin down amount and date | draft | Are we looking at one payment or a series over the coming months? | ||
pin_down_timing_and_amount.h1 |
Pin down amount and date | approved | What is the amount that you plan to transfer? | ||
pin_down_timing_and_amount.h2 |
Pin down amount and date | approved | What's the immediate amount you plan to send, and when? | ||
confirm_funding_account.1 |
Confirm the funding account | draft | Which account will the money come from? It needs to be an account in your own name, or the company's name, sent by bank transfer. | ||
confirm_funding_account.2 |
Confirm the funding account | draft | One thing that trips people up: the funds have to come from you, not a family member or a friend, or the partner can't accept them. Is that ok for this transfer? [VERIFY exact policy] | VERIFY | |
confirm_funding_account.3 |
Confirm the funding account | draft | After you book, the partner's bank details appear on screen and you pay them directly from your account. Does that work for you? | ||
confirm_funding_account.h1 |
Confirm the funding account | approved | And who is it that you bank with in {country}? | ||
confirm_funding_account.h2 |
Confirm the funding account | approved | Whose account will the money come from, yours or someone else's? | ||
close_the_document_gap.1 |
Name the missing document | draft | The only thing we're missing is a proof of address dated within the last three months: a utility bill, bank statement or council tax bill, in colour. Can you upload that today? | ||
close_the_document_gap.2 |
Name the missing document | draft | For the company we need the registration document, ID for the directors, and ID plus address for anyone owning over 25 percent. [VERIFY threshold] Which of those can you send now? | VERIFY | |
close_the_document_gap.3 |
Name the missing document | draft | I know it feels like a lot; it's a regulated industry and the partner has to verify you once. Most completed applications are activated the same day. | ||
close_the_document_gap.h1 |
Name the missing document | approved | With the proof of life selfie, hold your passport next to your face; it's just to verify you're a real person. | ||
close_the_document_gap.h2 |
Name the missing document | approved | I'll send you an email asking for the documents. | ||
explain_who_holds_the_money.1 |
Explain who holds the money | draft | We're the platform; your transfer is contracted with a named FCA-authorised payment partner, and CurrencyTransfer never holds your money at any point. | ||
explain_who_holds_the_money.2 |
Explain who holds the money | draft | Your funds sit with the partner in safeguarded, segregated accounts until they're paid out to your beneficiary, and that protection applies even if the partner or we were to fail. [VERIFY wording with compliance] | VERIFY | |
explain_who_holds_the_money.3 |
Explain who holds the money | draft | You'll see the partner's name on every booking, so you always know exactly who is holding the funds. | ||
explain_who_holds_the_money.h1 |
Explain who holds the money | approved | The funds are held in a segregated account, so they cannot be used for business operations; they're held entirely separate. | ||
explain_who_holds_the_money.h2 |
Explain who holds the money | approved | This is going to be an account in your name, but it will be with {settlement_bank} in {settlement_city}. | ||
explain_settlement_and_cutoff.1 |
Explain when the money arrives | approved | For major currencies, if your funds reach the partner before their cut-off, usually 2pm UK time, it settles the same day. Other currencies can take up to five working days. | ||
explain_settlement_and_cutoff.2 |
Explain when the money arrives | draft | Given your completion date, I'd book and fund a few days ahead so the cut-off doesn't matter. | ||
explain_settlement_and_cutoff.3 |
Explain when the money arrives | draft | Once funded, you can track the payment on the dashboard rather than wondering where it is. | ||
explain_booking_is_binding.1 |
Explain that a booking is binding | draft | One important thing before you book: the moment you confirm, the partner buys that currency for you, so it's a contract. If the funds don't arrive, any loss on unwinding it is yours. | ||
explain_booking_is_binding.2 |
Explain that a booking is binding | draft | If anything changes after you book, call me straight away; the earlier we know, the smaller the problem. | ||
explain_booking_is_binding.3 |
Explain that a booking is binding | draft | That's why I'd only book once you know the funds are ready to send. | ||
explain_booking_is_binding.h1 |
Explain that a booking is binding | approved | You can quote and see the amount you'd get, but don't book unless you're happy to make the transfer and happy with the amount. | ||
explain_booking_is_binding.h2 |
Explain that a booking is binding | approved | Cancelling a trade can result in losses, because it's a live trade. | ||
handle_alternative_provider.2 |
Address the bank, Wise or Revolut comparison | draft | What's been good and what's been frustrating about using them so far? | ||
handle_alternative_provider.3 |
Address the bank, Wise or Revolut comparison | draft | You don't have to move everything; try one transfer with us alongside them and compare the settled amounts. | ||
offer_alert_instead_of_waiting.1 |
Offer a bookable rate alert | approved | Nobody can predict the rate, but you can set a bookable alert at the level you'd be happy with, and it'll book or notify you the moment it's hit. | ||
offer_alert_instead_of_waiting.2 |
Offer a bookable rate alert | draft | What rate would make you say yes? Let's set that as your alert. | ||
offer_alert_instead_of_waiting.3 |
Offer a bookable rate alert | approved | If there's a date the money has to be there by, an alert with a fallback date protects you both ways. | ||
offer_alert_instead_of_waiting.h1 |
Offer a bookable rate alert | approved | It's worth knowing that on our platform you can set rate alerts, and even bookable ones. | ||
offer_alert_instead_of_waiting.h2 |
Offer a bookable rate alert | approved | Have you thought of setting a rate alert or a market order? If your target rate triggers, even briefly, you'd achieve it. | ||
agree_next_step.1 |
Agree the next step | draft | So: you'll upload the proof of address this afternoon, I'll get you activated, and we'll book the transfer tomorrow morning. Shall I call you at ten? | ||
agree_next_step.2 |
Agree the next step | draft | Would you like to book it now while we're on the call, or set the alert and I'll message you on the dashboard when it hits? | ||
agree_next_step.3 |
Agree the next step | draft | I'll send you a summary on your dashboard with the partner's name and what happens next. Anything I've missed? | ||
agree_next_step.h1 |
Agree the next step | approved | I'll take the next steps to get you activated; if you have any questions get in touch, and you'll hear from us once activated. |
Onboarding retired lines
| text_id | move | text | rule broken |
|---|---|---|---|
show_the_rate_against_mid_market.1 |
Compare the rate against mid-market | On the dashboard you'll see the mid-market rate next to your rate, so you can see the margin rather than take my word for it. | Breaks 'compare what lands, not mid-market' (mid_market_comparison): it makes the mid-market rate the benchmark and puts our margin on the table ('so you can see the margin'). |
show_the_rate_against_mid_market.2 |
Compare the rate against mid-market | What rate did your bank quote you? Let's compare it against the live mid-market rate right now. | Breaks 'move to a comparison that can actually be made': it compares a bank quote with mid-market, a number nobody trades at, instead of what lands from each, same day, same amount (mid_market_comparison.2). |
show_the_rate_against_mid_market.3 |
Compare the rate against mid-market | There's no transfer fee; the only cost is the difference between the mid-market rate and your rate, and that's shown on screen before you book. | Breaks 'Do not explain the pricing' / 'Explain how the spread is built' (do-not): it tells the client our cost is the gap between mid-market and their rate. |
handle_rate_objection.1 |
Handle a rate objection | Was that quote against the mid-market rate at the time? Let's put both side by side now, because a headline rate on a different day isn't comparable. | Breaks 'do not defend the number, change what is being compared': it lines the two quotes up against mid-market. Its point about stale and headline rates is now qualify_the_quote.1 and .2. |
handle_rate_objection.2 |
Handle a rate objection | Fair challenge. What I can do is show you the live quote with the margin visible; if we're not competitive on your amount, I'll tell you. | Breaks 'Do not explain the pricing' ('the margin visible') and invites a discount: 'if we're not competitive on your amount, I'll tell you' concedes a better price exists for somebody. |
handle_rate_objection.3 |
Handle a rate objection | Banks typically build a margin of up to a few percent into the rate plus a flat fee; ours is shown transparently, so compare the total cost, not the fee. | Breaks 'Do not explain the pricing': it explains how bank margins and ours are built. 'Compare the total cost' is now qualify_the_quote.3 and .4. |
handle_alternative_provider.1 |
Address the bank, Wise or Revolut comparison | Those are fine for small amounts. At your size the questions are the rate on that amount, whether you get a person handling it, and settlement timing; shall we compare on those? | Breaks 'Do not suggest they are wrong ... do not rubbish the competitor': 'fine for small amounts' tells the client their provider is wrong for them, and it keeps the rate on one amount as the comparison (competitor_named compares what landed over three trades). |
Onboarding situations
Compare the rate against mid-market (show_the_rate_against_mid_market)
Situation mid_market_comparison
- Headline
situation.mid_market_comparison.headline(draft): Why am I getting less than Google says? - Hint
situation.mid_market_comparison.hint(draft): Correct it once, briefly, and move to a comparison that can actually be made. If you argue the gap you are defending your margin on a call that was never about your margin. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):mid_market_comparison.2 - Do-not flags:
rep_explained_spread - Do not: Explain how the spread is built. The moment you break down your own pricing, the call is about what you make rather than what they get.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
mid_market_comparison.1 |
approved | verbatim | That's the mid-market rate. It's the midpoint between buying and selling, so it's a reference number rather than a price. Nobody trades at it, banks included. | |||
mid_market_comparison.2 |
approved | verbatim | The number worth comparing is what actually lands from us against what actually lands from your bank, same day, same amount. |
Handle a rate objection (handle_rate_objection)
Situation qualify_the_quote
- Headline
situation.qualify_the_quote.headline(draft): Qualify the quote before you respond - Hint
situation.qualify_the_quote.hint(draft): Ask calmly, in order. You are not challenging them, you are finding out what they are actually holding. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):qualify_the_quote.4 - Do-not flags:
rep_rubbished_competitor
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
qualify_the_quote.1 |
approved | verbatim | When did you get that rate? | |||
qualify_the_quote.2 |
approved | verbatim | Was that a live quote on your amount, or a headline off a website? | |||
qualify_the_quote.3 |
approved | verbatim | What were the fees on top, including the receiving bank's cut? | |||
qualify_the_quote.4 |
approved | verbatim | What actually landed in the beneficiary account last time, against what you were quoted? |
Situation no_quote_in_hand
- Headline
situation.no_quote_in_hand.headline(draft): Can you do better than that? - Hint
situation.no_quote_in_hand.hint(draft): Three beats, in order. Keep each one short: length reads as negotiation. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):no_quote_in_hand.2 - Do-not flags:
rep_improved_rate_unasked,rep_explained_spread,rep_said_standard_for_volume - Do not: Improve the rate to close a question that was not about the rate.
- Do not: Do not explain the pricing, and do not say it is standard for their volume: that concedes a better price exists for somebody, which is the door you were trying to shut.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
no_quote_in_hand.1 |
approved | verbatim | Better than what? | |||
no_quote_in_hand.2 |
approved | verbatim | No. That's the price. | |||
no_quote_in_hand.3 |
approved | verbatim | And it's live, so it's moving while we talk. Do you want it, or shall I requote in ten? |
Situation competitor_named
- Headline
situation.competitor_named.headline(draft): Company X gives me a better rate. - Hint
situation.competitor_named.hint(draft): Run the four qualifying questions before you say anything else. Move the comparison from one quote to the last three trades. - Ask the qualifying questions first (
qualify_first): yes - Core line (
core_text_id, said = handled):competitor_named.2 - Do-not flags:
rep_rubbished_competitor - Do not: Suggest they are wrong or lying, and do not rubbish the competitor by name. Both make you sound like the expensive option defending itself.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
competitor_named.1 |
approved | verbatim | They probably do on the first one. What matters is what you're getting on trade twenty, when nobody's watching. | |||
competitor_named.2 |
approved | verbatim | Pull your last three confirmations from them and let's compare what landed, not what was quoted. |
Situation concession_terms
- Headline
situation.concession_terms.headline(draft): If you do move on price - Hint
situation.concession_terms.hint(draft): Get something on the call, not vaguely later. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):concession_terms.5 - Do-not flags:
rep_improved_rate_unasked
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
concession_terms.1 |
approved | verbatim | Volume. A monthly or quarterly commitment that puts them in the band you are pricing them at. | |||
concession_terms.2 |
approved | verbatim | Consolidation. The corridors they currently run elsewhere come to you. | |||
concession_terms.3 |
approved | verbatim | Forward cover. The next tranche booked forward rather than left to shop. | |||
concession_terms.4 |
approved | verbatim | Introduction. The finance contact at the group company, the supplier, the sister office. | |||
concession_terms.5 |
approved | verbatim | The rate is one number on one day. What you're paying for is knowing what it'll be worth when it lands and when it'll get there. If you press send and then spend two days chasing, the half pip you saved cost you more than it was worth. |
Address the bank, Wise or Revolut comparison (handle_alternative_provider)
Situation serial_shopper
- Headline
situation.serial_shopper.headline(draft): I'll just check what the others are doing. - Hint
situation.serial_shopper.hint(draft): Price them for the time they cost, or let them go. Winning them at the floor is worse than losing them. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):serial_shopper.1 - Do-not flags:
rep_improved_rate_unasked - Do not: Chase them down on each trade. Every match sets the new ceiling and the next call starts below it.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
serial_shopper.1 |
approved | verbatim | Happy to quote you every time. If you want a better number without the ring-around, give me the flow for the quarter and I'll price it properly. |
Situation bank_matched
- Headline
situation.bank_matched.headline(draft): I spoke to my bank and they've matched you. - Hint
situation.bank_matched.hint(draft): Do not argue the number. Test whether it survives. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):bank_matched.1 - Do-not flags:
rep_went_under_bank - Do not: Go under them. A bank defending one account is not pricing to make money on it, and you cannot win that on price. Win it on the six months after they stop paying attention.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
bank_matched.1 |
approved | verbatim | Good. That's the first time they've sharpened up for you. Ask them to hold it in writing for the next twelve months and see what comes back. | |||
bank_matched.2 |
approved | verbatim | Worth looking at what they were giving you before we started quoting. That's their real price, the one that applies when nobody's pushing. |
Onboarding move headlines
| text_id | move | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
headline.open_with_agenda |
Set the agenda | draft | Client doesn't know what the call is for | ||
headline.check_serviceability_first |
Check we can serve them | draft | Client lives or is registered abroad | ||
headline.ask_about_the_transfer |
Ask an open question about the transfer | draft | Client hasn't said what the transfer is for | ||
headline.pin_down_timing_and_amount |
Pin down amount and date | draft | Amount and date of the transfer are unclear | ||
headline.confirm_funding_account |
Confirm the funding account | draft | Client hasn't said where the money comes from | ||
headline.close_the_document_gap |
Name the missing document | draft | Client still owes us a document | ||
headline.explain_who_holds_the_money |
Explain who holds the money | draft | Client asks if their money is safe | ||
headline.show_the_rate_against_mid_market |
Compare the rate against mid-market | draft | Client asks how good our rate is | ||
headline.explain_settlement_and_cutoff |
Explain when the money arrives | draft | Client needs the money there by a date | ||
headline.explain_booking_is_binding |
Explain that a booking is binding | draft | Client is about to book | ||
headline.handle_rate_objection |
Handle a rate objection | draft | Client says the rate is too high | ||
headline.handle_alternative_provider |
Address the bank, Wise or Revolut comparison | draft | Client already uses a bank or Wise | ||
headline.offer_alert_instead_of_waiting |
Offer a bookable rate alert | draft | Client wants to wait for a better rate | ||
headline.agree_next_step |
Agree the next step | draft | Client is ready for the next step |
Onboarding concern headlines
| text_id | concern | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
concern.rate.headline |
rate |
draft | Client thinks our rate is too high | ||
concern.safety.headline |
safety |
draft | Client is worried their money isn't safe | ||
concern.timing.headline |
timing |
draft | Client needs the money to land by a date | ||
concern.fees.headline |
fees |
draft | Client is comparing our fees with their bank | ||
concern.trust_in_ct.headline |
trust_in_ct |
draft | Client isn't sure who we are | ||
concern.alternative_provider.headline |
alternative_provider |
draft | Client would rather use their bank or Wise | ||
concern.process_friction.headline |
process_friction |
draft | Client finds signing up a hassle | ||
concern.jurisdiction.headline |
jurisdiction |
draft | Client may be somewhere we can't serve | ||
concern.money.headline |
money |
draft | Client has a worry about cost | ||
concern.process.headline |
process |
draft | Client has a worry about the process |
Onboarding caution notes
| text_id | risk rule | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
caution.rep_made_guarantee |
Rep made a guarantee | draft | That sounded like a guarantee. | ||
caution.rep_made_rate_prediction |
Rep predicted the rate | draft | That sounded like a rate prediction. | ||
caution.funding_from_third_party |
Funds from a third party | draft | The money may come from someone else's account. | ||
caution.jurisdiction_concern |
Country may block the account | draft | Their country may stop us opening the account. | ||
caution.rep_improved_rate_unasked |
Rep moved on price for nothing | draft | That moved the price for nothing. Get something on the call for it. | ||
caution.rep_explained_spread |
Rep explained the spread | draft | That explained our margin. Compare what lands instead. | ||
caution.rep_said_standard_for_volume |
Rep said the rate is standard for their volume | draft | 'Standard for your volume' says somebody gets a better price. | ||
caution.rep_rubbished_competitor |
Rep ran down a competitor or the client's quote | draft | Running them down makes us sound like the expensive option. | ||
caution.rep_went_under_bank |
Rep offered to go under the bank | draft | Don't go under the bank. Test whether their price survives. | ||
caution.booking_without_binding |
Booking agreed before "booking is binding" was said | draft | They agreed to book before hearing it is binding. |
Onboarding call purposes
| text_id | purpose | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
plan.purpose.first_call_after_signup |
first_call_after_signup |
draft | First call after sign-up | ||
plan.purpose.document_chase |
document_chase |
draft | Documents to chase | ||
plan.purpose.first_transfer_walkthrough |
first_transfer_walkthrough |
draft | First transfer walkthrough | ||
plan.purpose.other |
other |
draft | Other |
Onboarding client fact labels
| text_id | slot: value | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
plan.fact.client_type.personal |
client_type: personal |
draft | Personal client | ||
plan.fact.client_type.corporate |
client_type: corporate |
draft | Corporate client | ||
plan.fact.amount.template |
amount: template |
draft | About {amount} {currency} | ||
plan.fact.frequency.one_off |
frequency: one_off |
draft | One-off transfer | ||
plan.fact.frequency.weekly |
frequency: weekly |
draft | Weekly transfers | ||
plan.fact.frequency.monthly |
frequency: monthly |
draft | Monthly transfers | ||
plan.fact.frequency.quarterly |
frequency: quarterly |
draft | Quarterly transfers | ||
plan.fact.frequency.irregular |
frequency: irregular |
draft | Transfers now and then | ||
plan.fact.currency_pair.template |
currency_pair: template |
draft | {sell} to {buy} | ||
plan.fact.transfer_purpose.property |
transfer_purpose: property |
draft | For a property | ||
plan.fact.transfer_purpose.family_support |
transfer_purpose: family_support |
draft | Supporting family | ||
plan.fact.transfer_purpose.salary_or_pension |
transfer_purpose: salary_or_pension |
draft | Salary or pension | ||
plan.fact.transfer_purpose.supplier_payment |
transfer_purpose: supplier_payment |
draft | Paying suppliers | ||
plan.fact.transfer_purpose.school_fees |
transfer_purpose: school_fees |
draft | School fees | ||
plan.fact.transfer_purpose.investment |
transfer_purpose: investment |
draft | Investment | ||
plan.fact.transfer_purpose.other |
transfer_purpose: other |
draft | Another purpose | ||
plan.fact.residency.GB |
residency: GB |
draft | Lives in the UK | ||
plan.fact.residency.IE |
residency: IE |
draft | Lives in Ireland | ||
plan.fact.residency.FR |
residency: FR |
draft | Lives in France | ||
plan.fact.residency.ES |
residency: ES |
draft | Lives in Spain | ||
plan.fact.residency.PT |
residency: PT |
draft | Lives in Portugal | ||
plan.fact.residency.DE |
residency: DE |
draft | Lives in Germany | ||
plan.fact.residency.IT |
residency: IT |
draft | Lives in Italy | ||
plan.fact.residency.NL |
residency: NL |
draft | Lives in the Netherlands | ||
plan.fact.residency.BE |
residency: BE |
draft | Lives in Belgium | ||
plan.fact.residency.CH |
residency: CH |
draft | Lives in Switzerland | ||
plan.fact.residency.AT |
residency: AT |
draft | Lives in Austria | ||
plan.fact.residency.SE |
residency: SE |
draft | Lives in Sweden | ||
plan.fact.residency.NO |
residency: NO |
draft | Lives in Norway | ||
plan.fact.residency.DK |
residency: DK |
draft | Lives in Denmark | ||
plan.fact.residency.PL |
residency: PL |
draft | Lives in Poland | ||
plan.fact.residency.GR |
residency: GR |
draft | Lives in Greece | ||
plan.fact.residency.CY |
residency: CY |
draft | Lives in Cyprus | ||
plan.fact.residency.MT |
residency: MT |
draft | Lives in Malta | ||
plan.fact.residency.US |
residency: US |
draft | Lives in the US | ||
plan.fact.residency.CA |
residency: CA |
draft | Lives in Canada | ||
plan.fact.residency.MX |
residency: MX |
draft | Lives in Mexico | ||
plan.fact.residency.AU |
residency: AU |
draft | Lives in Australia | ||
plan.fact.residency.NZ |
residency: NZ |
draft | Lives in New Zealand | ||
plan.fact.residency.SA |
residency: SA |
draft | Lives in Saudi Arabia | ||
plan.fact.residency.AE |
residency: AE |
draft | Lives in the UAE | ||
plan.fact.residency.QA |
residency: QA |
draft | Lives in Qatar | ||
plan.fact.residency.ZA |
residency: ZA |
draft | Lives in South Africa | ||
plan.fact.residency.IN |
residency: IN |
draft | Lives in India | ||
plan.fact.residency.CN |
residency: CN |
draft | Lives in China | ||
plan.fact.residency.HK |
residency: HK |
draft | Lives in Hong Kong | ||
plan.fact.residency.SG |
residency: SG |
draft | Lives in Singapore | ||
plan.fact.residency.JP |
residency: JP |
draft | Lives in Japan | ||
plan.fact.residency.TH |
residency: TH |
draft | Lives in Thailand | ||
plan.fact.residency.IL |
residency: IL |
draft | Lives in Israel | ||
plan.fact.residency.TR |
residency: TR |
draft | Lives in Turkey | ||
plan.fact.timing.this_week |
timing: this_week |
draft | Needed this week | ||
plan.fact.timing.this_month |
timing: this_month |
draft | Needed this month | ||
plan.fact.timing.within_three_months |
timing: within_three_months |
draft | Within three months | ||
plan.fact.timing.later |
timing: later |
draft | Not for three months or more | ||
plan.fact.timing.no_date |
timing: no_date |
draft | No fixed date | ||
plan.fact.decision_maker.caller |
decision_maker: caller |
draft | Caller decides | ||
plan.fact.decision_maker.colleague |
decision_maker: colleague |
draft | A colleague books or decides | ||
plan.fact.decision_maker.partner_or_family |
decision_maker: partner_or_family |
draft | Decides with family | ||
plan.fact.decision_maker.director_or_owner |
decision_maker: director_or_owner |
draft | Director or owner decides | ||
plan.fact.decision_maker.accountant |
decision_maker: accountant |
draft | Accountant involved | ||
plan.fact.funding_account.own_account |
funding_account: own_account |
draft | Pays from own account | ||
plan.fact.funding_account.company_account |
funding_account: company_account |
draft | Pays from company account | ||
plan.fact.funding_account.third_party |
funding_account: third_party |
draft | Someone else pays | ||
plan.fact.documents_status.complete |
documents_status: complete |
draft | Documents complete | ||
plan.fact.documents_status.proof_of_address_outstanding |
documents_status: proof_of_address_outstanding |
draft | Proof of address to come | ||
plan.fact.documents_status.id_outstanding |
documents_status: id_outstanding |
draft | ID to come | ||
plan.fact.documents_status.company_documents_outstanding |
documents_status: company_documents_outstanding |
draft | Company documents to come | ||
plan.fact.documents_status.source_of_funds_requested |
documents_status: source_of_funds_requested |
draft | Source of funds asked for | ||
plan.fact.current_provider.bank |
current_provider: bank |
draft | Uses their bank now | ||
plan.fact.current_provider.wise |
current_provider: wise |
draft | Uses Wise now | ||
plan.fact.current_provider.revolut |
current_provider: revolut |
draft | Uses Revolut now | ||
plan.fact.current_provider.other_broker |
current_provider: other_broker |
draft | Uses another broker | ||
plan.fact.rate_expectation.has_target_rate |
rate_expectation: has_target_rate |
draft | Has a target rate | ||
plan.fact.rate_expectation.wants_best_rate_now |
rate_expectation: wants_best_rate_now |
draft | Wants the best rate now | ||
plan.fact.rate_expectation.waiting_for_better_rate |
rate_expectation: waiting_for_better_rate |
draft | Waiting for a better rate | ||
plan.fact.rate_expectation.no_view |
rate_expectation: no_view |
draft | No view on the rate |
Onboarding plan templates
Item texts (title, hint, not-needed reason) are approved like a headline; their text_id is plan.template.<purpose>.<item>.title|hint|not_needed.
first_call_after_signup
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
open_with_agenda |
Set the agenda (draft) | The client knows what this call is for and how long it takes. | always | open_with_agenda |
its points delivered | |
understand_the_transfer |
Understand the transfer (draft) | What the transfers are for, the amount and how often, before any explaining. | always | ask_about_the_transfer |
the transfer_purpose fact known and the amount fact known and the frequency fact known |
|
check_serviceability_first |
Check we can serve them (draft) | Where they live and bank decides whether a partner can take them on. | always | check_serviceability_first |
the residency fact known |
|
confirm_funding_account |
Fund from your own account (draft) | The money has to come from an account in the client's own name. | always | confirm_funding_account |
said_fund_from_own_account said |
|
explain_who_holds_the_money |
Who holds the money (draft) | The client hears who holds the funds before the call reaches booking. | always | explain_who_holds_the_money |
said_who_holds_funds said |
|
explain_settlement_and_cutoff |
When the money arrives (draft) | Cut-off and settlement timing for their currencies. | always | explain_settlement_and_cutoff |
said_settlement_timing said |
|
explain_booking_is_binding |
Booking is binding (draft) | Before the first booking: confirming a trade is a contract. | always | explain_booking_is_binding |
said_booking_is_binding said |
|
close_the_document_gap |
Documents still needed (draft) | The account cannot trade until the documents are in; agree when they will be uploaded. | unless the documents_status fact is complete (applies while unknown) |
The documents are complete | close_the_document_gap |
said_docs_needed said |
minimum_transfer |
Minimum transfer (draft) | Their amount may be below the minimum transfer. | unless an amount of at least £5,000 equivalent was mentioned | The amount is well above the minimum | none | said_minimum said |
agree_next_step |
First transfer and next step (draft) | Leave with one concrete action and a time. | always | agree_next_step |
next_step_agreed persisted |
document_chase
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
open_with_agenda |
Set the agenda (draft) | The client knows what this call is for and how long it takes. | always | open_with_agenda |
its points delivered | |
close_the_document_gap |
Documents still needed (draft) | The account cannot trade until the documents are in; agree when they will be uploaded. | always | close_the_document_gap |
said_docs_needed said |
|
understand_the_transfer |
Understand the transfer (draft) | What the transfers are for, the amount and how often, before any explaining. | always | ask_about_the_transfer |
the transfer_purpose fact known and the amount fact known and the frequency fact known |
|
agree_next_step |
Agree the next step (draft) | Leave with one concrete action and a time. | always | agree_next_step |
next_step_agreed persisted |
first_transfer_walkthrough
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
open_with_agenda |
Set the agenda (draft) | The client knows what this call is for and how long it takes. | always | open_with_agenda |
its points delivered | |
confirm_funding_account |
Fund from your own account (draft) | The money has to come from an account in the client's own name. | always | confirm_funding_account |
said_fund_from_own_account said |
|
explain_settlement_and_cutoff |
When the money arrives (draft) | Cut-off and settlement timing for their currencies. | always | explain_settlement_and_cutoff |
said_settlement_timing said |
|
explain_booking_is_binding |
Booking is binding (draft) | Before the first booking: confirming a trade is a contract. | always | explain_booking_is_binding |
said_booking_is_binding said |
|
minimum_transfer |
Minimum transfer (draft) | Their amount may be below the minimum transfer. | unless an amount of at least £5,000 equivalent was mentioned | The amount is well above the minimum | none | said_minimum said |
agree_next_step |
First transfer and next step (draft) | Leave with one concrete action and a time. | always | agree_next_step |
next_step_agreed persisted |
other
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
open_with_agenda |
Set the agenda (draft) | The client knows what this call is for and how long it takes. | always | open_with_agenda |
its points delivered | |
understand_the_transfer |
Understand the transfer (draft) | What the transfers are for, the amount and how often, before any explaining. | always | ask_about_the_transfer |
the transfer_purpose fact known and the amount fact known and the frequency fact known |
|
agree_next_step |
Agree the next step (draft) | Leave with one concrete action and a time. | always | agree_next_step |
next_step_agreed persisted |
Client asks (a client-persisted fact inserts its move as a later item): none.
- Rate pressure title
plan.rate_pressure.title(draft): Rate pressure - Ask first from
qualify_the_quote; concession points fromconcession_terms; headline, hint, points and do-not flags from the situation chosen for the call.
Onboarding checklist
| id | item | applies | ticked by (rep turns only) |
|---|---|---|---|
said_who_holds_funds |
Who holds the money | always | In recent_transcript, has the rep explained that the client's money is held and safeguarded by a regulated payment partner and not by CurrencyTransfer? |
said_rate_transparency |
Rate you see is the rate you get | always | In recent_transcript, has the rep told the client that the rate they see when they book is the rate they get, with no separate transfer fee? |
said_quote_lifetime |
Quote lifetime | never (not counted until decided) | In recent_transcript, has the rep explained that a live quote is only valid for a short time and that booking locks the rate? |
said_settlement_timing |
Settlement timing | always | In recent_transcript, has the rep explained when funds will arrive, including the cut-off time and that some currencies take longer? |
said_fund_from_own_account |
Fund from own account | always | In recent_transcript, has the rep explained that the client must send the funds by bank transfer from an account in their own name (or the company's name) to the partner's account details shown after booking? |
said_booking_is_binding |
Booking is binding | always | In recent_transcript, has the rep explained that a booked trade is a binding contract and that the client is liable for any loss if the funds are not sent? |
said_minimum |
Minimum transfer | unless an amount of at least £5,000 equivalent was mentioned | In recent_transcript, has the rep mentioned the minimum transfer size? |
said_docs_needed |
Documents needed | once docs_status_known is persisted |
In recent_transcript, has the rep told the client exactly which documents are still needed and how recent they must be? |
said_payment_reason |
Payment reason | always | In recent_transcript, has the rep explained why a reason for payment or a supporting document may be requested for a transfer? |
said_rm_contact |
Onboarding-team contact and 100-day handover | never (not counted until decided) | In recent_transcript, has the rep told the client who their relationship manager is and how to reach them? |
rate_pressure_handled |
Rate pushback handled | once rate_pressure_raised is persisted |
In recent_transcript, has the rep answered the client's pushback on the rate without defending or moving the price, either by asking about the competing quote or by holding the price and changing what is being compared? |
said_recording_disclosure |
Recording disclosure | never (not counted until decided) | no question yet (open question for Stevan) |
Customer success
Source: policy/src/playbook-customer-success.json, policy/src/rules-customer-success.json. 13 moves, 48 lines: 26 approved, 22 to review; 1 carry [VERIFY, 1 a concrete fact. 3 retired.
Customer success lines
| text_id | move | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
resolve_the_issue_first.1 |
Deal with the live issue before anything else | draft | Let me look at that right now; give me the amount or the date and I'll pull up the trade. | ||
resolve_the_issue_first.2 |
Deal with the live issue before anything else | draft | I can see exactly where it is: I'll tell you the status and what happens next before we talk about anything else. | ||
resolve_the_issue_first.3 |
Deal with the live issue before anything else | draft | I'll chase the partner as soon as we hang up and message you on the dashboard by three o'clock with an answer. | ||
resolve_the_issue_first.h1 |
Deal with the live issue before anything else | approved | Give them a call and ask if there's any way you can cancel that transaction. | ||
give_status_with_specifics.1 |
State the status with specifics | draft | Your trade settled with the partner at 11:40 today; the beneficiary's bank usually credits it within the day for euros. [VERIFY typical timing per currency] | VERIFY | "at 11:40" |
give_status_with_specifics.2 |
State the status with specifics | approved | It's showing as waiting for funds: the partner hasn't received your transfer yet. Can you check the reference you used? | ||
give_status_with_specifics.3 |
State the status with specifics | draft | The payment is on hold for the supporting document the partner requested; as soon as that's uploaded it goes out. | ||
give_status_with_specifics.h1 |
State the status with specifics | approved | The funds have already gone, so the {buy_currency} should be with you very shortly. | ||
give_status_with_specifics.h2 |
State the status with specifics | approved | We've already received your {sell_currency}; the {buy_currency} should be released today as soon as the partner opens. | ||
explain_document_request.1 |
Explain why a document was requested | draft | The partner is regulated and has to evidence the reason for larger or unusual payments; a copy of the invoice is normally all they need. | ||
explain_document_request.2 |
Explain why a document was requested | draft | I'll ask them to tell us up front what they need for this payee, so you're not chased twice. | ||
explain_document_request.3 |
Explain why a document was requested | draft | If you send it to me now I'll pass it straight to the partner and confirm when the payment is released. | ||
explain_document_request.h1 |
Explain why a document was requested | approved | A bank statement for the account the funds are sent from. | ||
explain_document_request.h2 |
Explain why a document was requested | approved | We just require the invoices for the payments going to {payee}. | ||
review_upcoming_exposure.1 |
Ask about upcoming payments | approved | What do you have coming up over the next few months in terms of payments abroad? | ||
review_upcoming_exposure.2 |
Ask about upcoming payments | draft | Are the supplier payments still roughly the same amounts and dates as before? | ||
review_upcoming_exposure.3 |
Ask about upcoming payments | draft | Is there anything on the horizon, a purchase or a larger payment, where the rate really matters? | ||
review_upcoming_exposure.h1 |
Ask about upcoming payments | approved | How much, roughly, do you need to do? | ||
offer_forward_for_known_future_payment.1 |
Offer a forward for a known future payment | approved | For a payment that far out you can fix today's rate with a forward: a deposit at booking, typically ten percent, and the balance at the agreed date. | ||
offer_forward_for_known_future_payment.2 |
Offer a forward for a known future payment | draft | You can draw it down in parts as invoices fall due, so you're not tied to one payment date. | ||
offer_forward_for_known_future_payment.3 |
Offer a forward for a known future payment | draft | It removes the rate risk but it is a commitment; if the rate moves a lot the partner may ask for additional margin. Shall I get you a forward quote to compare? | ||
offer_forward_for_known_future_payment.h1 |
Offer a forward for a known future payment | approved | Do you still want to lock the rate in today? | ||
offer_alert_or_market_order.1 |
Offer a rate alert or market order | approved | Rather than watching the screen, set a bookable alert at your target and it books or notifies you the moment it's hit. | ||
offer_alert_or_market_order.2 |
Offer a rate alert or market order | draft | What level would you be happy at? I'll set it now and you can change it any time. | ||
offer_alert_or_market_order.3 |
Offer a rate alert or market order | approved | If you want it hands-off, a market order executes automatically when the rate is reached. | ||
offer_alert_or_market_order.h1 |
Offer a rate alert or market order | approved | Are you looking at setting a rate alert? | ||
set_up_recurring_or_batch.1 |
Set up recurring or batch payments | approved | Your regular beneficiaries are saved, so each month it's a quote and two clicks; you don't re-enter anything. | ||
set_up_recurring_or_batch.2 |
Set up recurring or batch payments | approved | For the supplier run you can upload all the payments as one batch against a single trade. | ||
set_up_recurring_or_batch.3 |
Set up recurring or batch payments | approved | Would it help to set a recurring alert so you're prompted before each payroll date? | ||
add_user_access.1 |
Add a colleague or approval step | approved | You can add your bookkeeper with their own login and set exactly what they can do: quote, book, or add beneficiaries. | ||
add_user_access.2 |
Add a colleague or approval step | approved | If you'd like a second pair of eyes, payments and new beneficiaries can require approval from a second user before they go out. | ||
add_user_access.3 |
Add a colleague or approval step | draft | Send me their name and email and I'll set it up today. | ||
add_user_access.h1 |
Add a colleague or approval step | approved | I can add other people on there, if that would help. | ||
handle_service_complaint.1 |
Acknowledge a service failure and fix the process | draft | You're right, that shouldn't have happened, and I'm sorry. Here's what I'll change so it doesn't happen again. | ||
handle_service_complaint.2 |
Acknowledge a service failure and fix the process | draft | Tell me exactly what happened and when, and I'll raise it with the partner today. | ||
handle_service_complaint.3 |
Acknowledge a service failure and fix the process | draft | Going forward, I'll be your single point of contact for this; message me on the dashboard and I'll respond the same day. | ||
handle_service_complaint.h1 |
Acknowledge a service failure and fix the process | approved | I just got your email and wanted to give you a quick call to cover any concerns; I understand you're not pleased with how long it took. | ||
reengage_dormant_with_a_reason.1 |
Re-engage with a specific reason | approved | You last transferred in {month}; has the need gone away, or is something waiting on the rate? | ||
reengage_dormant_with_a_reason.2 |
Re-engage with a specific reason | draft | The rate has moved quite a bit since your last trade; is that relevant to anything you have coming up? | ||
reengage_dormant_with_a_reason.3 |
Re-engage with a specific reason | approved | Is there anything about the platform or the process that put you off using it again? | ||
accept_no_need_gracefully.1 |
Accept there is no current need | approved | Understood. Your account stays open at no cost, and if anything comes up you can book online or call me. | ||
accept_no_need_gracefully.2 |
Accept there is no current need | draft | Would a rate alert on your usual pair be useful, just so you hear if it moves in your favour? | ||
accept_no_need_gracefully.3 |
Accept there is no current need | approved | Thanks for your time; I'll leave you alone until you need us. | ||
agree_next_step.1 |
Agree the next step | draft | So: I'll send you a forward quote for the May payment today, and you'll upload the invoice for the pending one. I'll confirm both on the dashboard. | ||
agree_next_step.2 |
Agree the next step | draft | Shall I set the alert at your level now, and call you the day it triggers? | ||
agree_next_step.3 |
Agree the next step | draft | I'll message a summary of what we agreed; anything you want me to add? | ||
agree_next_step.h1 |
Agree the next step | approved | You should be able to book the trade now. | ||
agree_next_step.h2 |
Agree the next step | approved | You should have the delivery date; just choose the next day that's available. |
Customer success retired lines
| text_id | move | text | rule broken |
|---|---|---|---|
handle_rate_complaint.1 |
Handle a rate complaint | Let's look at the mid-market rate at the moment you booked and the margin you actually paid; then we can compare like for like. | Breaks 'Explain how the spread is built' (do-not): it walks the client through mid-market and the margin they paid. Compare what landed instead (competitor_named.2, qualify_the_quote.4). |
handle_rate_complaint.2 |
Handle a rate complaint | If a competitor quote is genuinely better on the same amount and date, tell me the rate and I'll see what the partners can do. | Invites a discount and a chase: 'tell me the rate and I'll see what the partners can do' breaks 'a concession given for nothing is a permanent price cut' and 'every match sets the new ceiling'. |
handle_rate_complaint.3 |
Handle a rate complaint | Margins vary by pair and amount; for the sizes you're doing I can check whether a different partner on the platform prices tighter. [VERIFY that reps may do this] | Breaks 'do not say it is standard for their volume': 'margins vary by pair and amount; for the sizes you're doing' concedes a better price exists for somebody, and it offers to find one. |
Customer success situations
Offer a forward for a known future payment (offer_forward_for_known_future_payment)
Also shows concession_terms (listed under Handle a rate complaint).
Handle a rate complaint (handle_rate_complaint)
Situation qualify_the_quote
- Headline
situation.qualify_the_quote.headline(draft): Qualify the quote before you respond - Hint
situation.qualify_the_quote.hint(draft): Ask calmly, in order. You are not challenging them, you are finding out what they are actually holding. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):qualify_the_quote.4 - Do-not flags:
rep_rubbished_competitor
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
qualify_the_quote.1 |
approved | verbatim | When did you get that rate? | |||
qualify_the_quote.2 |
approved | verbatim | Was that a live quote on your amount, or a headline off a website? | |||
qualify_the_quote.3 |
approved | verbatim | What were the fees on top, including the receiving bank's cut? | |||
qualify_the_quote.4 |
approved | verbatim | What actually landed in the beneficiary account last time, against what you were quoted? |
Situation no_quote_in_hand
- Headline
situation.no_quote_in_hand.headline(draft): Can you do better than that? - Hint
situation.no_quote_in_hand.hint(draft): Three beats, in order. Keep each one short: length reads as negotiation. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):no_quote_in_hand.2 - Do-not flags:
rep_improved_rate_unasked,rep_explained_spread,rep_said_standard_for_volume - Do not: Improve the rate to close a question that was not about the rate.
- Do not: Do not explain the pricing, and do not say it is standard for their volume: that concedes a better price exists for somebody, which is the door you were trying to shut.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
no_quote_in_hand.1 |
approved | verbatim | Better than what? | |||
no_quote_in_hand.2 |
approved | verbatim | No. That's the price. | |||
no_quote_in_hand.3 |
approved | verbatim | And it's live, so it's moving while we talk. Do you want it, or shall I requote in ten? |
Situation competitor_named
- Headline
situation.competitor_named.headline(draft): Company X gives me a better rate. - Hint
situation.competitor_named.hint(draft): Run the four qualifying questions before you say anything else. Move the comparison from one quote to the last three trades. - Ask the qualifying questions first (
qualify_first): yes - Core line (
core_text_id, said = handled):competitor_named.2 - Do-not flags:
rep_rubbished_competitor - Do not: Suggest they are wrong or lying, and do not rubbish the competitor by name. Both make you sound like the expensive option defending itself.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
competitor_named.1 |
approved | verbatim | They probably do on the first one. What matters is what you're getting on trade twenty, when nobody's watching. | |||
competitor_named.2 |
approved | verbatim | Pull your last three confirmations from them and let's compare what landed, not what was quoted. |
Situation serial_shopper
- Headline
situation.serial_shopper.headline(draft): I'll just check what the others are doing. - Hint
situation.serial_shopper.hint(draft): Price them for the time they cost, or let them go. Winning them at the floor is worse than losing them. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):serial_shopper.1 - Do-not flags:
rep_improved_rate_unasked - Do not: Chase them down on each trade. Every match sets the new ceiling and the next call starts below it.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
serial_shopper.1 |
approved | verbatim | Happy to quote you every time. If you want a better number without the ring-around, give me the flow for the quarter and I'll price it properly. |
Situation mid_market_comparison
- Headline
situation.mid_market_comparison.headline(draft): Why am I getting less than Google says? - Hint
situation.mid_market_comparison.hint(draft): Correct it once, briefly, and move to a comparison that can actually be made. If you argue the gap you are defending your margin on a call that was never about your margin. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):mid_market_comparison.2 - Do-not flags:
rep_explained_spread - Do not: Explain how the spread is built. The moment you break down your own pricing, the call is about what you make rather than what they get.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
mid_market_comparison.1 |
approved | verbatim | That's the mid-market rate. It's the midpoint between buying and selling, so it's a reference number rather than a price. Nobody trades at it, banks included. | |||
mid_market_comparison.2 |
approved | verbatim | The number worth comparing is what actually lands from us against what actually lands from your bank, same day, same amount. |
Situation bank_matched
- Headline
situation.bank_matched.headline(draft): I spoke to my bank and they've matched you. - Hint
situation.bank_matched.hint(draft): Do not argue the number. Test whether it survives. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):bank_matched.1 - Do-not flags:
rep_went_under_bank - Do not: Go under them. A bank defending one account is not pricing to make money on it, and you cannot win that on price. Win it on the six months after they stop paying attention.
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
bank_matched.1 |
approved | verbatim | Good. That's the first time they've sharpened up for you. Ask them to hold it in writing for the next twelve months and see what comes back. | |||
bank_matched.2 |
approved | verbatim | Worth looking at what they were giving you before we started quoting. That's their real price, the one that applies when nobody's pushing. |
Situation concession_terms
- Headline
situation.concession_terms.headline(draft): If you do move on price - Hint
situation.concession_terms.hint(draft): Get something on the call, not vaguely later. - Ask the qualifying questions first (
qualify_first): no - Core line (
core_text_id, said = handled):concession_terms.5 - Do-not flags:
rep_improved_rate_unasked
| text_id | status | locked | text | VERIFY | CONCRETE FACT | note |
|---|---|---|---|---|---|---|
concession_terms.1 |
approved | verbatim | Volume. A monthly or quarterly commitment that puts them in the band you are pricing them at. | |||
concession_terms.2 |
approved | verbatim | Consolidation. The corridors they currently run elsewhere come to you. | |||
concession_terms.3 |
approved | verbatim | Forward cover. The next tranche booked forward rather than left to shop. | |||
concession_terms.4 |
approved | verbatim | Introduction. The finance contact at the group company, the supplier, the sister office. | |||
concession_terms.5 |
approved | verbatim | The rate is one number on one day. What you're paying for is knowing what it'll be worth when it lands and when it'll get there. If you press send and then spend two days chasing, the half pip you saved cost you more than it was worth. |
Customer success move headlines
| text_id | move | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
headline.resolve_the_issue_first |
Deal with the live issue before anything else | draft | Client has a problem with a payment | ||
headline.give_status_with_specifics |
State the status with specifics | draft | Client asks where their money is | ||
headline.explain_document_request |
Explain why a document was requested | draft | Client is annoyed by a document request | ||
headline.review_upcoming_exposure |
Ask about upcoming payments | draft | Upcoming payments are not known yet | ||
headline.offer_forward_for_known_future_payment |
Offer a forward for a known future payment | draft | Client has a big payment coming up | ||
headline.offer_alert_or_market_order |
Offer a rate alert or market order | draft | Client wants to wait for a better rate | ||
headline.set_up_recurring_or_batch |
Set up recurring or batch payments | draft | Client sends the same payments one by one | ||
headline.add_user_access |
Add a colleague or approval step | draft | A colleague also needs to book payments | ||
headline.handle_rate_complaint |
Handle a rate complaint | draft | Client says the rate has got worse | ||
headline.handle_service_complaint |
Acknowledge a service failure and fix the process | draft | Client is unhappy with how we handled it | ||
headline.reengage_dormant_with_a_reason |
Re-engage with a specific reason | draft | Client hasn't traded in a while | ||
headline.accept_no_need_gracefully |
Accept there is no current need | draft | Client has no transfers planned | ||
headline.agree_next_step |
Agree the next step | draft | Client is ready for the next step |
Customer success concern headlines
| text_id | concern | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
concern.rate.headline |
rate |
draft | Client thinks our rate is too high | ||
concern.service_issue.headline |
service_issue |
draft | Client has a problem with a payment | ||
concern.settlement_delay.headline |
settlement_delay |
draft | Client's payment hasn't arrived | ||
concern.fees.headline |
fees |
draft | Client is comparing our fees with their bank | ||
concern.alternative_provider.headline |
alternative_provider |
draft | Client is looking at another provider | ||
concern.no_need_now.headline |
no_need_now |
draft | Client has nothing to send right now | ||
concern.trust.headline |
trust |
draft | Client has doubts about us | ||
concern.money.headline |
money |
draft | Client has a worry about cost | ||
concern.process.headline |
process |
draft | Client has a worry about the process |
Customer success caution notes
| text_id | risk rule | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
caution.rep_made_guarantee |
Rep made a guarantee | draft | That sounded like a guarantee. | ||
caution.rep_made_rate_prediction |
Rep predicted the rate | draft | That sounded like a rate prediction. | ||
caution.rep_improved_rate_unasked |
Rep moved on price for nothing | draft | That moved the price for nothing. Get something on the call for it. | ||
caution.rep_explained_spread |
Rep explained the spread | draft | That explained our margin. Compare what lands instead. | ||
caution.rep_said_standard_for_volume |
Rep said the rate is standard for their volume | draft | 'Standard for your volume' says somebody gets a better price. | ||
caution.rep_rubbished_competitor |
Rep ran down a competitor or the client's quote | draft | Running them down makes us sound like the expensive option. | ||
caution.rep_went_under_bank |
Rep offered to go under the bank | draft | Don't go under the bank. Test whether their price survives. |
Customer success call purposes
| text_id | purpose | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
plan.purpose.transfer_issue |
transfer_issue |
draft | Transfer issue | ||
plan.purpose.status_update |
status_update |
draft | Status update | ||
plan.purpose.rate_or_hedging |
rate_or_hedging |
draft | Rate or hedging | ||
plan.purpose.recurring_or_batch_setup |
recurring_or_batch_setup |
draft | Recurring or batch payments | ||
plan.purpose.dormant_reengagement |
dormant_reengagement |
draft | Checking in after a quiet spell | ||
plan.purpose.other |
other |
draft | Other |
Customer success client fact labels
| text_id | slot: value | status | text | VERIFY | CONCRETE FACT |
|---|---|---|---|---|---|
plan.fact.client_type.personal |
client_type: personal |
draft | Personal client | ||
plan.fact.client_type.corporate |
client_type: corporate |
draft | Corporate client | ||
plan.fact.amount.template |
amount: template |
draft | About {amount} {currency} | ||
plan.fact.frequency.one_off |
frequency: one_off |
draft | One-off transfer | ||
plan.fact.frequency.weekly |
frequency: weekly |
draft | Weekly transfers | ||
plan.fact.frequency.monthly |
frequency: monthly |
draft | Monthly transfers | ||
plan.fact.frequency.quarterly |
frequency: quarterly |
draft | Quarterly transfers | ||
plan.fact.frequency.irregular |
frequency: irregular |
draft | Transfers now and then | ||
plan.fact.currency_pair.template |
currency_pair: template |
draft | {sell} to {buy} | ||
plan.fact.transfer_purpose.property |
transfer_purpose: property |
draft | For a property | ||
plan.fact.transfer_purpose.family_support |
transfer_purpose: family_support |
draft | Supporting family | ||
plan.fact.transfer_purpose.salary_or_pension |
transfer_purpose: salary_or_pension |
draft | Salary or pension | ||
plan.fact.transfer_purpose.supplier_payment |
transfer_purpose: supplier_payment |
draft | Paying suppliers | ||
plan.fact.transfer_purpose.school_fees |
transfer_purpose: school_fees |
draft | School fees | ||
plan.fact.transfer_purpose.investment |
transfer_purpose: investment |
draft | Investment | ||
plan.fact.transfer_purpose.other |
transfer_purpose: other |
draft | Another purpose | ||
plan.fact.residency.GB |
residency: GB |
draft | Lives in the UK | ||
plan.fact.residency.IE |
residency: IE |
draft | Lives in Ireland | ||
plan.fact.residency.FR |
residency: FR |
draft | Lives in France | ||
plan.fact.residency.ES |
residency: ES |
draft | Lives in Spain | ||
plan.fact.residency.PT |
residency: PT |
draft | Lives in Portugal | ||
plan.fact.residency.DE |
residency: DE |
draft | Lives in Germany | ||
plan.fact.residency.IT |
residency: IT |
draft | Lives in Italy | ||
plan.fact.residency.NL |
residency: NL |
draft | Lives in the Netherlands | ||
plan.fact.residency.BE |
residency: BE |
draft | Lives in Belgium | ||
plan.fact.residency.CH |
residency: CH |
draft | Lives in Switzerland | ||
plan.fact.residency.AT |
residency: AT |
draft | Lives in Austria | ||
plan.fact.residency.SE |
residency: SE |
draft | Lives in Sweden | ||
plan.fact.residency.NO |
residency: NO |
draft | Lives in Norway | ||
plan.fact.residency.DK |
residency: DK |
draft | Lives in Denmark | ||
plan.fact.residency.PL |
residency: PL |
draft | Lives in Poland | ||
plan.fact.residency.GR |
residency: GR |
draft | Lives in Greece | ||
plan.fact.residency.CY |
residency: CY |
draft | Lives in Cyprus | ||
plan.fact.residency.MT |
residency: MT |
draft | Lives in Malta | ||
plan.fact.residency.US |
residency: US |
draft | Lives in the US | ||
plan.fact.residency.CA |
residency: CA |
draft | Lives in Canada | ||
plan.fact.residency.MX |
residency: MX |
draft | Lives in Mexico | ||
plan.fact.residency.AU |
residency: AU |
draft | Lives in Australia | ||
plan.fact.residency.NZ |
residency: NZ |
draft | Lives in New Zealand | ||
plan.fact.residency.SA |
residency: SA |
draft | Lives in Saudi Arabia | ||
plan.fact.residency.AE |
residency: AE |
draft | Lives in the UAE | ||
plan.fact.residency.QA |
residency: QA |
draft | Lives in Qatar | ||
plan.fact.residency.ZA |
residency: ZA |
draft | Lives in South Africa | ||
plan.fact.residency.IN |
residency: IN |
draft | Lives in India | ||
plan.fact.residency.CN |
residency: CN |
draft | Lives in China | ||
plan.fact.residency.HK |
residency: HK |
draft | Lives in Hong Kong | ||
plan.fact.residency.SG |
residency: SG |
draft | Lives in Singapore | ||
plan.fact.residency.JP |
residency: JP |
draft | Lives in Japan | ||
plan.fact.residency.TH |
residency: TH |
draft | Lives in Thailand | ||
plan.fact.residency.IL |
residency: IL |
draft | Lives in Israel | ||
plan.fact.residency.TR |
residency: TR |
draft | Lives in Turkey | ||
plan.fact.timing.this_week |
timing: this_week |
draft | Needed this week | ||
plan.fact.timing.this_month |
timing: this_month |
draft | Needed this month | ||
plan.fact.timing.within_three_months |
timing: within_three_months |
draft | Within three months | ||
plan.fact.timing.later |
timing: later |
draft | Not for three months or more | ||
plan.fact.timing.no_date |
timing: no_date |
draft | No fixed date | ||
plan.fact.decision_maker.caller |
decision_maker: caller |
draft | Caller decides | ||
plan.fact.decision_maker.colleague |
decision_maker: colleague |
draft | A colleague books or decides | ||
plan.fact.decision_maker.partner_or_family |
decision_maker: partner_or_family |
draft | Decides with family | ||
plan.fact.decision_maker.director_or_owner |
decision_maker: director_or_owner |
draft | Director or owner decides | ||
plan.fact.decision_maker.accountant |
decision_maker: accountant |
draft | Accountant involved | ||
plan.fact.funding_account.own_account |
funding_account: own_account |
draft | Pays from own account | ||
plan.fact.funding_account.company_account |
funding_account: company_account |
draft | Pays from company account | ||
plan.fact.funding_account.third_party |
funding_account: third_party |
draft | Someone else pays | ||
plan.fact.documents_status.complete |
documents_status: complete |
draft | Documents complete | ||
plan.fact.documents_status.proof_of_address_outstanding |
documents_status: proof_of_address_outstanding |
draft | Proof of address to come | ||
plan.fact.documents_status.id_outstanding |
documents_status: id_outstanding |
draft | ID to come | ||
plan.fact.documents_status.company_documents_outstanding |
documents_status: company_documents_outstanding |
draft | Company documents to come | ||
plan.fact.documents_status.source_of_funds_requested |
documents_status: source_of_funds_requested |
draft | Source of funds asked for | ||
plan.fact.current_provider.bank |
current_provider: bank |
draft | Uses their bank now | ||
plan.fact.current_provider.wise |
current_provider: wise |
draft | Uses Wise now | ||
plan.fact.current_provider.revolut |
current_provider: revolut |
draft | Uses Revolut now | ||
plan.fact.current_provider.other_broker |
current_provider: other_broker |
draft | Uses another broker | ||
plan.fact.rate_expectation.has_target_rate |
rate_expectation: has_target_rate |
draft | Has a target rate | ||
plan.fact.rate_expectation.wants_best_rate_now |
rate_expectation: wants_best_rate_now |
draft | Wants the best rate now | ||
plan.fact.rate_expectation.waiting_for_better_rate |
rate_expectation: waiting_for_better_rate |
draft | Waiting for a better rate | ||
plan.fact.rate_expectation.no_view |
rate_expectation: no_view |
draft | No view on the rate |
Customer success plan templates
Item texts (title, hint, not-needed reason) are approved like a headline; their text_id is plan.template.<purpose>.<item>.title|hint|not_needed.
transfer_issue
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
confirm_caller |
Confirm the caller is on the account (draft) | Know who is calling and whether they can act on the account. | always | none | the decision_maker fact known |
|
resolve_the_issue_first |
Resolve the issue (draft) | Find the cause and own it before anything else. | always | resolve_the_issue_first |
issue_resolved_or_owned said |
|
give_status_with_specifics |
Status with specifics (draft) | Amounts, references and what happens next, in the client's words. | always | give_status_with_specifics |
rep_checked_status_with_specifics said |
|
review_upcoming_exposure |
Upcoming payments (draft) | Learn what else is coming so the right tool can be offered. | always | review_upcoming_exposure |
upcoming_payment_known persisted |
|
tools_that_fit |
Tools that fit (draft) | An alert, a forward or a recurring payment, whichever fits what is coming up. | always | offer_alert_or_market_order |
its points delivered | |
explain_document_request |
Explain the document request (draft) | Why the partner asked for a document, and what it needs. | unless the documents_status fact is complete (applies while unknown) |
No document was asked for | explain_document_request |
its points delivered |
agree_next_step |
Agree the next step (draft) | One concrete action, confirmed on the dashboard. | always | agree_next_step |
next_step_agreed persisted |
status_update
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
confirm_caller |
Confirm the caller is on the account (draft) | Know who is calling and whether they can act on the account. | always | none | the decision_maker fact known |
|
give_status_with_specifics |
Status with specifics (draft) | Amounts, references and what happens next, in the client's words. | always | give_status_with_specifics |
rep_checked_status_with_specifics said |
|
review_upcoming_exposure |
Upcoming payments (draft) | Learn what else is coming so the right tool can be offered. | always | review_upcoming_exposure |
upcoming_payment_known persisted |
|
agree_next_step |
Agree the next step (draft) | One concrete action, confirmed on the dashboard. | always | agree_next_step |
next_step_agreed persisted |
rate_or_hedging
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
review_upcoming_exposure |
Upcoming payments (draft) | Learn what else is coming so the right tool can be offered. | always | review_upcoming_exposure |
upcoming_payment_known persisted |
|
offer_forward |
Fix the rate for a known payment (draft) | A forward removes the rate risk on a payment with a date; say what it commits them to. | always | offer_forward_for_known_future_payment |
said_forward_deposit_and_liability said |
|
offer_alert_or_market_order |
Offer a rate alert (draft) | A target rate that books or notifies, instead of watching the screen. | always | offer_alert_or_market_order |
its points delivered | |
agree_next_step |
Agree the next step (draft) | One concrete action, confirmed on the dashboard. | always | agree_next_step |
next_step_agreed persisted |
recurring_or_batch_setup
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
review_upcoming_exposure |
Upcoming payments (draft) | Learn what else is coming so the right tool can be offered. | always | review_upcoming_exposure |
upcoming_payment_known persisted |
|
set_up_recurring_or_batch |
Recurring payments (draft) | Regular payments set up once instead of booked one by one. | always | set_up_recurring_or_batch |
its points delivered | |
add_user_access |
Who else books payments (draft) | A colleague or bookkeeper with their own login and limits. | while the decision_maker fact is colleague, accountant, director_or_owner (applies while unknown) |
The caller books the payments themselves | add_user_access |
its points delivered |
agree_next_step |
Agree the next step (draft) | One concrete action, confirmed on the dashboard. | always | agree_next_step |
next_step_agreed persisted |
dormant_reengagement
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
reengage_dormant_with_a_reason |
Reconnect with a reason (draft) | Find out whether the need went away or something put them off. | always | reengage_dormant_with_a_reason |
its points delivered | |
review_upcoming_exposure |
Upcoming payments (draft) | Learn what else is coming so the right tool can be offered. | always | review_upcoming_exposure |
upcoming_payment_known persisted |
|
offer_alert_or_market_order |
Offer a rate alert (draft) | A target rate that books or notifies, instead of watching the screen. | always | offer_alert_or_market_order |
its points delivered | |
agree_next_step |
Agree the next step (draft) | One concrete action, confirmed on the dashboard. | always | agree_next_step |
next_step_agreed persisted |
other
| item | title | hint | applies | not needed because | points from | done when |
|---|---|---|---|---|---|---|
confirm_caller |
Confirm the caller is on the account (draft) | Know who is calling and whether they can act on the account. | always | none | the decision_maker fact known |
|
review_upcoming_exposure |
Upcoming payments (draft) | Learn what else is coming so the right tool can be offered. | always | review_upcoming_exposure |
upcoming_payment_known persisted |
|
agree_next_step |
Agree the next step (draft) | One concrete action, confirmed on the dashboard. | always | agree_next_step |
next_step_agreed persisted |
Client asks (a client-persisted fact inserts its move as a later item): client_asked_about_access → add_user_access, client_asked_about_recurring → set_up_recurring_or_batch, client_asked_about_alerts_or_orders → offer_alert_or_market_order, client_asked_about_forwards → offer_forward_for_known_future_payment.
- Rate pressure title
plan.rate_pressure.title(draft): Rate pressure - Ask first from
qualify_the_quote; concession points fromconcession_terms; headline, hint, points and do-not flags from the situation chosen for the call.
Customer success checklist
| id | item | applies | ticked by (rep turns only) |
|---|---|---|---|
issue_resolved_or_owned |
Issue resolved or owned | once issue_reported is persisted |
In recent_transcript, has the rep either resolved the client's reported problem or stated exactly what they will do about it and by when? |
rep_checked_status_with_specifics |
Status checked with specifics | once issue_reported is persisted |
Does latest_utterance.text, spoken by the rep (latest_utterance.speaker is rep), state the current status of a specific trade or payment with a concrete detail such as a time, a status word, a reference, or the partner's name? |
said_forward_deposit_and_liability |
Forward deposit and liability | once client_asked_about_forwards is persisted |
In recent_transcript, if a forward contract was discussed, has the rep explained that a deposit is required at booking, that the balance is paid at the agreed date, and that the client is committed to the contract? |
rate_pressure_handled |
Rate pushback handled | once rate_pressure_raised is persisted |
In recent_transcript, has the rep answered the client's pushback on the rate without defending or moving the price, either by asking about the competing quote or by holding the price and changing what is being compared? |
said_recording_disclosure |
Recording disclosure | never (not counted until decided) | no question yet (open question for Stevan) |