CEO walkthrough · 12 July 2026 · local build evidence

What Phase 0 and Phase 1 actually did

A plain-English, visual guide to WREA's new email safety layer and first rescue pilot system: what is built, what is not live, which decisions were assumed, and exactly what must happen before a customer receives anything.

Updated release-gate report available This walkthrough records the original Phase 0/1 position. The newer report applies Thomas's six decisions, adds the Phase 2 foundation, includes fresh read-only production simulations and shows the three remaining approvals: open the updated CEO release gate.

60-second summary

The core Phase 0 and Phase 1 software is built and independently reviewed. It is not merged, not deployed, not protecting production, and not sending customer email.

Phase 0 creates the missing safety layer: it remembers unsubscribes, bounces and complaints, then checks every marketing recipient immediately before sending. Phase 1 creates a controlled two-email rescue pilot for recent sellers who asked for agent help but did not progress.

My recommendation: do not describe the phases as "done". Describe them as built and verified, awaiting a gated release. Before the customer pilot, add one small read-only suppression screen so you can inspect the safety list. Keep the 2-emails-in-14-days limit for the 15-lead pilot; make it CRM-editable, with an audit trail, before the much larger Phase 2 utility audience.

Built Yes

15 atomic commits on an isolated branch. Core safety, campaign, preview, journey and sending controls exist.

Verified Yes

76 automated tests and 326 assertions passed. Claude gave a final GO after targeted fixes.

Deployed No

Nothing is merged to pre-production or production. The new database tables exist only locally.

Customer sends None

No production campaign exists. No external customer email was sent during implementation or this review.

What was built, in business terms

Phase 0 · Safety

Stops known bad or unwanted sends

  • Creates one reliable record of addresses that unsubscribed, complained, bounced, were blocked or are invalid.
  • Checks that record immediately before any marketing-class email leaves the CRM.
  • Adds working unsubscribe links and receives SendGrid unsubscribe events.
  • Applies the same decision to workflows, mass email and vendor marketing digests.
  • Provides safe commands to inspect live workflows and import historical suppressions.
Not yet true in productionThese protections switch on only after deployment and historical suppression backfill. Production still behaves as it did before this branch.
Phase 1 · Rescue pilot

Makes the first pilot visible and controllable

  • Finds recent seller enquiries that appear stalled after 24 hours and are no more than seven days old.
  • Previews exactly who would receive, be held out, or be excluded before anyone is enrolled.
  • Plans two emails: the first at +24 hours and the second at +72 hours, only if the seller is still relevant.
  • Shows each person's journey, next send and latest result in the CRM.
  • Records every attempted send so uncertain outcomes require human review rather than blind retry.
Not yet a live campaignThe two real templates are not loaded, the sender is not approved, production consent evidence is not recorded, and no 15-lead cohort has started.

The intended rescue journey

1. Seller asks for helpA recent property enquiry enters the CRM.
2. Wait 24 hoursIf the seller progresses or staff are already helping, rescue stops.
3. Preview and checkConsent, address, suppression, staff touch, frequency and journey stage are checked.
4. Send in a sensible windowEmail 1 is due in the property's local 8am-6pm window.
5. Re-check at 72 hoursEmail 2 sends only if the seller is still stalled and eligible.

This is deliberately not a 12-email drip. It is a short rescue layer, followed later by genuinely useful market information for people who choose to remain subscribed.

Walkthrough of the actual CRM screens

What these screenshots areThey are the real new CRM screens on the implementation branch, using synthetic sellers and example.com addresses in an isolated test database. They demonstrate the interface only. No send or activation action was used.
CRM campaign list showing a rescue campaign in testing
1. The campaign control listStaff can see whether a campaign is in draft, internal testing, active or paused, plus active journeys, sends due in the next 24 hours and recent sends. The demonstration campaign is clearly marked TESTING, not live.
CRM campaign configuration and current state
2. The campaign's control centreThis shows the sender, consent basis, hourly throttle, 20% holdout, test-address allowlist, journey counts and send-attempt states. It also records who approved consent and who completed the internal test. An uncertain provider result appears as AMBIGUOUS and must be manually resolved. The screenshot's "Activate" button is from the local demonstration. Production activation remains blocked until all release evidence and templates pass validation.
Two rescue email steps with offsets and local send windows
3. The two-step rescue planThe first template is due after 24 hours and the second after 72 hours. Both use the 08:00-18:00 local window. The times are visible, but this first version does not yet offer the legacy workflow "Correct time" dropdown.
Audience preview showing eligible and suppressed demonstration sellers
4. The most important pre-send screenBefore enrolment, the CRM calculates candidates, would-enrol, holdout and excluded counts, then names the reason for every exclusion. Here, one synthetic address is suppressed and three are eligible. In production, this is where you review the proposed 15-lead cohort before giving a GO.
Contact-level email journey card
5. What staff see on an individual contactThe contact record shows the campaign, status, current step, last send, next send and latest attempt. Staff can stop all nurture for that person immediately. This is the day-to-day answer to "what email journey is this seller currently in?"

What I assumed, and what I need from you

I made conservative defaults so the system could be built and tested without pretending those defaults were your final business policy. These are the decisions that materially affect the pilot.

1

Legacy workflows

Production already has seller email workflows such as the 6 Week Home Seller Plan, Seller Guide and Home Selling Masterclass. We have not switched any off.

Recommended: run the live read-only inventory, then show you a one-page keep/defuse list with the purpose, timing and pending recipients for each. You decide; Felix executes.
2

Sender identity

The campaign must have a visible From name, From address and reply-to address on an approved WREA domain.

Recommended: "Which Real Estate Agent" from support@whichrealestateagent.com.au, with replies going to the same monitored address, unless deliverability evidence favours another existing mailbox.
3

Consent basis

The pilot assumes a recent request for agent help is the evidence for the short rescue message. Code stores the exact property enquiry and timestamp on each journey.

Recommended: obtain one written legal/compliance confirmation covering the two rescue emails and the wording of unsubscribe/identity disclosure. Record that evidence in the CRM.
4

The two rescue emails

Real copy has not been approved or loaded. The demonstration templates are placeholders only.

Recommended: I draft both from WREA's existing tone and seller objections; you approve them. Email 1 helps the seller take the next step. Email 2 offers useful local context and a simple reply path.
5

Frequency policy

The current safety default is no more than two marketing emails in any rolling 14 days, across all campaigns. It is deploy-time configuration, not a CRM setting.

Recommended: keep 2 in 14 for the 15-lead pilot. Before Phase 2, put the value in the existing Parameters system with an audit trail and safe minimum/maximum values so an admin can change it without a code release.
6

Suppression visibility

The data is stored with reason, source, contact, first/last occurrence and lift evidence, but there is no dedicated screen to browse it.

Recommended: add a read-only "Email Suppressions" screen before the first customer pilot. Include search, active/lifted status, reason, source, dates and linked contact. Do not add a casual "remove" button.
Other safety defaults I made (important, but no immediate action required)
  • 20% holdout: one in five eligible people receives no rescue email, so we can measure whether the email creates incremental progress.
  • 100 sends per hour: a campaign with no explicit throttle defaults to 100, not unlimited.
  • 24-hour minimum gap: even if configuration is wrong, two campaign steps cannot stack closer than one day.
  • 48-hour overdue expiry: a stale rescue message does not suddenly send days later after an outage or pause.
  • 14-day staff-touch block: recent human engagement blocks automated rescue so the CRM does not talk over staff.
  • 30-minute uncertain-send threshold: a send that crashed mid-provider-call becomes "needs human review"; it is never automatically repeated.
  • 30-day unsubscribe link validity: each email mints fresh body and one-click links that are valid for 30 days from that send. Both links in an older email expire; a later spam complaint can still suppress through the provider webhook.
  • Owned addresses only: the email must be attached to the CRM contact; arbitrary template addresses cannot receive marketing.
  • Agent digests remain operational: ordinary agent service digests are not stopped by vendor marketing rules. Agent mass-marketing is still gated.
  • Turning off an agent digest is broad: disabling an agent's digest subscription is treated as a full marketing unsubscribe across all of that agent's known addresses. Reversal requires recorded evidence.
  • Manual stops stay stopped: a completed journey may be deliberately re-enrolled after checks; an unsubscribe or staff stop cannot silently reactivate.

Answers to the things you noticed

What is "only send between 8am and 6pm in the property's local timezone"?

It is a new safety window for nurture steps. If a Sydney property's email becomes due at 7:30pm Sydney time, it waits until 8am Sydney time the next day. A Hobart property uses Hobart time. Waiting does not count as a failed attempt.

It is separate from the old workflow "Correct time" dropdown. That dropdown changes a legacy workflow action to choices such as "Right now" or "+1 day, 8AM". The nurture runner does not use the old workflow engine, so it stores its own visible per-step window. In the first version the window is configured when the campaign is created; it is not yet an editable dropdown.

What is the every-10-minute sender?

It is better described as a 10-minute due-work checker. Every ten minutes it wakes up, looks for up to 100 journeys that are due, and re-checks campaign status, expiry, customer progress, suppression, staff touch, local time window and hourly throttle.

It does not email everyone every ten minutes. It does not enrol people, does not touch draft or paused campaigns, and does not retry failures. When one journey is genuinely due and eligible, it creates one unique send instruction; the normal queue worker performs the actual provider call.

Why did the first preview approach need tens of thousands of database queries?

The early draft asked the database several questions separately for every contact. That is acceptable for a 15-person pilot but would create roughly 70,000 queries for a 10,000-person newsletter audience.

That issue was fixed before completion. The final code asks the database a small fixed set of bulk questions for the whole audience. A regression test caps the core bulk eligibility work at nine queries for 25 contacts, and the rescue conflict checks are also bulk queries.

Remaining Phase 2 work: the large utility preview still loads its full candidate set into memory and renders synchronously. Before the 10,000-person utility lane, the preview should be lazy-loaded and paginated. This is not a blocker for the 15-lead rescue pilot.

Is the 2-emails-in-14-days rule hardcoded?

It is central configuration, not duplicated throughout the code, but today changing it requires a code/config deployment. It is not editable in the CRM and it is not shown clearly enough on the campaign screen.

The cap counts marketing-class sends only. A staff member's normal one-to-one service email does not consume the marketing allowance.

Recommendation: keep it fixed for the small pilot so the experiment has one stable policy. Before Phase 2, surface it in Parameters with an audit log, show the effective value on every campaign, and apply it globally across campaigns.

Can I see who and what is in the suppression list?

The database now stores the normalized email address, reason, source, linked contact, occurrence count, first/last seen dates, whether it is active, and any controlled lift evidence. Sources include body and one-click unsubscribes, SendGrid unsubscribe/spam/bounce/block/invalid/drop events, legacy unsubscribe tags, manual suppression and historical backfill.

The audience preview shows that someone was excluded for ADDRESS_SUPPRESSED, and the contact journey shows status. There is not yet a dedicated suppression list screen. I agree that you need one. It should be read-only by default and make every inclusion explainable.

What is the CC feature, and why does marketing remove CC?

The legacy CRM has several ways to copy another address: a template's "CC (Email Only)" field, agent digest CC addresses, and company CC addresses. This is not a hidden second contact record; it is simply an extra copied recipient. For example, an operational agent digest may go to an agent and copy their assistant.

A marketing CC is unsafe because the copied person has not independently passed consent, suppression and frequency checks, and their unsubscribe cannot be tracked cleanly. The new rule therefore removes CC from marketing-class sends and logs that it happened. Operational messages can still use CC. If two people should receive marketing, each needs a separate, individually checked send.

The corrected path to the first real rescue email

Claude was right that the remaining work is mostly release and business input, but the earlier five-step summary omitted deployment. The order below is the actual dependency order.

#StepOwnerProof before moving on
1Merge and deploy the safety branch. PR, CI, pre-production QA, production promotion and database migrations. This gets Phase 0 protection working as soon as the release evidence is sound.FelixMerged PR, green pipeline, production migration output, rollback evidence and migrations applied to the shared test-server databases.
2Finish the CEO visibility slice. Add the read-only suppression browser and clearly display the effective global frequency cap. This may run in parallel with Steps 3-5, but it must be deployed before Step 8.TechnicalScreenshot, tests and Claude review.
3Inventory legacy production workflows. Technical team produces the keep/defuse register; Thomas decides; Felix disables chosen triggers and pending queued actions.Thomas + FelixNo unclassified commercial workflow and no pending sends for defused journeys.
4Backfill historical suppressions. Dry-run first, compare counts to the June baseline, explain differences, execute, then run again to prove no unexplained new changes.FelixBefore/after count table and sampled reasons/sources.
5Verify production environment. SendGrid webhook signature, worker health, staff-only permissions and a Gmail/Outlook/iCloud internal test allowlist.FelixConfiguration and worker-health evidence.
6Complete business inputs. Approve sender, two templates, consent basis and pilot success/kill criteria.ThomasApproved templates and named/date-stamped evidence in CRM.
7Run real internal test sends only. Verify Gmail, Outlook and iCloud placement, sender identity, headers, both unsubscribe paths and SendGrid campaign attribution.Thomas + FelixInbox screenshots and CRM evidence record.
8Hard STOP/GO. Thomas reviews the live 15-lead preview, every exclusion, staff overlap, templates, evidence and kill criteria. Nothing external sends without explicit approval.ThomasExplicit written GO and campaign activation attributed in CRM.
9Run the micro-cohort. Watch delivery, uncertainty, staff collisions, unsubscribes and progress daily for one week before any expansion.Growth + FelixOne-week pilot readout against the holdout group.
Hard boundarySteps 1-7 may prepare and test the system using approved internal addresses. No customer email is permitted until Step 8 receives your explicit GO.

What happens in the next phases

Now

Release Phase 0/1 and learn

Close the visibility gap, deploy safely, run the 15-lead rescue cohort and learn whether it creates incremental seller progress without colliding with staff.

Do not scale yet.

Phase 2

Useful ongoing market emails

Build one monthly utility system for opted-in sellers: local market insight, property-value refresh, costs to sell and genuinely useful decision support.

Before launch: lazy/paginated 10,000-person preview, CRM-editable audited frequency policy, content calendar and lane reporting.

Phase 3

Events and property value

Connect the new property value tool, capture verified email and scoped consent, retain estimate history, and send event-led updates when rates or market conditions materially change.

An event email replaces that month's regular utility email; it does not stack on top.

The report format I will use after every phase

  1. Four status lights: Built, verified, deployed and actively running/sending.
  2. Three plain-English changes: what is now possible that was not possible before.
  3. Actual screenshots: the exact screens staff and you will use, with examples.
  4. Assumptions and defaults: split into "needs Thomas" and "technical safety default".
  5. Risks and safeguards: the top three ways the phase could fail and the control for each.
  6. Next gate: owner, evidence required and the exact condition that prevents premature rollout.

Technical evidence, kept out of your way

The detailed architecture, schema, service contracts, command list and full test plan remain in the technical build specification. The product branch is codex/WREA-email-nurture-phases-0-1 in /Users/tr/dev/wrea-multi-project/wrea-email-nurture.

Implementation evidence: 15 atomic commits; migration rollback/reapply passed; integrated regression 76 tests / 326 assertions; Claude final GO after throttle-default and multi-property conflict fixes.