Customer Support · Internal

CS Playbook
how we work.

A plain-English walkthrough of the customer-support system Mo, Vlad, Gabriel, Hisham, and Ori are building together — what each person does, where the rules live, and how updates get pushed.

Version
v1 · 17 May 2026
Repo
sooner-cs-playbook
Status
Live as of today
Audience
CS operators · Founders
Also available
Slide deck →
01 · The framing

What this is, and what it isn't.

A shared knowledge base + workflow for replying to Sooner customers on WhatsApp. Run by humans, supercharged by Claude Code.

Every customer reply that lands on Sooner's WhatsApp goes through a CS operator (Mo, Vlad, Gabriel, or eventually Hisham). Each operator opens their own Claude Code session on their laptop, reads the shared rules from this repo, drafts a reply, gets it approved, and sends it via the Rasayel API.

The reason this works at scale is the shared rule book. Instead of every operator inventing how to answer a pricing question or a foreclosure question, we centralize all of that in one GitHub repo. Updates push out daily via GitHub issues. Everyone stays aligned.

The single sentence version

Customer messages land in Rasayel → an assignment service routes each one to a specific operator → that operator handles it in their own Claude Code session using the shared rules from this repo → if they learn something new during the conversation, they suggest a rule update via a GitHub issue → Mo merges approved suggestions daily → everyone pulls the latest.

02 · The system

How the pieces fit together.

Three moving parts: Rasayel (where customers live), the assignment service (Ori's), and the playbook (where rules live).

1 Customer sends WhatsApp message 2 Rasayel WhatsApp Business API · receives webhook fires 3 Assignment Service Ori · routes to one operator posts to Slack 4 Slack #sooner-ai-support · pings the assigned operator 5 Operator opens Claude Code runs on their own laptop · Mo · Vlad · Gabriel · Hisham "draft a reply for this conv" reads rules reads buyer record Sooner CS Playbook GitHub · the shared rule book Mo writes, all read CRM Vlad's Ops Dashboard buyer + labels + stage 6 Operator approves draft "send" — never auto-fired via Rasayel API 7 Rasayel sends reply CRM labels auto-updated 8 Customer receives reply conversation continues if Mo learns a new rule mid-chat, Claude updates the Playbook on the spot Legend customer-facing message flow internal: reads / writes / coordination

Read it top to bottom. Solid arrows are the customer-facing message flow (numbered 1-8). Dashed arrows show what the operator's Claude Code reads from and writes to — the Playbook (the shared rule book) and the CRM (the buyer's record).

03 · Who's who

The team and what each person owns.

Six people. Clear lanes. Mo is the rule-writer; everyone else is an operator or builder.

M

Mo

Founder · CS lead · Rule writer
  • Sole editor of the playbook (writes to main)
  • Reviews and merges suggestion issues daily
  • Handles complex / high-touch customers
  • Owns product knowledge (pricing, fees, narratives)
V

Vlad

Co-founder · CS operator
  • Handles assigned WhatsApp conversations from his Mac
  • Suggests rule updates via GitHub issues
  • Builds and owns the CRM (ops dashboard)
  • Provides Rasayel API access + helps with phone numbers
G

Gabriel

Co-founder · Underwriting + CS operator
  • Handles assigned WhatsApp conversations from his Mac
  • Owns mid-deal customers (refinance, complex cases)
  • Suggests rule updates via GitHub issues
  • Reviews and approves underwriting decisions
H

Hisham

CS operator (joining soon)
  • Will join the rotation once onboarded
  • Same workflow as Vlad and Gabriel
  • Calls customers directly when needed
O

Ori

Engineering · Assignment service owner
  • Builds the assignment service
  • Connects Rasayel webhooks → round-robin assignment → Slack
  • Reviews infrastructure / scaling questions
🤖

Claude Code

AI assistant · Per-operator
  • Each operator runs their own session on their laptop
  • Reads rules from this repo, drafts replies, sends via Rasayel
  • Never auto-sends — always needs operator approval first
  • Updates the rule book when operator confirms a new rule
04 · Daily flow

A typical operator's morning.

From "open laptop" to "inbox zero" in well-defined steps. Everyone follows the same flow.

01

Pull the latest rules

Open your terminal. Make sure you've got the latest changes from the playbook — Mo merged overnight suggestions into main while you slept.

cd ~/sooner-cs-playbook
git pull origin main
02

Open your Claude Code session

From the playbook directory, fire up Claude. The SessionStart hook auto-runs /start-shift for you, which pulls the latest rules, reads SESSION_HANDOFF.md, runs a rescan, and posts a briefing within ~30 seconds. You're productive immediately.

claude
# SessionStart hook fires /start-shift automatically.
# Claude posts: today's calendar, live queue, in-flight items, recommended first action.
03

Run the rescan

See who's awaiting a reply. Claude pulls the live queue from Rasayel and groups it into clusters (hot, pricing question, call setup, your court, etc).

python3 scripts/rescan.py
04

Pick a lead, ask for a draft

Tell Claude the conv ID or customer name. Claude pulls the last 5 messages of the conversation + the customer's CRM record + drafts a reply using the rules in the playbook.

You: draft a reply for conv 20940671
Claude: [pulls history + CRM]
        [presents draft with 3-6 short WhatsApp bubbles]
        [asks for approval]
05

Approve, refine, send

Read the draft. If it's right, say "send". If not, push back — "make it shorter", "drop the personal loan comparison", "use her name". Claude revises and re-shows. Repeat until you're happy, then approve. Claude sends via Rasayel, logs the send, and updates CRM labels.

06

If you learn a new rule, suggest it

Mid-conversation a new rule lands — maybe pricing changed, maybe a phrasing didn't work, maybe a hard constraint surfaced. Open a GitHub issue using the Rule Suggestion template. Mo processes them daily.

gh issue create --template rule-suggestion.md
07

Re-scan, repeat, close out

After each reply, Claude automatically re-pulls the queue (it's a rule). When the queue is empty for the day, you're done.

05 · File structure

Where every piece of knowledge lives.

The repo is organized so you can find any rule, narrative, or script in under 10 seconds. Here's the map.

sooner-cs-playbook/
├── CLAUDE.md # Project context Claude auto-loads on session start
├── SESSION_HANDOFF.md # "Where we left off" — updated end of each day
├── README.md # Public-facing overview of the repo
├── .env.example # Template for operator's local .env
├── docs/ # All durable knowledge lives here
│ ├── rules.md # Standing rules: tone, format, what to say/not say
│ ├── RUNBOOK.md # What to do when systems break
│ ├── 09-pricing-narrative.md# How to talk pricing (tiers, math, comparisons)
│ ├── 10-property-narrative.md# How to talk property (buyer agent, broker network)
│ ├── 11-early-termination.md# Forward Ijara fee schedule, Shariah framing
│ ├── 12-local-setup.md # How a new operator gets set up
│ └── 05-rasayel-templates.md# Approved Meta-side templates
├── src/ # Python code Claude uses to do its job
│ ├── outreach/ # ─ Rasayel + email send helpers
│ ├── utils/ # ─ Closing-cost calculator + secrets loader
│ └── db.py # ─ Local SQLite for audit logs
├── .claude/ # Slash commands + hooks that ship to all operators
│ ├── commands/ # /start-shift, /refresh-handoff, /end-shift
│ ├── hooks/ # SessionStart auto-boot + turn counter for context %
│ └── settings.json # registers the hooks at project level
├── scripts/ # Standalone CLI scripts
│ ├── rescan.py # Pull live queue, group into clusters
│ ├── send_wa_batch.py # Bulk WhatsApp sends (cohort outreach)
│ └── send_email.py # Email sends via gog CLI
├── tests/ # Sanity-check scripts
│ ├── test_pipeline.py # End-to-end smoke test
│ └── test_closing_costs.py # Verifies calculator matches the spec
└── .github/
├── ISSUE_TEMPLATE/
│ ├── rule-suggestion.md # Template for proposing a rule change
│ └── customer-followup.md# Template for flagging a follow-up
└── CODEOWNERS # Mo reviews all changes to docs/ + src/utils/

The big six docs in plain English

CLAUDE.md
The contract with Claude. Every time Claude starts a session in this repo, it reads this first. Tells it what the project is, what data sources exist, what rules to follow, what NOT to do. Think of it as Claude's onboarding doc. Mo writes · all read
docs/rules.md
The standing rule book. Every writing-style rule, formatting rule, tone rule, and ops rule lives here. 30+ rules locked across yesterday and today. Examples: "no em dashes anywhere", "pricing anchor is 'from 10% per year'", "always show all 4 packages cheapest first", "use AECB impact not AECB hit". This is where most rule suggestions land. Mo writes · all read
docs/09-pricing-narrative.md
How to talk pricing. The default 8-word answer ("from 10% per year on the closing-cost coverage"), the four package tiers, the monthly math table for any property value, the comparison vs personal loans and credit cards, the killer DBR line. When a customer asks "how much?", this is the source. Mo writes · all read
docs/10-property-narrative.md
How to talk property. We're a connector to broker partners, not a brokerage. Honest about not being purely unbiased. Skin in the game (our cash is in the deal). 2,000+ broker network. Hard constraints: Dubai only, ready/secondary only, never the DP. Mo writes · all read
docs/11-early-termination.md
What to say about foreclosure / early settlement. Forward Ijara fee schedule (6% → 1% declining over 60 months, 6-month floor). Shariah framing (compensation for early lease termination, not riba). Competitive context vs UAE personal loans. Mo writes · all read
SESSION_HANDOFF.md
Where we left off. Refreshed by /refresh-handoff (manually or automatically at turn checkpoints). Tells the next session what's in-flight, who's awaiting a reply, what's in someone's court, today's calendar, what was decided. Read first thing in the morning. Updated by whoever closes shift
docs/13-session-continuity.md
How shifts boot, checkpoint, and close. Explains the 3 slash commands + 2 hooks that make session handoff automatic. The 80%-context recovery flow is documented here. Mo writes · all read
06 · Session continuity (live now)

How a shift boots, checkpoints, and closes.

Three slash commands and two hooks. Built so no operator ever loses state between sessions, and so context-window degradation has a graceful recovery path.

Slash command

/start-shift

Auto-fires on every new claude session via the SessionStart hook. Pulls latest from main, reads CLAUDE.md + SESSION_HANDOFF.md + docs/rules.md, runs the rescan, pulls today's calendar, posts a briefing. ~30 seconds.

Slash command

/refresh-handoff

Captures current state into SESSION_HANDOFF.md and commits + pushes to GitHub. Use any time you want to ensure nothing in flight gets lost. Auto-recommended at turns 25 / 50 / 75 / 100.

Slash command

/end-shift

Clean close-out at end of day. Wraps refresh-handoff + a summary of today's outcomes + a "for tomorrow" briefing. Tells you it's safe to close the terminal.

The turn-counter hook (your context-% safety net)

Claude Code auto-compresses older messages as context fills. Since there's no first-class "context %" API, we use turn count as the cleanest proxy. The hook silently increments a counter on every prompt you send, and emits reminders at thresholds:

Turn 25 (~20%)
Silent reminder to Claude: "checkpoint due — run /refresh-handoff at next pause."
Turn 50 (~40%)
Same gentle nudge, slightly firmer.
Turn 75 (~60%)
"Start thinking about wrapping this session soon."
Turn 100 (~80%) ⚠️
Visible warning. Claude posts: "Recommend running /end-shift now and starting a fresh session." Quality starts to degrade past this point.

The 80% recovery flow (under 30 seconds)

1. Tell Claude: /end-shift — it refreshes handoff, commits, pushes, gives you a close-out summary.
2. Close the terminal.
3. Open a new one, run cd ~/sooner-cs-playbook && claude.
4. SessionStart hook auto-runs /start-shift. You have a fresh briefing in 30 seconds.

The new session won't remember running banter or specific draft revisions from the old one. But it WILL know every rule, every customer in flight, the live queue, today's calendar, and what was decided. That's enough to keep going at full effectiveness.

07 · How updates get pushed

Why nobody can break the rule book.

Mo is the only person who writes to main. Everyone else suggests via issues. This keeps the rule book trustworthy.

1

Operator learns something during a customer conversation

Maybe a customer asked about Ramadan greetings and we didn't have a rule. Maybe a competitor's offer surfaced. Maybe an old phrasing didn't land.

2

Operator opens a GitHub issue with the Rule Suggestion template

One-paragraph description: what the rule is, where it belongs (which doc), what triggered it. Optional: a link to the Rasayel conv.

3

Mo reviews all open suggestions once a day (his morning focus block)

Reads the suggestion, decides if it's a durable rule or a one-off. If durable, he opens a pull request that adds the rule to the right doc.

4

Branch protection enforces Mo's review

The repo is configured so no one can push directly to main. Every change requires a PR + code-owner review. Mo is the code owner for everything in docs/ and src/utils/.

5

Mo merges the PR. The issue gets closed with a link to the commit

One source of truth. One author. Full audit trail.

6

Operators pull next morning

git pull origin main brings the latest rules into everyone's local clone. Claude reads the updated rule book on its next session.

Why this matters

If everyone could edit the rule book directly, we'd have conflicting versions of "what we charge", "how we phrase a refund", "what we say about offplan", etc. By funneling all changes through Mo + a daily review cycle, we keep the rule book accurate and avoid customers getting contradictory answers from different operators.

08 · Tools each operator uses

The toolkit. Install once.

A short list. Most operators won't touch more than four of these in a typical day.

Claude Code

The driver

Each operator has their own Anthropic account and runs Claude Code locally in the sooner-cs-playbook directory. This is where the drafting and sending happens.

GitHub CLI (gh)

For suggestions

Opens issues, files rule suggestions, reads PRs. Most operators only use one command: gh issue create.

Rasayel

Where customers live

WhatsApp Business API. Claude reads and writes via the Rasayel GraphQL + REST APIs. Operators rarely log into the Rasayel UI directly — Claude handles it.

CRM (Ops Dashboard)

Buyer state

Vlad's dashboard at dist-gray-mu-70.vercel.app. Holds buyer records, labels, stage transitions. Claude updates this automatically after each customer reply.

gog CLI

Gmail + Calendar

For email follow-ups and calendar invites. Each operator auths their own Sooner email. Calendar invites for confirmed calls get sent automatically.

Slack

Assignment + alerts

#sooner-ai-support is where Ori's assignment service posts notifications. When a conversation gets assigned to you, you'll see it there.

09 · What's next

What's still being built.

Two things land in the next week. After that, the system is at v1.

In progress

Assignment service (Ori)

Routes inbound Rasayel conversations to a specific operator (round-robin), keeps assignments stable, posts Slack notifications with the conv link. Eliminates double-replies. Lives at rematched/sooner-customer-support.

Next

New Sooner phone number

Mo to register a new business number under Sooner Real Estate L.L.C. The current number's deliverability is throttled after the bulk send. New number goes into Rasayel.

Shipped today

/start-shift, /refresh-handoff, /end-shift

Slash commands + turn-counter hook + SessionStart auto-boot. Session continuity is now automatic. See section 06 above for the full system.