production branch (v103, commit a4403ab) — what real leads hit today.
English narrative · Hungarian subject lines quoted verbatim · generated 2026-06-18.Two orthogonal things are marked on every message: who triggers the send and whether the code path exists in production.
The human-gate invariant: every lead-facing email is DRAFT→APPROVE except the three transactional ones (GHL booking confirmation, the Meet calendar invite, the pre-call reminders), which are AUTO-SENT. Nothing else reaches a lead without an explicit human click.
handle_missive_incoming): drop warm-up/DMARC, calendar RSVPs, out-of-office, internal senders, and Layer-0 automated/bulk mail before any AI call. Wise transfer → payment touchpoint.clientsflow.hu inbox, production ignores it entirely — Mátyás handles those by hand. Only the four cold-outreach inboxes feed the pipeline. [[production rule, 2026-06-18]]email_type, sentiment, is_lead, booking_ok, confidence.Everything below begins at step 3's branch on email_type / sentiment.
Grouped into families A–H by what the lead's reply was. Overlapping steps are repeated so each scenario reads standalone. Each message line shows the send-mode tag and (where it has one) the exact Hungarian subject line; in-thread replies have no new subject.
FIRST_REPLY_BLOCK_HU with the lead's prefilled booking link); rep approves → sent in-thread. On send an urgent "📞 Hívd fel" call task is created.BOOKING_THANKYOU_HU).After step 3 of Scenario 1 the lead goes quiet. followup_nudge_sweep (daily cron) drafts a nudge on day 2 / 5 / 9 — each is ✍️→🟡 draft→approve, in-thread (no new subject).
noshow_loop_sweep (daily cron) drafts up to 5 rebook emails, each ✍️→🟡 draft→approve, in-thread, tone gets shorter/looser each step (#5 = polite close). [[the manifest still labels this "authored — not auto-sent"; on production it IS cron-wired as drafts]]
_abandoned_cart_sweep (10-min cron) arms a 2h timer → drafts a payment reminder (AI, in-thread; authored ref "Már csak egy lépés, {keresztnév} 🙌"), sequence +2h/+1d/+3d, each ✍️→🟡 → lead pays → Prepayment.proposal_chase_sweep drafts a firm nudge (in-thread, CHASE_INSTR_FIRM) ✍️→🟡 → signs → pay.CHASE_INSTR_SOFT) ✍️→🟡 → signs → pay.An objection lands the deal in the 🚫 Negative Replies column (first column) and keeps the AI draft (acknowledge + facts — there may be room to convert). Three one-click actions.
negative_fup_ghost_sweep auto-moves to Ghosted.Goes to 🚫 Negative Replies with a default polite close draft "Köszönöm a visszajelzést! Sok sikert a továbbiakban!" (not the morning queue). Same three actions as objections.
new_lead → rejoins Family A at the first-reply step.booking_ok) → books → rejoin Family A.BOOKING_SKIP_TYPES) → ✍️→🟡 AI draft answers + re-offers the link + next steps → signs → pay._is_paid_client_deal → "Client message" task in the Ongoing build / Ongoing marketing columns) exists, but production ignores the main inbox entirely, so a client emailing clientsflow.hu never reaches it. It only fires if a paid client replies inside a cold-outreach thread — rare. [[effectively dormant]]Conditions are on the arrows; each box shows the email subject line (or "in-thread" / transactional label) + a short summary. Colours follow the send-mode legend; dashed = dormant/not-built on production.
flowchart TD START(["📨 Lead replies
(to cold email or a call)"]):::start CLS{"🤖 AI classifier
email_type · sentiment · booking_ok"}:::ai START --> CLS %% ===== branches by classifier ===== CLS -->|"interested / neutral
(new_lead_reply)"| FR CLS -->|"re-engaged after nudge
(followup_no_reply)"| FR CLS -->|"objection / pushback"| NEGCOL CLS -->|"sentiment = negative"| NEGCOL CLS -->|"reply on proposal thread
(proposal_followup)"| PF CLS -->|"paid client writes in"| ONG CLS -->|"non-lead / vendor (other)"| OTH %% ===== A: positive / first reply ===== FR["✍️→🟡 First reply (in-thread)
opener + fixed booking block
+ '📞 Hívd fel' call task"]:::gate FR -->|"books via link"| BOOKED FR -->|"no booking"| NUDGE FR -->|"rep phones instead"| CALLSET NUDGE["✍️→🟡 Nudge ladder (in-thread)
day 2 · day 5 · day 9 (graceful)"]:::gate NUDGE -->|"books"| BOOKED NUDGE -->|"still silent after #3"| LOST CALLSET["🟡 Rep sets Sales Call Date
manually (phone-agreed)"]:::man CALLSET --> BOOKED BOOKED["🔵 GHL booking confirmation
+ thank-you page"]:::ghl BOOKED --> MEET MEET(["🟢 Meet invite 'Weboldal Bemutató — {név}'
(GCAL-driven = dormant)"]):::dorm MEET --> REMIND REMIND["🟢 Reminders AUTO-SENT
24h 'Holnapi megbeszélés' · 1h 'Megbeszélés'"]:::auto REMIND -->|"attends"| CALL REMIND -->|"no-show"| NOSHOW NOSHOW["✍️→🟡 No-show rebook loop ×5 (in-thread)
ref 'Lemaradtunk egymásról, {név}?'"]:::gate NOSHOW -->|"rebooks"| BOOKED NOSHOW -->|"5 steps, no rebook"| LOST CALL{"🟡 Sales call (Fireflies records)
→ AI post-call form"}:::man CALL -->|"ready to buy"| PROP CALL -->|"timing objection
(still interested)"| NURT CALL -->|"needs 2nd call"| CALL2 CALL2["🟡 New Sales Call Date
(date-picker auto-event = dormant)"]:::dorm CALL2 --> MEET NURT["🟡 Halaszt — nurture until {date}
(auto 'we'll reach out' email = not built)"]:::nobk NURT -->|"date arrives"| FR PROP["✍️→🟡 Proposal email
'Az ajánlatod — {cég} weboldal'
(DocuSeal doc + Stripe link)"]:::gate PROP -->|"signs + pays ≤2h"| PREPAY PROP -->|"signed, not paid"| ABANDON PROP -->|"opened, unsigned"| CHASESOFT PROP -->|"sent, unsigned"| CHASEFIRM ABANDON["✍️→🟡 Abandoned-cart reminders (in-thread)
+2h · +1d · +3d · ref 'Már csak egy lépés 🙌'"]:::gate ABANDON -->|"pays"| PREPAY ABANDON -->|"never pays"| LOST CHASESOFT["✍️→🟡 Proposal chase — soft (in-thread)"]:::gate CHASEFIRM["✍️→🟡 Proposal chase — firm (in-thread)"]:::gate CHASESOFT -->|"signs"| PREPAY CHASEFIRM -->|"signs"| PREPAY CHASESOFT -->|"never signs"| LOST CHASEFIRM -->|"never signs"| LOST %% ===== onboarding tail ===== PREPAY["✍️→🟡 Welcome kit
'Üdv a fedélzeten! 🎉 Indulunk'
+ Drive folder · client portal"]:::gate PREPAY --> DEV DEV["🟡 Waiting for Dev → Dani Slack + task
→ Website Built"]:::man DEV -->|"full prepaid"| FULLPAID DEV -->|"partial"| BALANCE BALANCE["✍️→🟡 Balance due (in-thread)
'Elkészült a weboldalad 🎉 A fennmaradó…'"]:::gate BALANCE -->|"balance paid"| FULLPAID BALANCE -->|"unpaid"| LOST FULLPAID["🟡 Fully Paid → handover"]:::man FULLPAID --> HANDOVER HANDOVER["Handover invite
'Foglaljunk egy átadási hívást'
(authored, not auto-sent)"]:::dorm HANDOVER --> HANDED HANDED["🟡 Handed Over"]:::man HANDED --> REVIEW REVIEW["Review request +3d
'Hogy tetszik az új weboldalad?'
(authored, not auto-sent)"]:::dorm REVIEW --> WON([🏆 WON]):::won %% ===== B/C: negative & objection ===== NEGCOL["🚫 Negative Replies column
objection: keep AI draft ·
negative: 'Köszönöm a visszajelzést!'"]:::neg NEGCOL -->|"Send + Booking FUP"| NEGFUP NEGCOL -->|"engageable objection converts"| FR NEGCOL -->|"Reply & Mark Lost"| LOST NEGCOL -->|"Archive, no reply"| LOST NEGFUP["✍️→🟡 +2-day nudge (in-thread)
'Érdekes lehet a lehetőség?'"]:::gate NEGFUP -->|"books"| BOOKED NEGFUP -->|"1 week silence"| GHOST GHOST([👻 Ghosted]):::term GHOST -->|"writes back interested"| REACT LOST([🪦 Lost — 60-day nurture]):::term LOST -->|"writes back interested"| REACT REACT["🟢 Auto-reactivated → new_lead"]:::auto REACT --> FR %% ===== F/G/H ===== PF["✍️→🟡 Proposal-thread reply (in-thread)
answer + re-offer link · no booking link"]:::gate PF --> PROP ONG["Ongoing-client 'Client message' task
(dormant: main inbox ignored)"]:::dorm OTH["🟢 Logged / borderline-flagged /
ignored (no draft)"]:::auto classDef start fill:#e8f0fe,stroke:#2563eb,stroke-width:2px,color:#1c2230; classDef ai fill:#ffffff,stroke:#5c6675,stroke-width:1.5px,color:#1c2230; classDef auto fill:#e9f7ef,stroke:#1f9d55,color:#13502c; classDef gate fill:#fdf6e3,stroke:#b7791f,color:#6b4a10; classDef ghl fill:#e8f0fe,stroke:#2563eb,color:#15336e; classDef man fill:#eef1f5,stroke:#64748b,color:#33414f; classDef neg fill:#fdecea,stroke:#c0392b,color:#7d1f15; classDef term fill:#eef1f5,stroke:#64748b,stroke-dasharray:4 3,color:#33414f; classDef won fill:#e9f7ef,stroke:#1f9d55,stroke-width:2px,color:#13502c; classDef dorm fill:#f3ecfa,stroke:#8a4baf,stroke-dasharray:5 3,color:#4d2a66;
| Message | Subject line (HU) | Source | Send mode | Status |
|---|---|---|---|---|
| Cold email (first touch) | Beszéljünk a weboldaladról, {keresztnév}? | Instantly (read-only) | 🟢 campaign | live |
| First reply | in-thread | AI + FIRST_REPLY_BLOCK_HU | ✍️→🟡 | live |
| Booking confirmation | GHL template | GHL workflow | 🔵 | live |
| Booking thank-you page | page text | BOOKING_THANKYOU_HU | 🔵 page | live (GHL page) |
| Meet invite | Weboldal Bemutató — {név} | MEET_* | 🟢 | dormant (gated) |
| Reminder 24h | Holnapi megbeszélés | REMINDER_24H_* | 🟢 auto-sent | live |
| Reminder 1h | Megbeszélés | REMINDER_1H_* | 🟢 auto-sent | live |
| Proposal email | Az ajánlatod — {cég} weboldal | AI + proposal_followup_email_hu | ✍️→🟡 | live |
| Nudge 1/2/3 | in-thread | NUDGE_INSTR_1/2/3 | ✍️→🟡 | live (cron-drafted) |
| Proposal chase soft/firm | in-thread | CHASE_INSTR_SOFT/FIRM | ✍️→🟡 | live (cron-drafted) |
| Abandoned cart | in-thread (ref "Már csak egy lépés 🙌") | ABANDONED_CART_INSTR | ✍️→🟡 | live (cron-drafted) |
| No-show rebook ×5 | in-thread (ref "Lemaradtunk egymásról?") | AI loop | ✍️→🟡 | live (cron-drafted) |
| Negative default close | in-thread "Köszönöm a visszajelzést!…" | NEGATIVE_REPLY_DEFAULT_HU | ✍️→🟡 | live |
| Negative +2-day FUP | in-thread "Érdekes lehet a lehetőség?" | NEG_FUP_BODY_HU | ✍️→🟡 | live |
| Welcome kit / onboarding | Üdv a fedélzeten, {keresztnév}! 🎉 Indulunk | copy:email_welcome_kit | ✍️→🟡 | live (auto-drafted) |
| Balance due | in-thread "Elkészült a weboldalad 🎉…" | BALANCE_DUE_BODY_HU | ✍️→🟡 | live, but the .md subject differs |
| Handover invite | Foglaljunk egy átadási hívást, {keresztnév}! | copy:email_handover_invite | — | authored, not auto-sent |
| Review request | Hogy tetszik az új weboldalad, {keresztnév}? | copy:email_review_request | — | authored, not auto-sent |
| SMS templates | — | copy:sms_templates | — | not wired (SMS not provisioned) |
Sources for the rendering approach: Mermaid flowchart syntax · Mermaid.js guide (Swimm) · Email customer-journey flowchart guide (Omnisend).