CurrencyTransfer domain brief for the call copilot (v0)
Status: research draft, 2026-09-24. Everything here is either cited or marked ASSUMPTION. Sections 4 and 5 (question bank, playbook) are DRAFT for Stevan to correct — they are the first thing an admin should red-pen before any of it reaches a rep.
Companion documents (same research batch): the reference copilot dissection and the Cloudflare/Jev architecture notes live next to this file when written. This brief is only the domain half: what CT is, what the two calls are for, what a rep must say and hear, and a v0 question bank + playbook in the reference copilot's style.
0. Sources consulted
| Source | What it gave |
|---|---|
/home/stevan/dev/jev/reference/jev-sales-copilot/README.md, copilot/constants.py, data/playbook.json |
The question-bank and playbook style we are copying (nouls masked by speaker, durable facts, 3-level scores, {what, not_for} choices, confidence gates). |
/home/stevan/dev/jev/docs/vendor/typesafe/model-jaggedness__jev-1.13.md |
Prompt-writing rules: literal reading, no math/counting/dates in the model, no indirection, small state, aligned instruction/criteria, no cross-question invariants, no generation. |
/home/stevan/dev/jev/docs/vendor/typesafe/concepts__how-to-build-with-system-one.md |
Atomic questions, backticked state paths, {what, not_for, examples} criteria objects, combine in code, route on confidence. |
/home/stevan/dev/jev/docs/vendor/typesafe/primitives__{noul,choice,score}.md |
Request/response shapes; Choice takes an other/none option; Score levels are descriptions, not numbers. |
~/.claude/skills/ct-sql/SKILL.md + references/{schema,gotchas,tables,learnings}.md |
The CT production data model: onboarding states, activation definition, trade statuses, quotes, alerts, forwards, beneficiaries, RMs, brokers. Authoritative for what actually happens in the journey. |
~/.claude/skills/ct-pd/SKILL.md |
CT revenue = settled commission from partners (revenue_gbp_* = "settled commission to CT, GBP"); Pipedrive holds the sales process, lost reasons (e.g. "Client jurisdiction" is a top lost reason). |
~/dev/currencytransfer/README.md, CLAUDE.md, docs/ |
Only engineering docs (Rails 8 / Angular 18; partner API gems tcc, corpay, clear_treasury, moneycorp, …). No product/marketing copy in the repo. Not crawled further, per task. |
~/dev/mcp-currencytransfer/README.md |
The client API surface: quotes, trades + documents, beneficiaries, balances, rate alerts, RSI (MOEX) alerts and market orders, cut-off times. |
~/dev/ct-whatsapp/TLDR.md |
Quote lifetime ≈ 10 s on the platform; beneficiaries are the safety boundary; WhatsApp channel project. |
~/dev/callum-ai/README.md |
Not CT-domain (Spanish property leads for estate agents). Listed only because it was a candidate "call" directory; irrelevant here. |
No local "call coach" directory exists under ~/dev (checked ls ~/dev, grep for coach/transcript). The call-coach transcripts are on a remote server Stevan mentioned; nothing from them is used in this brief. |
|
Public web: currencytransfer.com pages listed inline below (/, /product, /spot-transfers, /forward-contracts, /business-foreign-exchange, /safeguarding-of-funds, /security-regulation, /partners, /faq/*). Fetched 2026-09-24. |
Legend used below: [web: path] = currencytransfer.com page; [db: …] = CT schema fact from the ct-sql skill references; ASSUMPTION = not verified.
1. What CurrencyTransfer is, and the customer journey
1.1 The business in one paragraph (sourced)
- CT is a marketplace/platform, not the payment institution. "Any transaction booked via the CurrencyTransfer platform is contracting directly with a clearly identified regulated Payment Partner"; "CurrencyTransfer does not touch client funds at any point of any transaction." [web: /faq/what-is-currencytransfer, /security-regulation]
- Each transfer is routed "to the regulated payment institution suited to it based on currency, country, timing and amount", the client sees "one clear quote" and deals "with one person throughout". [web: /]
- Payment partners shown on the site (logos): Central FX, Clear Treasury, Corpay, Currencycloud, GC Partners, Moneycorp, MoneyNet, Privalgo, TheFXBroker, Verto. [web: /partners] The DB's live broker list agrees and adds Sable International FX, iBan First, TheFXBroker EU, Corpay Offline; Central FX was deleted in the DB in 2026-01 while its logo is still on the site. [db: schema.md
brokers] → Q for Stevan: which partners should a rep name on a call today? - Safeguarding: "the regulated payment/e-money institutions who we work with safeguard your funds", "held at reputable banks or covered by an insurance policy", "protected for you in the event of our partner e-money/payment institutions', or our, insolvency"; safeguarding stops "when the money has been paid out of your account to your beneficiary's account". [web: /safeguarding-of-funds] FSCS is not mentioned anywhere (it does not apply to payment/e-money institutions — that is a UK-regulatory fact, not a CT claim; rep should not imply FSCS cover).
- Regulation wording on the site: "We only stream live exchange rates with foreign exchange suppliers that are supervised by HMRC and FCA authorized money service businesses"; "All our contributing providers follow a strict code to segregate client accounts". CurrencyTransfer LTD, company no. 08806732, ICO-registered. [web: /security-regulation]
- Pricing: no transfer fees; "the mid‑market rate and the rate you are getting" are shown side by side, "guaranteeing no hidden fees"; "the rate you're quoted is the rate you get". [web: /, /product, /spot-transfers] CT's own revenue is commission paid by the partner on settled trades [db:
trade_details.commission; ct-pd:revenue_gbp_all= "settled commission to CT"]. The site does not spell out the commission mechanism to clients. → the rep needs an approved one-liner (Section 2.3). - Minimum £5,000 GBP equivalent per transfer; no maximum; average transfer > £20,000, many > £100,000. [web: /faq/minimum-maximum-amount, /business-foreign-exchange]
- Quotes "refreshed every 15 seconds" on the marketing site [web: /spot-transfers]; the platform quote actually lives ≈10 s before it must be re-fetched [
~/dev/ct-whatsapp/TLDR.md]. Once booked, "your rate is secured for that specific transaction". [web: /spot-transfers] - Spot settlement: "same-day settlement is available for major currency pairs where funds clear before the payment partner's cut-off time — typically 2pm UK time"; other pairs "up to 5 working days"; Israel "typically two days". [web: /spot-transfers, /business-foreign-exchange]
- Forwards: "lock in today's rate for your future payments" up to 12 months [web: /forward-contracts, /business-foreign-exchange] — but
/productsays "up to two years". Site inconsistency → Q for Stevan. "Only a 10% deposit is required by our payment partners upon booking"; partial drawdowns allowed; currency options also offered. [web: /forward-contracts] Forwards are enabled per client and per pair, with deposit/margin-call agreement timestamps. [db: tables.mdforward_contract_settings,trade_bookings.forward_deposit] - Rate alerts: "personalised bookable rate alerts" that notify or auto-book when a target is hit [web: /product]; DB has
rate_alerts(target_rate,bookauto-book flag, expiration) and RSI/"MOEX" alerts + market orders [db: tables.md; web: /faq/moex-market-orders]. - Cancellation: once booked "the selected Payment Partner immediately covers the position"; if the client cannot settle, the partner sells back and "you are contractually liable for the loss"; contact the RM at the earliest opportunity. [web: /faq/refund-on-money-transfer]
- Relationship managers: every account gets "an allocated relationship manager"; the site names Tom, Sara, Nico, Saul; phone +44 (0)20 7096 1036. [web: /product] DB:
accounts.relationship_manager_id(house basis), Nico = RM 6516. [db: gotchas #10, schema.md] - Segments: personal (expat, overseas property, salary) and business (importers/exporters, marketplace sellers, forwards, mass payments). [web: /, /business-foreign-exchange] DB streams: PFX (personal), CFX (corporate), SAR (Saudi compound segment), IL (Israel). [db: schema.md]
1.2 The customer journey, as the data actually records it
Stated as the DB states because those are what the copilot will eventually read from call_facts.
| Step | What the client does | What the system records | Source |
|---|---|---|---|
| 1. Sign-up | Email + password; chooses personal vs corporate | accounts row; clients.type (PersonalAccount, SoleTrader, LimitedCompany, … or NULL if they bounce before choosing) |
[db: schema.md clients] |
| 2. Onboarding wizard | Purpose, expected first trade, expected volume, currencies, countries, source of funds, "currently trade with", "hear about us" | clients.purpose, expected_first_trade, expected_volume_from/to, sell_currencies[], buy_currencies[], source_countries[], destination_countries[], source_of_funds, currently_trade_with, trade_frequency, data.last_step |
[db: schema.md] |
| 3. Submit | Final wizard step | completed_registration_at — UX submission only, not KYC |
[db: gotchas #2] |
| 4. Docs / KYC | Uploads ID + proof of address (private); registration docs, director verification, UBO ID+address (corporate) | clients.status → awaiting_docs / awaiting_processing / submitted; documents |
[web: /faq/proof-of-address, /business-foreign-exchange; db: schema.md] |
| 5. Activation call ("Discuss your transfer requirements with our activations team") | This is the onboarding call of this brief — ASSUMPTION that it is the same call | not recorded as such in the DB (Pipedrive activity, sparse) | [web: /faq/registration-and-on-boarding; ct-pd gotcha 4] |
| 6. Broker notification | Application sent to one or more partners | broker_accounts.notified_at |
[db: schema.md broker_accounts] |
| 7. Activated | Partner approves | broker_accounts.status='verified', verified_at — the house definition of "activated" |
[db: learnings 2026-06-15] |
| 8. Beneficiary set-up | Can be done while awaiting activation | beneficiaries (4-eyes approval available via pending_approvals) |
[web: /faq/registration-and-on-boarding; db: tables.md] |
| 9. Quote → book | Client requests quotes; books | quotes (type='by_client', ≈22.6% quote→trade), trade_bookings.status='awaiting_payment_details' → awaiting_funds |
[db: gotchas #11, #12] |
| 10. Fund | Bank transfer to the partner (never to CT) from an account in the client's own name | awaiting_funds → processing; open-banking settlement exists |
[web: /spot-transfers, /faq (accounts not in my name); db: tables.md] |
| 11. Settle / pay out | Partner converts and pays the beneficiary; supporting docs may be requested per payment | trade_bookings.status='settled'; beneficiary_payments; trade_documents; brokers.need_payment_supporting_documents |
[db: schema.md, tables.md] |
| 12. Repeat / manage | Rate alerts, RSI/MOEX, forwards with drawdowns, mass payments, multi-user access | rate_alerts, rsi_alerts, forward_contract_settings, mass_payments, trading_authorizations |
[db: tables.md] |
Two data facts the copilot should exploit later: (a) clients.* from step 2 is a ready-made pre-call brief (what they said they want to do) and (b) broker_accounts.status tells the rep whether the client is already tradable during the call.
Where clients are lost (for objection design): Pipedrive's top lost reason is "Client jurisdiction" (≈9k deals across spellings) [ct-pd gotcha 5] — i.e. a large share of onboarding calls end with "we can't service your country/segment", which the copilot should detect early rather than coach around.
2. The ONBOARDING call
2.1 Definition and goals
ASSUMPTION: the onboarding call is the "discuss your transfer requirements with our activations team" step [web: /faq/registration-and-on-boarding], run by an RM/activations person, with a client who has submitted the wizard and some or all documents, before or just after partner activation.
Goals, in priority order (DRAFT — Stevan to reorder):
- Establish serviceability early — jurisdiction, client type, purpose, source of funds, currency pair — so a can't-service outcome is reached in 3 minutes, not 20.
- Complete KYC — which documents are missing, get commitment to upload today.
- Understand the first trade — amount, pair, when, to whom (beneficiary), one-off vs recurring.
- Say the compliance/safeguarding things (2.3) and set expectations on rate, settlement, cut-offs, funding-from-own-account.
- Book a concrete next step — first trade booked on the call, or a date/rate target, or a rate alert set.
2.2 Facts the rep must establish (durable facts; map 1:1 to clients columns where possible)
| Fact id | What | DB anchor |
|---|---|---|
purpose_known |
Why they are transferring (property, salary, supplier invoices, emigration, tuition…) | clients.purpose, purpose_group, reason of payment [web: /faq/reason-of-payment] |
pair_known |
Sell currency → buy currency | clients.sell_currencies/buy_currencies |
amount_known |
Approximate first-trade size and whether ≥ £5k equiv. | expected_volume_* — extract the number in code, not with Jev |
timing_known |
When the first transfer must land (date, event, "when the rate hits X") | expected_first_trade |
frequency_known |
One-off vs recurring (monthly salary, quarterly supplier run) | clients.trade_frequency |
funding_source_known |
Which bank account the funds come from and that it is in the client's own name | source_of_funds; [web: /faq "accounts not in my name"] |
beneficiary_known |
Who is paid, country, whether details are to hand | beneficiaries, destination_countries |
docs_status_known |
Which KYC docs are uploaded/missing | clients.status, documents |
current_provider_known |
Bank / Wise / Revolut / another broker, and the rate they got | clients.currently_trade_with |
decision_maker_known (corporate) |
Who signs off, who will operate the account, need for multi-user access | trading_authorizations |
jurisdiction_serviceable |
Country of residence / registration is one a partner accepts | clients.data.address.country; broker suitability flags afex_suitable/corpay_suitable/tcc_suitable [db: schema.md] |
2.3 Things the rep must say (the "checklist" the copilot ticks off)
Each is a rep-turn noul in Section 4. Wording is DRAFT and must be replaced by compliance-approved lines.
| Checklist id | The point that must be made | Source for the fact |
|---|---|---|
said_who_holds_funds |
CT is the platform; the transfer contracts with a named FCA-authorised payment partner; CT never touches client money; funds are safeguarded by the partner (segregated/insured), not FSCS. | [web: /safeguarding-of-funds, /security-regulation] |
said_rate_transparency |
The dashboard shows the mid-market rate next to the client's rate; no transfer fee; the partner's margin is inside the rate; the quoted rate is the booked rate. | [web: /product, /spot-transfers] |
said_quote_lifetime |
Live quotes expire in seconds and must be re-quoted; a booking locks the rate. | [~/dev/ct-whatsapp/TLDR.md; web: /spot-transfers] |
said_settlement_timing |
Same-day for majors if funds clear before the partner's cut-off (typically 2pm UK); other pairs up to 5 working days; Israel ~2 days. | [web: /spot-transfers, /business-foreign-exchange] |
said_fund_from_own_account |
Funds must come from an account in the client's (or company's) own name, by bank transfer, to the partner's segregated account details shown after booking. | [web: /faq "accounts not in my name"; /spot-transfers] |
said_booking_is_binding |
A booking is a contract; if funds are not sent the partner reverses the position and any loss is the client's; call the RM immediately if there is a problem. | [web: /faq/refund-on-money-transfer] |
said_minimum |
£5,000 equivalent minimum; no maximum. | [web: /faq/minimum-maximum-amount] |
said_docs_needed |
Exactly which documents are outstanding (private: ID + proof of address ≤3 months old, colour; corporate: registration docs, director ID, UBO ID + address) and that activation is usually same day once complete. | [web: /faq/proof-of-address, /business-foreign-exchange, /faq/registration-and-on-boarding] |
said_payment_reason |
Why a reason for payment / supporting document may be requested (AML/KYC regulatory requirement of the partner). | [web: /faq/reason-of-payment; db: brokers.need_payment_supporting_documents] |
said_rm_contact |
Who their RM is and how to reach them (dashboard messaging, phone). | [web: /product, /faq/registration-and-on-boarding] |
said_recording_disclosure |
ASSUMPTION / Q for Stevan: whether calls are recorded and whether that must be disclosed at the top of the call (it must if the copilot records them). | — |
2.4 Typical client questions and objections (with the sourced answer the playbook draws on)
| Client says | Objection type | What a good answer contains (sourced) |
|---|---|---|
| "How is your rate better than my bank / Wise / Revolut?" | rate / alternative_provider |
Show mid-market next to the client rate; banks mark up "by up to 3.75% above the mid-market rate, plus flat transfer fees" [web: /business-foreign-exchange]; ask what rate they were quoted and compare live rather than argue. Do not promise "always cheaper" — ASSUMPTION that compliance disallows absolute claims. |
| "Is my money safe? I've never heard of you." | safety / trust_in_ct |
CT never holds money; the partner is FCA-authorised and safeguards; name the partner they will be activated with; company no. 08806732; safeguarding continues until pay-out. [web: /safeguarding-of-funds, /security-regulation] |
| "Who actually are you then — a broker?" | trust_in_ct |
Platform + concierge; "Your transfer, handled by a real expert"; the contract is with the named partner. [web: /, /faq/what-is-currencytransfer] |
| "When will the money arrive?" | timing |
Cut-off rule and pair-dependent 0–5 working days; the tracker on the dashboard. [web: /spot-transfers, /product] |
| "What does it cost?" / "What's the catch with 0% commission?" | fees |
No transfer fee; the margin is inside the rate and visible against mid-market; CT is paid by the partner, not by adding to the rate (ASSUMPTION on exact wording). [web: /faq/what-does-0-commission-mean, /product] |
| "Why do you need my bank statement / the reason for payment?" | process_friction |
Regulated industry; partner's AML/KYC obligation; ≤3-month documents; same-day activation once in. [web: /faq/proof-of-address, /faq/reason-of-payment] |
| "Can my brother send the money from his account?" | process_friction |
Funds must come from an account in the client's name (FAQ exists; exact policy text not fetched — VERIFY). |
| "Can I cancel if the rate moves?" | process_friction / rate |
No — booking is binding; explain the reversal liability plainly before they book. [web: /faq/refund-on-money-transfer] |
| "It's only £3,000." | fees / no_need |
Below the £5k minimum; be honest that CT adds little value under £5k. [web: /faq/minimum-maximum-amount] |
| "I'm in [country you don't serve]" | jurisdiction → can't-service | Detect and end kindly; this is the #1 Pipedrive lost reason. [ct-pd gotcha 5] |
| "I'll wait, the rate might improve." | timing |
Offer a rate alert (bookable) or a forward/market order; do not forecast rates. [web: /product, /forward-contracts] |
| "I'll just send you the details, I'm busy." | disengaging | Ask for the one thing that unblocks activation (the missing doc), agree a time. |
3. The CUSTOMER SUCCESS call
3.1 Definition and goals
ASSUMPTION: a CS call is any RM-initiated or client-initiated call with an activated client (broker_accounts.verified_at set): check-ins, a trade in flight, a problem, a dormant-account re-engagement, or a hedging conversation. Not a sales call, but it often ends in a booking.
Goals (DRAFT):
- Resolve the client's live issue first (a payment that has not landed, a document request, a beneficiary change).
- Understand upcoming exposure — next payments, amounts, dates — and offer the right tool: spot, rate alert, market order, forward with drawdowns.
- Reactivate dormant clients with a specific reason to trade, not a generic "how are you".
- Capture the account's evolving profile (new pairs, new beneficiaries, new users needing
trading_authorizations). - Leave with a concrete next action (alert set, forward quoted, doc uploaded, trade booked, call scheduled).
3.2 Typical topics
| Topic | What is behind it | Anchors |
|---|---|---|
| Rate alerts / "call me when it hits X" | rate_alerts with optional auto-book; RSI/MOEX alerts |
[db: tables.md; web: /product, /faq/moex-market-orders] |
| Forward contracts / hedging | 12-month tenor, 10% deposit, partial drawdowns; margin calls exist (client agrees to deposit/margin-call terms) | [web: /forward-contracts; db: forward_contract_settings.agree_with_deposit/margin_calls] |
| Recurring payments (salary, pension, supplier runs) | Repeat spot trades to the same beneficiary; mass payments for corporates; dashboard recognises frequent recipients | [web: /product; db: mass_payments] |
| "My money hasn't arrived" | trade_bookings.status (awaiting_funds → processing → settled), beneficiary_payments.status, cut-off missed, supporting docs pending, SWIFT vs SEPA, MT103 request |
[db: schema.md; web: /faq (SWIFT, SEPA, MT103)] |
| "Why are you asking for an invoice for this payment?" | partner's need_payment_supporting_documents; trade_documents |
[db: tables.md] |
| Beneficiary changes / new payee | 4-eyes pending_approvals; beneficiary details validation (IBAN/ABA/CLABE…) |
[db: tables.md] |
| Adding a colleague / accountant | trading_authorizations permission arrays |
[db: tables.md] |
| Dormant account | no by_client quote or trade for N months (define N in code — Q for Stevan); rate has moved since last trade |
[db: gotchas #11] |
| Rate complaint ("I got a better rate elsewhere last week") | compare against mid-market at the time; margin is partner-set; offer alert/market order | [web: /product] |
| Regulation/safety re-check (e.g. after news about a partner) | same safeguarding facts as onboarding | [web: /safeguarding-of-funds] |
3.3 Objections in CS calls
rate ("your margin got worse"), service_issue ("last payment was late / docs chased twice"), settlement_delay, fees ("the receiving bank took a fee" — intermediary fees on SWIFT; VERIFY CT's wording), alternative_provider ("we moved to Wise/our bank's new platform"), no_need_now ("no payments this quarter"), trust (news about a partner), none.
4. v0 Jev question bank (DRAFT)
4.1 Conventions (copied from the reference copilot, adjusted to jev-1.13 rules)
- One request per utterance; all questions in one speculative fan-out (reference:
constants.pyQUESTIONS). Speaker-specific nouls are asked every turn and masked in code bylatest_utterance.speaker(Jev is literal; conditionals belong in code) [jaggedness: literal reading]. - Code, not Jev: amounts and currency codes (regex
\b(\d[\d,\.]*)\s*(k|m)?\b+ ISO-4217 list), dates and deadlines (extract in code, compare in code), talk ratio, pace, durations, counts of anything, the checklist tally, the composite scores. [jaggedness: math, dates, counting] - State is a rolling window (
recent_transcript, last 12 utterances) + a compactcall_factsobject, never the whole call. [jaggedness: large state] - Durable facts (
*_known,said_*) persist in code once a noul ≥ 0.70 and are fed back viacall_facts.known_facts/call_facts.checklist_doneso "ask about X" stops being suggested. (Reference:FACT_PERSIST_THRESHOLD.) - Every noul's
trueandfalsecriteria describe the same boundary from both sides, with examples, and high = yes. [jaggedness: contradictory criteria] - Choices always include
none/other; a Choice picks which, a separate noul decides whether (the two are not interchangeable). [jaggedness: structural invariants] - Scores: 3 levels described as concrete situations with
signals; the middle level is neutral in the composite. - No question asks Jev to write anything. Phrasings are hand-written; Jev only picks. Tailored phrasing (small generative LLM + Jev verification) is optional and identical to the reference design.
Speaker labels: rep and client (the reference uses prospect).
4.2 State shape (both scenarios)
{
"call_facts": {
"scenario": "onboarding",
"client_type": "personal",
"duration_min": 6.2,
"talk_ratio_rep": 0.58,
"stage_history": ["opening", "discovery"],
"known_facts": ["purpose_known", "pair_known"],
"checklist_done": ["said_who_holds_funds"],
"objection": {"open": true, "type": "rate"},
"pre_call": {
"purpose": "Overseas property purchase",
"sell_currency": "GBP",
"buy_currency": "EUR",
"expected_first_trade": "within 1 month",
"docs_status": "awaiting_docs",
"activated": false,
"currently_trade_with": "HSBC"
}
},
"recent_transcript": [
{"t": "05:12", "speaker": "rep", "text": "..."},
{"t": "05:31", "speaker": "client", "text": "..."}
],
"latest_utterance": {"t": "05:45", "speaker": "client", "text": "..."}
}
pre_call is filled from clients.* / broker_accounts.* [db: schema.md]; only the fields the questions reference are sent.
4.3 Shared questions (asked in both scenarios)
{
"client_objecting": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), raise a concern, doubt, or pushback about using CurrencyTransfer or about a specific trade?",
"criteria": {
"true": "Says the rate is worse than elsewhere, doubts the money is safe, complains about a delay or a document request, prefers their bank or another provider, says it is not worth it for the amount, or asks a skeptical 'why would I...' question.",
"false": "A neutral question about how something works, sharing information about their situation, agreement, thanks, or small talk."
}
},
"client_accepts": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), accept, agree with, or acknowledge as reasonable what the rep said in the previous turn?",
"criteria": {
"true": "'That makes sense', 'ok, fair enough', 'right, I see', 'that's fine', 'good to know'.",
"false": "A new concern, disagreement, a neutral question, or unrelated information."
}
},
"client_disengaging": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), signal that they want to end or shorten the call or brush the rep off?",
"criteria": {
"true": "'Just email me the details', 'I have to go', 'I'll think about it', 'not a priority right now', one-word dismissive answers.",
"false": "Engaged questions, detailed answers about their situation, or agreeing to a next step."
}
},
"client_confused": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), show that they did not understand what the rep said?",
"criteria": {
"true": "Asks the rep to repeat or explain, asks what a term such as 'mid-market', 'safeguarding', 'beneficiary', 'forward', 'cut-off' or 'drawdown' means, says 'I'm not sure I follow', or asks something the rep's previous turn already answered.",
"false": "A clear question about something new, a statement, or agreement."
}
},
"client_asked_about_rate": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask about the exchange rate, the margin, or how the rate compares with a bank or another provider?",
"criteria": {
"true": "'What rate would I get?', 'how does that compare to my bank?', 'is that better than Wise?', 'what's your margin?'.",
"false": "Questions about timing, documents, safety, or fees other than the rate; statements; small talk."
}
},
"client_asked_about_safety": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask whether the client's money is safe, who holds it, how CurrencyTransfer or its partners are regulated, or what happens if a company fails?",
"criteria": {
"true": "'Is my money safe?', 'who are you regulated by?', 'who actually holds the funds?', 'what if you go bust?', 'are you FCA regulated?'.",
"false": "Questions about rate, timing, documents, or fees; statements; small talk."
}
},
"client_asked_about_timing": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask when funds will arrive, how long a transfer takes, or about a cut-off time?",
"criteria": {
"true": "'When will it land?', 'how long does it take?', 'can it be there by Friday?', 'what's the cut-off?'.",
"false": "Questions about rate, safety, documents, or fees; statements; small talk."
}
},
"client_asked_about_fees": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask what the transfer costs, whether there are fees or commission, or how CurrencyTransfer makes money?",
"criteria": {
"true": "'What are your fees?', 'so how do you make money?', 'what's the catch with 0% commission?', 'will the receiving bank charge me?'.",
"false": "Questions about the exchange rate itself, timing, safety, or documents; statements; small talk."
}
},
"client_asked_about_documents": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask about, or push back on, documents, verification, proof of address, or a reason-for-payment request?",
"criteria": {
"true": "'Why do you need my bank statement?', 'what documents do you need?', 'do I really have to send an invoice?', 'is a scan ok?'.",
"false": "Questions about rate, timing, safety, or fees; statements; small talk."
}
},
"client_mentioned_alternative_provider": {
"type": "noul",
"instructions": "Does `latest_utterance.text` mention a bank, a fintech, or another currency broker that the client uses, was quoted by, or is considering for this transfer?",
"criteria": {
"true": "Names a bank or provider ('HSBC quoted me', 'I usually use Wise', 'Revolut is free', 'another broker offered 1.17'), or says 'my bank' or 'another company' in the context of doing the transfer.",
"false": "Mentions a bank only as the account the funds will be sent from, or mentions no other provider."
}
},
"client_mentioned_deadline": {
"type": "noul",
"instructions": "Does `latest_utterance.text` state a date, event, or deadline by which the client needs money to arrive or a rate to be fixed?",
"criteria": {
"true": "'Completion is on the 14th', 'salary has to land by month end', 'the supplier wants payment within 30 days', 'before we exchange contracts'.",
"false": "No date or event is tied to the transfer; general intentions like 'at some point'."
}
},
"client_ready_to_book": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), express that they want to go ahead and book a transfer, set an alert, or lock a rate now?",
"criteria": {
"true": "'Let's book it', 'can we lock that rate?', 'yes, set the alert', 'I'll send the money today', 'go ahead'.",
"false": "Interest without a decision, 'maybe later', a question, or a concern."
}
},
"next_step_agreed": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), agree to a concrete next step such as uploading a document today, a follow-up call at a stated time, setting a rate alert, booking a trade, or adding a beneficiary?",
"criteria": {
"true": "'I'll upload it this afternoon', 'Thursday at 10 works', 'yes, set the alert at 1.18', 'ok, I'll add the beneficiary now'.",
"false": "Vague 'I'll get back to you', 'send me the info', a question, or a concern."
}
},
"rep_asked_open_question": {
"type": "noul",
"instructions": "Is `latest_utterance.text`, spoken by the rep (`latest_utterance.speaker` is rep), an open question inviting the client to describe their situation, plans, timing, or how they transfer money today?",
"criteria": {
"true": "'Tell me about the purchase', 'how have you been sending money so far?', 'what's driving the timing?', 'walk me through the payments you have coming up'.",
"false": "A yes/no question, a statement, explaining how the platform works, quoting a rate, or proposing a time."
}
},
"rep_explaining_at_length": {
"type": "noul",
"instructions": "Is `latest_utterance.text`, spoken by the rep (`latest_utterance.speaker` is rep), explaining the platform, regulation, or process without asking the client a question?",
"criteria": {
"true": "Describes features, partners, safeguarding, or the booking process and ends without a question to the client.",
"false": "Asks the client a question, reflects the client's situation back, or proposes a next step."
}
},
"rep_made_rate_prediction": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the rep (`latest_utterance.speaker` is rep), predict or advise which way an exchange rate will move?",
"criteria": {
"true": "'Sterling will probably strengthen', 'I'd wait, it'll come back', 'the rate is going to fall after the announcement'.",
"false": "Describes what the rate is now, what tools exist (alert, forward, market order), or that nobody can predict the market."
}
},
"rep_made_guarantee": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the rep (`latest_utterance.speaker` is rep), promise something absolute about rates, savings, or arrival time?",
"criteria": {
"true": "'We are always cheaper than your bank', 'guaranteed to arrive tomorrow', 'you'll definitely save 3%'.",
"false": "Conditional or factual statements: 'same day if funds clear before 2pm', 'you can compare against mid-market'."
}
},
"rep_proposed_next_step": {
"type": "noul",
"instructions": "Does `latest_utterance.text` propose a concrete next step such as uploading a specific document, booking now, setting a rate alert at a level, a follow-up call at a time, or adding a beneficiary?",
"criteria": {
"true": "'Can you upload the proof of address today?', 'shall we set an alert at 1.18?', 'let's book that now', 'I'll call you Thursday at 10'.",
"false": "Explaining how things work, asking about the situation, or a vague 'let's stay in touch'."
}
},
"engagement": {
"type": "score",
"instructions": {
"question": "How engaged is the client, judging only by the client's turns in `recent_transcript`?",
"focus": "Look only at turns where speaker is client."
},
"criteria": [
{"summary": "Disengaged", "signals": ["One-word or one-line answers", "Deflecting ('just email me')", "Trying to end the call"]},
{"summary": "Passive", "signals": ["Answers what is asked", "Volunteers nothing extra", "No questions back"]},
{"summary": "Active", "signals": ["Asks how things work", "Gives detail about amounts, dates, beneficiaries", "Volunteers plans or concerns"]}
]
},
"urgency": {
"type": "score",
"instructions": {
"question": "How urgent is the client's need to move money or fix a rate, judging by the client's turns in `recent_transcript`?"
},
"criteria": [
{"summary": "No urgency", "signals": ["Exploring, 'at some point'", "No date or event mentioned", "Waiting for a better rate with no deadline"]},
{"summary": "Moderate", "signals": ["A transfer is planned in the coming weeks", "Wants it done but no hard date"]},
{"summary": "Pressing", "signals": ["A completion date, payroll date, or invoice due date is named", "Money must land within days", "A rate must be fixed before an event"]}
]
},
"trust": {
"type": "score",
"instructions": {
"question": "How much does the client appear to trust CurrencyTransfer and its partners, judging by the client's turns in `recent_transcript`?",
"focus": "Judge expressed trust or suspicion, not whether the deal is going well."
},
"criteria": [
{"summary": "Suspicious", "signals": ["Asks repeatedly who holds the money or who regulates you", "Says 'I've never heard of you'", "Compares to scams or asks 'what if you disappear'"]},
{"summary": "Neutral", "signals": ["Accepts explanations without further challenge", "Asks practical questions only"]},
{"summary": "Trusting", "signals": ["References a recommendation or previous good experience", "Volunteers account or bank details readily", "Says 'that's reassuring' or similar"]}
]
}
}
4.4 ONBOARDING-only questions
{
"purpose_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client stated what the transfer is for?",
"criteria": {
"true": "Client mentions a property purchase, salary or pension, a supplier invoice, emigration, tuition, repatriating profits, or another specific reason.",
"false": "Only the rep has mentioned possible reasons, or the purpose has not come up."
}
},
"pair_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client stated which currency they are sending and which currency they need to receive?",
"criteria": {
"true": "Client names both currencies or both countries, e.g. 'pounds to euros', 'from my UK account to Spain', 'USD into shekels'.",
"false": "Only one side is mentioned, or the rep guessed the pair and the client did not confirm."
}
},
"timing_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client stated when they want to make the first transfer or when the money must arrive?",
"criteria": {
"true": "'Next week', 'on completion in March', 'as soon as I'm activated', 'monthly from January', 'when the rate reaches 1.20'.",
"false": "No timing for the first transfer has been given by the client."
}
},
"frequency_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client said whether this is a one-off transfer or a recurring one?",
"criteria": {
"true": "'Just the one payment', 'every month for my mortgage', 'quarterly supplier payments', 'a couple of times a year'.",
"false": "The client has not said whether it repeats."
}
},
"funding_source_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client said which bank account the money will be sent from and that it is in their own name or their company's name?",
"criteria": {
"true": "'From my Barclays current account', 'from the company's business account', 'it's coming from my savings in my name'.",
"false": "The source account has not been discussed, or the client said the money comes from someone else's account without resolution."
}
},
"funding_from_third_party": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client said the funds would be sent from an account belonging to someone other than the client or the client's company?",
"criteria": {
"true": "'My father will send it', 'it's coming from my brother's account', 'a friend is lending me the money and will pay directly'.",
"false": "The funds come from the client's own account, or the source has not been discussed."
}
},
"beneficiary_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client said who will receive the money or in which country the receiving account is?",
"criteria": {
"true": "'The solicitor in Spain', 'my own euro account in France', 'our supplier in Guangzhou', 'the university'.",
"false": "The recipient has not come up."
}
},
"docs_status_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has it been established which verification documents the client has already uploaded or still needs to upload?",
"criteria": {
"true": "Rep or client states what is uploaded or missing: 'I sent my passport but not the proof of address', 'we still need the director's ID', 'everything is in'.",
"false": "Documents have not been discussed, or only mentioned in general terms without saying what is missing."
}
},
"current_provider_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client said how they currently send money abroad or who quoted them?",
"criteria": {
"true": "'I've been using my bank', 'Wise, but the amount is too big now', 'another broker quoted me 1.17'.",
"false": "The client has not said what they use today."
}
},
"decision_maker_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client stated who approves transfers or who else will operate the account?",
"criteria": {
"true": "'I'm the director, I sign off', 'our FD needs to approve payments', 'my accountant will book the trades'.",
"false": "Nothing said about who decides or operates the account."
}
},
"jurisdiction_concern": {
"type": "noul",
"instructions": "In `recent_transcript`, has either speaker raised that the client's country of residence, country of registration, or nationality might prevent the account being opened?",
"criteria": {
"true": "Rep says 'we may not be able to service that country', client says 'I'm resident in Dubai, is that a problem?', or a partner's country restriction is mentioned.",
"false": "Country is mentioned only as the destination of the money, or not at all."
}
},
"said_who_holds_funds": {
"type": "noul",
"instructions": "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?",
"criteria": {
"true": "Rep says the transfer contracts with a named FCA-authorised partner, that CurrencyTransfer never holds client funds, or that funds are safeguarded in segregated accounts until paid out.",
"false": "Rep has not explained who holds the money, or only said 'it's safe' without saying who holds it."
}
},
"said_rate_transparency": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep explained that the client's rate is shown next to the mid-market rate and that there is no separate transfer fee?",
"criteria": {
"true": "Rep mentions the mid-market rate shown alongside the client rate, no transfer fees, or that the margin is inside the rate and visible.",
"false": "Rate transparency has not been explained, or the rep only said 'our rates are good'."
}
},
"said_quote_lifetime": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep explained that a live quote is only valid for a short time and that booking locks the rate?",
"criteria": {
"true": "Rep says the quote refreshes or expires after seconds, and that once booked the rate is fixed for that transaction.",
"false": "Quote lifetime has not been mentioned."
}
},
"said_settlement_timing": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep explained when funds will arrive, including the cut-off time and that some currencies take longer?",
"criteria": {
"true": "Rep mentions same-day for major currencies when funds clear before the partner's cut-off (around 2pm UK), or that other currencies can take several working days.",
"false": "Settlement timing has not been explained."
}
},
"said_fund_from_own_account": {
"type": "noul",
"instructions": "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?",
"criteria": {
"true": "Rep mentions paying from the client's own account, the partner's bank details appearing after booking, or that third-party payments are not accepted.",
"false": "Funding mechanics have not been explained."
}
},
"said_booking_is_binding": {
"type": "noul",
"instructions": "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?",
"criteria": {
"true": "Rep says the partner buys the currency immediately on booking, that it cannot simply be cancelled, or that a loss on reversal is the client's responsibility.",
"false": "Cancellation and liability have not been mentioned."
}
},
"said_minimum": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep mentioned the minimum transfer size?",
"criteria": {
"true": "Rep mentions a minimum of around five thousand pounds equivalent, or that there is no maximum.",
"false": "Minimum size has not been mentioned."
}
},
"said_docs_needed": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep told the client exactly which documents are still needed and how recent they must be?",
"criteria": {
"true": "Rep names specific documents (passport or ID, proof of address dated within three months, company registration, director ID, beneficial owner ID) that are still outstanding.",
"false": "Documents have not been discussed, or only 'we need some documents' without naming them."
}
},
"said_payment_reason": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep explained why a reason for payment or a supporting document may be requested for a transfer?",
"criteria": {
"true": "Rep mentions regulatory or anti-money-laundering requirements of the partner as the reason for payment-purpose questions or supporting documents such as an invoice or sale contract.",
"false": "Payment reason or supporting documents have not been explained."
}
},
"said_rm_contact": {
"type": "noul",
"instructions": "In `recent_transcript`, has the rep told the client who their relationship manager is and how to reach them?",
"criteria": {
"true": "Rep introduces themself or a colleague as the client's relationship manager and mentions the dashboard messaging, phone, or email.",
"false": "Point of contact has not been stated."
}
},
"onboarding_stage": {
"type": "choice",
"instructions": {
"question": "Which stage of an onboarding call best describes the last few turns of `recent_transcript`, weighting `latest_utterance` most?"
},
"criteria": {
"opening": {"what": "Greetings, introductions, confirming why the call is happening, agenda. Nothing yet about the client's transfer.", "not_for": "Turns that describe the transfer or the client's situation."},
"discovery": {"what": "The rep asks about, or the client describes, the purpose, currencies, amount, timing, recipient, or how they transfer money today.", "not_for": "Turns about documents, safeguarding, or the platform's mechanics."},
"kyc_and_documents": {"what": "Which verification documents are uploaded or missing, proof of address, company documents, reason for payment, jurisdiction or residency checks.", "not_for": "Turns about the rate, timing, or the client's plans."},
"platform_walkthrough": {"what": "The rep explains how the dashboard, quotes, booking, beneficiaries, or alerts work.", "not_for": "Turns where the client is pushing back or asking about safety."},
"rate_and_pricing": {"what": "Discussion of the exchange rate, the mid-market comparison, margin, fees, or comparison with a bank or another provider.", "not_for": "Discussion of when the money arrives."},
"safeguarding_and_regulation": {"what": "Who holds the money, FCA authorisation, segregation, what happens on insolvency, who the partner is.", "not_for": "Neutral questions about how to book."},
"settlement_and_funding": {"what": "How and when the client sends funds, from which account, cut-off times, when the money arrives, cancellation liability.", "not_for": "Discussion of the rate or documents."},
"objection_handling": {"what": "The client has voiced a concern or pushback and the rep is responding to it.", "not_for": "Neutral questions about how something works."},
"first_trade_setup": {"what": "Agreeing the details of the first booking: amount, pair, beneficiary, whether to book now, set an alert, or wait.", "not_for": "General discovery of plans."},
"next_steps": {"what": "Agreeing what happens after the call: upload a document, follow-up call, activation confirmation, set an alert.", "not_for": "Booking the trade itself."}
}
},
"onboarding_objection_type": {
"type": "choice",
"instructions": {
"question": "If the client's most recent turns in `recent_transcript` express a concern or pushback, which kind is it? Choose `none` if no concern has been voiced."
},
"criteria": {
"rate": {"what": "The exchange rate or margin is worse than, or not clearly better than, the bank or another provider."},
"safety": {"what": "Doubt that the money is safe, who holds it, or whether the company is legitimate or regulated."},
"timing": {"what": "Worry that the money will not arrive in time, or wanting to wait for a better rate."},
"fees": {"what": "Suspicion of hidden fees, questions about how CurrencyTransfer makes money, or the amount being too small to be worth it."},
"trust_in_ct": {"what": "Never heard of CurrencyTransfer, prefers a known brand, doubts a platform rather than a bank."},
"alternative_provider": {"what": "Prefers, uses, or was quoted by a bank, Wise, Revolut, or another broker."},
"process_friction": {"what": "Pushback on documents, verification, reason-for-payment, funding from own account, minimum size, or the binding nature of a booking."},
"jurisdiction": {"what": "Concern that the client's country of residence, registration, or nationality prevents an account."},
"none": {"what": "The client has not voiced any concern or pushback."}
}
}
}
The next_move Choice for onboarding is built from the Section 5.1 playbook exactly as the reference does: criteria = {move.id: {what, not_for}}; plus one speculative phrasing::<move> Choice per move over its three lines.
4.5 CUSTOMER-SUCCESS-only questions
{
"issue_reported": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client described a problem with a transfer, a payment, a document request, a beneficiary, or their account?",
"criteria": {
"true": "'The money hasn't arrived', 'you asked me for an invoice twice', 'I can't add a new beneficiary', 'my login doesn't work', 'the rate I got was worse than shown'.",
"false": "No problem has been described; the client is asking about new activity or making small talk."
}
},
"issue_resolved_or_owned": {
"type": "noul",
"instructions": "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?",
"criteria": {
"true": "'I can see it settled at 11:40, the beneficiary bank should have it today', 'I'll chase the partner now and message you on the dashboard before 3pm', 'I've approved the beneficiary'.",
"false": "The problem is still open, or the rep only said 'I'll look into it' with no action or time."
}
},
"upcoming_payment_known": {
"type": "noul",
"instructions": "In `recent_transcript`, has the client said what transfers they have coming up, with an approximate amount or date?",
"criteria": {
"true": "'We pay the supplier around 40k euros every quarter', 'the next mortgage payment is on the 1st', 'nothing until the property completes in May'.",
"false": "Future transfers have not been discussed, or only 'we'll see'."
}
},
"no_upcoming_need": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), say that they have no transfers planned in the foreseeable future?",
"criteria": {
"true": "'Nothing planned', 'we've stopped importing from Europe', 'that was a one-off, I don't need it again'.",
"false": "Mentions a future payment, even vaguely, or says nothing about future need."
}
},
"client_wants_to_wait_for_rate": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the client (`latest_utterance.speaker` is client), say they are holding off on a transfer because they expect a better rate?",
"criteria": {
"true": "'I'll wait, the pound should recover', 'not at this rate', 'call me if it gets to 1.20'.",
"false": "Wants to transact now, or is waiting for a reason other than the rate (funds not ready, completion date)."
}
},
"client_asked_about_forwards": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask about fixing a rate for a future date, a forward contract, a deposit, a drawdown, or hedging?",
"criteria": {
"true": "'Can I lock the rate for next year?', 'what's a forward?', 'how much deposit?', 'can I take it in parts?', 'how do I hedge this?'.",
"false": "Questions about a transfer today, alerts, or unrelated topics."
}
},
"client_asked_about_alerts_or_orders": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask about rate alerts, being notified at a target rate, market orders, or automatic booking at a rate?",
"criteria": {
"true": "'Can you tell me when it hits 1.19?', 'can it book automatically?', 'what's a market order?', 'what's this MOEX thing?'.",
"false": "Questions about forwards, a transfer today, or unrelated topics."
}
},
"client_asked_about_recurring": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask about setting up regular or repeated payments, batch payments, or paying the same recipient again?",
"criteria": {
"true": "'Can I automate the monthly payment?', 'can I pay ten suppliers at once?', 'do I have to re-enter the beneficiary every time?'.",
"false": "Questions about a single transfer, rates, or unrelated topics."
}
},
"client_asked_about_access": {
"type": "noul",
"instructions": "Does `latest_utterance.text` ask about adding another person to the account, permissions, approvals, or a colleague or accountant using the platform?",
"criteria": {
"true": "'Can my bookkeeper log in?', 'can I make payments need two approvals?', 'add my business partner'.",
"false": "Questions about the client's own login only, or unrelated topics."
}
},
"rep_offered_tool": {
"type": "noul",
"instructions": "Does `latest_utterance.text`, spoken by the rep (`latest_utterance.speaker` is rep), offer a specific platform tool that fits what the client just described: a rate alert, a market order, a forward contract, a batch payment, or additional user access?",
"criteria": {
"true": "'We could set a bookable alert at 1.19', 'a forward would fix that rate for the May completion with a ten percent deposit', 'you can upload all ten payments as one batch'.",
"false": "General explanation of the platform, a question, or a next step without naming a tool."
}
},
"rep_checked_status_with_specifics": {
"type": "noul",
"instructions": "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?",
"criteria": {
"true": "'Your trade CT-48211 is showing as processing since 10:15', 'the partner released the payment at 14:02', 'it's waiting on the invoice you were asked for'.",
"false": "'It should be fine', 'these things take a while', or no status given."
}
},
"said_forward_deposit_and_liability": {
"type": "noul",
"instructions": "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?",
"criteria": {
"true": "Rep mentions the deposit (around ten percent), paying the balance later, partial drawdowns, and that the contract is binding or may require additional margin if the rate moves.",
"false": "Forwards were discussed without deposit, balance, or commitment being mentioned, or forwards were not discussed."
}
},
"cs_stage": {
"type": "choice",
"instructions": {
"question": "Which stage of a customer-success call best describes the last few turns of `recent_transcript`, weighting `latest_utterance` most?"
},
"criteria": {
"opening": {"what": "Greetings, reason for the call, checking in. Nothing yet about a transfer or a problem.", "not_for": "Turns that describe a problem or a plan."},
"issue_triage": {"what": "The client describes a problem and the rep asks about it or checks the status of a trade, payment, document, or beneficiary.", "not_for": "Turns about future payments or new tools."},
"account_review": {"what": "Reviewing recent activity, upcoming payments, currencies, beneficiaries, or who uses the account.", "not_for": "A live problem, or discussion of the rate itself."},
"rate_and_market": {"what": "Discussion of the current rate, whether to trade now or wait, comparison with previous rates or other providers.", "not_for": "Fixing a future rate with a forward."},
"hedging_and_forwards": {"what": "Forward contracts, deposits, drawdowns, currency options, market orders for future exposure.", "not_for": "Spot transfers today or alerts alone."},
"recurring_and_alerts": {"what": "Rate alerts, RSI or MOEX alerts, batch or recurring payments, automation of repeat transfers.", "not_for": "Forwards or a single spot transfer."},
"objection_handling": {"what": "The client has voiced a complaint or pushback and the rep is responding to it.", "not_for": "Neutral status questions."},
"re_engagement": {"what": "The client has been inactive and the rep is finding out whether and why they still need to transfer.", "not_for": "An active client with a live issue."},
"next_steps": {"what": "Agreeing what happens after the call: book now, set an alert, send a forward quote, upload a document, follow-up call.", "not_for": "Diagnosing a problem."}
}
},
"cs_objection_type": {
"type": "choice",
"instructions": {
"question": "If the client's most recent turns in `recent_transcript` express a complaint or pushback, which kind is it? Choose `none` if none has been voiced."
},
"criteria": {
"rate": {"what": "The rate or margin is worse than before, or worse than another provider."},
"service_issue": {"what": "A payment was late, documents were chased repeatedly, a beneficiary could not be added, communication was poor."},
"settlement_delay": {"what": "Money has not arrived when expected and the client is worried or frustrated."},
"fees": {"what": "An unexpected charge, a receiving-bank fee, or suspicion of hidden costs."},
"alternative_provider": {"what": "Has moved to, or is considering, a bank, Wise, Revolut, or another broker."},
"no_need_now": {"what": "No transfers planned; the relationship feels unnecessary."},
"trust": {"what": "Renewed doubt about safety of funds or regulation, for example after news about a provider."},
"none": {"what": "The client has not voiced any complaint or pushback."}
}
}
}
4.6 Code-side composite scores (DRAFT weights, all in code)
Following the reference (SIGNAL_WEIGHTS, EMA α=0.40), three code-computed numbers per scenario, shown as the "bars" in the dashboard:
- Onboarding → "activation likelihood" (the analogue of closing probability): stage prior +
client_ready_to_book+0.15,next_step_agreed+0.09, each*_knownfact +0.03 (cap 0.18),engagement±0.08,trust±0.06,urgency±0.04, objection open −0.12,client_disengaging−0.16,jurisdiction_concern−0.20,funding_from_third_party−0.10, rep talk ratio > 0.65 −0.10. - "Compliance completeness" = fraction of
said_*checklist items persisted (pure code; Jev only answers each item). Onboarding has 10 items; CS has the subset relevant to what was discussed (e.g.said_forward_deposit_and_liabilityonly counts onceclient_asked_about_forwardsorrep_offered_toolfired with a forward). - "Risk flags" (binary, code):
rep_made_rate_prediction≥ 0.6,rep_made_guarantee≥ 0.6,funding_from_third_party≥ 0.7, booking discussed whilesaid_booking_is_bindingnot persisted. These light red regardless of everything else.
Thresholds to reuse from the reference until real data exists: persist fact ≥ 0.70, light signal ≥ 0.60, open objection ≥ 0.60, next_move confidence ≥ 0.35, objection type confidence ≥ 0.40.
5. v0 playbooks — DRAFT, for Stevan to correct
Same shape as data/playbook.json in the reference: Jev picks a move by {what, not_for}; code shows the text; the three phrasings are candidate lines for the speculative per-move Choice. Every phrasing must survive compliance review; several contain facts marked [VERIFY].
5.1 Onboarding playbook (14 moves)
{
"_comment": "DRAFT v0 onboarding playbook for CurrencyTransfer. Jev PICKS a move; code shows the text. Lines marked [VERIFY] contain facts Stevan/compliance must confirm.",
"moves": [
{
"id": "open_with_agenda",
"title": "Set the agenda",
"what": "The call has just started, greetings are done, and the client does not yet know what the call is for or how long it takes.",
"not_for": "Any point after the client has started describing their transfer.",
"phrasings": [
"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?",
"This is the activation call: I'll check a couple of things on your registration, and then we can talk through your first transfer.",
"Before I explain anything, can I just check what you're looking to do, so I don't waste your time?"
]
},
{
"id": "check_serviceability_first",
"title": "Check we can serve them",
"what": "A residency, registration country, nationality, or client type has been mentioned that may not be serviceable, or none has been established yet and the call is more than a few turns in.",
"not_for": "Calls where the client's country is already known to be serviceable, or where a live concern needs answering first.",
"phrasings": [
"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.",
"For a company account, which country is the business registered in, and are all the directors and owners resident there?",
"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."
]
},
{
"id": "ask_about_the_transfer",
"title": "Ask an open question about the transfer",
"what": "The purpose, currencies, amount, or timing of the first transfer are not yet understood and no concern is currently open.",
"not_for": "Situations where purpose, pair, amount and timing are already known, or the client just raised a concern.",
"phrasings": [
"Tell me about the transfer you're planning: what it's for, which currencies, and roughly when.",
"How have you been sending money abroad so far, and what's changed?",
"What's the money for, and is there a date it needs to be there by?"
]
},
{
"id": "pin_down_timing_and_amount",
"title": "Pin down amount and date",
"what": "The purpose is known but the approximate amount, the date the money must land, or whether it repeats has not been stated.",
"not_for": "Calls where amount and timing are already known, or where a concern is open.",
"phrasings": [
"Roughly how much are we talking about for the first transfer, and is that a one-off or something that repeats?",
"Is there a hard date, like a completion or a payroll run, that the money has to be in the account by?",
"Are we looking at one payment or a series over the coming months?"
]
},
{
"id": "confirm_funding_account",
"title": "Confirm the funding account",
"what": "The first trade is taking shape but it has not been established which account the funds will come from, or the client suggested a third party would send the money.",
"not_for": "Calls where the funding account in the client's own name is already confirmed.",
"phrasings": [
"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.",
"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]",
"After you book, the partner's bank details appear on screen and you pay them directly from your account. Does that work for you?"
]
},
{
"id": "close_the_document_gap",
"title": "Name the missing document",
"what": "Verification documents are outstanding, or the client asked what is needed, or the client pushed back on a document request.",
"not_for": "Clients whose documents are complete, or where a rate or safety concern is open.",
"phrasings": [
"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?",
"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?",
"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."
]
},
{
"id": "explain_who_holds_the_money",
"title": "Explain who holds the money",
"what": "The client asked whether their money is safe, who they are dealing with, or who regulates the service, or the call has reached booking without this being said.",
"not_for": "Clients who have already been told which partner holds the funds and accepted it.",
"phrasings": [
"We're the platform; your transfer is contracted with a named FCA-authorised payment partner, and CurrencyTransfer never holds your money at any point.",
"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]",
"You'll see the partner's name on every booking, so you always know exactly who is holding the funds."
]
},
{
"id": "show_the_rate_against_mid_market",
"title": "Compare the rate against mid-market",
"what": "The client asked about the rate, the margin, or how it compares with a bank or another provider, and no safety concern is open.",
"not_for": "Clients who have already seen the mid-market comparison, or when the open concern is about safety or documents.",
"phrasings": [
"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.",
"What rate did your bank quote you? Let's compare it against the live mid-market rate right now.",
"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."
]
},
{
"id": "explain_settlement_and_cutoff",
"title": "Explain when the money arrives",
"what": "The client asked when funds will land or mentioned a deadline, and settlement timing has not been explained.",
"not_for": "Clients who already know the cut-off and timing for their currency pair.",
"phrasings": [
"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.",
"Given your completion date, I'd book and fund a few days ahead so the cut-off doesn't matter.",
"Once funded, you can track the payment on the dashboard rather than wondering where it is."
]
},
{
"id": "explain_booking_is_binding",
"title": "Explain that a booking is binding",
"what": "The client is close to booking, or asked whether they can cancel, and it has not been explained that a booking commits them.",
"not_for": "Clients who have already been told about cancellation liability.",
"phrasings": [
"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.",
"If anything changes after you book, call me straight away; the earlier we know, the smaller the problem.",
"That's why I'd only book once you know the funds are ready to send."
]
},
{
"id": "handle_rate_objection",
"title": "Handle a rate objection",
"what": "The client said the rate is worse than, or not clearly better than, their bank or another provider.",
"not_for": "A neutral question about the rate, or when the concern is about safety or process.",
"phrasings": [
"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.",
"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.",
"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."
]
},
{
"id": "handle_alternative_provider",
"title": "Address the bank, Wise or Revolut comparison",
"what": "The client prefers or currently uses a bank, Wise, Revolut, or another broker.",
"not_for": "A rate objection with no named alternative, or when safety is the open concern.",
"phrasings": [
"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?",
"What's been good and what's been frustrating about using them so far?",
"You don't have to move everything; try one transfer with us alongside them and compare the settled amounts."
]
},
{
"id": "offer_alert_instead_of_waiting",
"title": "Offer a bookable rate alert",
"what": "The client wants to wait for a better rate, or is not ready to book today, and no other concern is open.",
"not_for": "Clients with a deadline within days, or who are ready to book now.",
"phrasings": [
"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.",
"What rate would make you say yes? Let's set that as your alert.",
"If there's a date the money has to be there by, an alert with a fallback date protects you both ways."
]
},
{
"id": "agree_next_step",
"title": "Agree the next step",
"what": "The facts are known, concerns have been answered, and the call needs a concrete next action: book now, upload a document today, set an alert, or a follow-up at a time.",
"not_for": "When a concern is still open, or the transfer details are not yet understood.",
"phrasings": [
"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?",
"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?",
"I'll send you a summary on your dashboard with the partner's name and what happens next. Anything I've missed?"
]
}
]
}
5.2 Customer-success playbook (13 moves)
{
"_comment": "DRAFT v0 customer-success playbook for CurrencyTransfer. Jev PICKS a move; code shows the text. Lines marked [VERIFY] contain facts Stevan/compliance must confirm.",
"moves": [
{
"id": "resolve_the_issue_first",
"title": "Deal with the live issue before anything else",
"what": "The client has described a problem with a transfer, payment, document request, beneficiary, or login, and it has not been resolved or owned with a specific action and time.",
"not_for": "Calls with no reported problem, or once the rep has given a concrete resolution or commitment.",
"phrasings": [
"Let me look at that right now; give me the amount or the date and I'll pull up the trade.",
"I can see exactly where it is: I'll tell you the status and what happens next before we talk about anything else.",
"I'll chase the partner as soon as we hang up and message you on the dashboard by three o'clock with an answer."
]
},
{
"id": "give_status_with_specifics",
"title": "State the status with specifics",
"what": "The client asked where their money is or why a payment is delayed, and the rep has not yet given a concrete status with a time, a reference, or the partner's name.",
"not_for": "When the status has already been given precisely, or when no transfer is in flight.",
"phrasings": [
"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]",
"It's showing as waiting for funds: the partner hasn't received your transfer yet. Can you check the reference you used?",
"The payment is on hold for the supporting document the partner requested; as soon as that's uploaded it goes out."
]
},
{
"id": "explain_document_request",
"title": "Explain why a document was requested",
"what": "The client is frustrated by a request for an invoice, contract, or other supporting document on a payment.",
"not_for": "Calls where no document was requested or the client already accepted the request.",
"phrasings": [
"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.",
"I'll ask them to tell us up front what they need for this payee, so you're not chased twice.",
"If you send it to me now I'll pass it straight to the partner and confirm when the payment is released."
]
},
{
"id": "review_upcoming_exposure",
"title": "Ask about upcoming payments",
"what": "No live issue is open and the client's upcoming transfers, amounts, and dates are not known.",
"not_for": "When upcoming payments are already known, or a problem is still open.",
"phrasings": [
"What do you have coming up over the next few months in terms of payments abroad?",
"Are the supplier payments still roughly the same amounts and dates as before?",
"Is there anything on the horizon, a purchase or a larger payment, where the rate really matters?"
]
},
{
"id": "offer_forward_for_known_future_payment",
"title": "Offer a forward for a known future payment",
"what": "The client has a specific future payment with a known approximate amount and date, and is worried about the rate moving.",
"not_for": "Payments due within days, clients with no known future payment, or when a forward's deposit and commitment have already been explained and declined.",
"phrasings": [
"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. [VERIFY deposit and tenor]",
"You can draw it down in parts as invoices fall due, so you're not tied to one payment date.",
"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?"
]
},
{
"id": "offer_alert_or_market_order",
"title": "Offer a rate alert or market order",
"what": "The client wants to wait for a better rate and has no hard deadline within days.",
"not_for": "Clients with an imminent deadline, or who already have an alert set at the level they want.",
"phrasings": [
"Rather than watching the screen, set a bookable alert at your target and it books or notifies you the moment it's hit.",
"What level would you be happy at? I'll set it now and you can change it any time.",
"If you want it hands-off, a market order executes automatically when the rate is reached. [VERIFY availability per partner]"
]
},
{
"id": "set_up_recurring_or_batch",
"title": "Set up recurring or batch payments",
"what": "The client makes repeated payments to the same recipients or several payments at once and is doing them one by one.",
"not_for": "One-off transfers, or clients who already use batch payments.",
"phrasings": [
"Your regular beneficiaries are saved, so each month it's a quote and two clicks; you don't re-enter anything.",
"For the supplier run you can upload all the payments as one batch against a single trade. [VERIFY mass payments availability for this client type]",
"Would it help to set a recurring alert so you're prompted before each payroll date?"
]
},
{
"id": "add_user_access",
"title": "Add a colleague or approval step",
"what": "The client mentioned a colleague, accountant, or partner who needs to book, approve, or view payments.",
"not_for": "Sole users with no such need.",
"phrasings": [
"You can add your bookkeeper with their own login and set exactly what they can do: quote, book, or add beneficiaries.",
"If you'd like a second pair of eyes, payments and new beneficiaries can require approval from a second user before they go out. [VERIFY 4-eyes availability]",
"Send me their name and email and I'll set it up today."
]
},
{
"id": "handle_rate_complaint",
"title": "Handle a rate complaint",
"what": "The client says the rate or margin has got worse or that another provider offered better.",
"not_for": "A neutral rate question, or a service complaint.",
"phrasings": [
"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.",
"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.",
"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]"
]
},
{
"id": "handle_service_complaint",
"title": "Acknowledge a service failure and fix the process",
"what": "The client complains about a late payment, repeated document chasing, or poor communication, and the rep has not yet acknowledged it.",
"not_for": "When the complaint has been acknowledged and a fix agreed.",
"phrasings": [
"You're right, that shouldn't have happened, and I'm sorry. Here's what I'll change so it doesn't happen again.",
"Tell me exactly what happened and when, and I'll raise it with the partner today.",
"Going forward, I'll be your single point of contact for this; message me on the dashboard and I'll respond the same day."
]
},
{
"id": "reengage_dormant_with_a_reason",
"title": "Re-engage with a specific reason",
"what": "The client has not traded for a long time and has no problem to report; the reason for the pause is unknown.",
"not_for": "Active clients, or clients who have said they have no further need.",
"phrasings": [
"You last transferred in the spring; has the need gone away, or is something waiting on the rate?",
"The rate has moved quite a bit since your last trade; is that relevant to anything you have coming up?",
"Is there anything about the platform or the process that put you off using it again?"
]
},
{
"id": "accept_no_need_gracefully",
"title": "Accept there is no current need",
"what": "The client says clearly they have no transfers planned.",
"not_for": "Clients who mentioned any future payment.",
"phrasings": [
"Understood. Your account stays open at no cost, and if anything comes up you can book online or call me.",
"Would a rate alert on your usual pair be useful, just so you hear if it moves in your favour?",
"Thanks for your time; I'll leave you alone until you need us."
]
},
{
"id": "agree_next_step",
"title": "Agree the next step",
"what": "The issue is resolved or owned, the upcoming need is understood, and the call needs a concrete next action.",
"not_for": "When a problem is still open or the client's needs are unknown.",
"phrasings": [
"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.",
"Shall I set the alert at your level now, and call you the day it triggers?",
"I'll message a summary of what we agreed; anything you want me to add?"
]
}
]
}
6. Questions only Stevan can answer
About the calls themselves
- Is the "onboarding call" the activations-team call after wizard submission (as assumed), or does it also cover pre-signup sales calls run from Pipedrive? Who runs it today (RMs Tom/Sara/Nico/Saul, or a separate activations person)?
- What counts as a CS call: proactive RM check-ins, inbound issues, dormant re-engagement, or all three? Should the copilot treat them as one scenario with sub-types?
- Are calls recorded today, on what system (the "call coach" server: what is it, what format are transcripts, are speakers labelled), and is a recording disclosure required at the top of each call?
- Which of the historical transcripts does Stevan consider "good"? Even 10 hand-picked good and 10 bad would let us calibrate thresholds the way the reference did with 19 labelled utterances.
About compliance and wording
5. What is the approved way to explain (a) safeguarding, (b) that CT never holds funds, (c) how CT is paid (partner commission), (d) the FSCS question? Every said_* noul and phrasing above depends on this.
6. Are reps allowed to name partners, quote "up to 3.75%" bank margins, or say "we'll match" a competitor? Which claims are prohibited (rate predictions, guarantees)?
7. Forward tenor: 12 months (/forward-contracts, /business-foreign-exchange) or 24 months (/product)? Is the 10% deposit universal or partner-specific? Are margin calls part of the standard terms?
8. Third-party funding: the FAQ "Can I make a bank transfer from an account not in my name?" exists but the policy text was not fetched — what is the rule and its exceptions?
9. The receiving-bank / intermediary fee question on SWIFT payments: what do reps say?
About segments and routing
10. Which partners are live for new activations today (site still shows Central FX; DB says deleted 2026-01)? Do reps choose the partner or does the platform?
11. Are the PFX / CFX / SAR / IL streams different enough to need separate playbooks (e.g. Saudi compound clients, Israel two-day settlement, Nico's stream)?
12. What is the jurisdiction/serviceability rule the rep applies on the call, so check_serviceability_first can be grounded (country list, client types, *_suitable flags)?
About the product
13. Dormancy definition for reengage_dormant_with_a_reason (months since last by_client quote or settled trade)?
14. Which tools exist for which client types today: mass payments, 4-eyes approvals, RSI/MOEX, market orders, currency options, open-banking settlement?
15. Should the dashboard also show pre_call data from clients.* (purpose, expected volume, currently_trade_with) so the rep does not re-ask what the wizard already captured?
About scope 16. Which of the three bars should be the hero: activation likelihood (sales-like), compliance completeness (checklist), or risk flags? The reference's hero is closing probability; for an onboarding call the checklist may matter more. 17. Is a generative "tailored phrasing" line acceptable at all in a regulated context, or must every line on screen be pre-approved (the reference's generic-line-only mode)?