Decided on the 07-23 call: while Yale is stuck in IT review, we build a basic delinquency agent and practice at Camellia. Every serious competitor ships this and sells it hard — EliseAI claims 40–52% delinquency reduction, Entrata bought Colleen AI, RealPage ships Lumina reminders, AppFolio has RealmX flows. The read-side of our platform is already built (renewals proved it). What’s left is the outreach loop, the guardrails, and the measurement.
Fede’s call: this rolls out before any collections touch. Per-tenant languagePreference (en/es, extensible) sourced from application data, conversation inference, and PM-set overrides (Fede collected Spanish/English unit-by-unit on-site 07-21 — seed from that). Every outbound path checks it and translates before send; the mass-send composer shows the translated copy for PM review because raw MT is sometimes bad.
This isn’t just UX. English-only dunning at a heavily Spanish-speaking property is a national-origin disparate-impact risk (fair housing), and it’s the same gap that produced the English water-shutoff texts to Spanish-speaking units this week. It also benefits renewals, maintenance, and mass-send for free.
Population: Camellia residents who pay via the AppFolio online portal. Only them. Payment state is real-time, so no false “you’re late” pings while a money order sits in the office for a week. Fede’s estimate was ~40% of the building — measured 2026-07-24: 50.5% (46 of 91 current households pay majority-online); see the ledger audit below. Refresh monthly.
RenewalPolicyThresholds pattern — we set Camellia’s values, JP configures nothing.Every number below is 🟢 measured from the live AppFolio Data API (property 7), pulled 2026-07-24. Window: 2025-07-01 → 2026-07-24 (13 months). Sources: receivables_activity (1,618 payment txns), charge_detail (3,964 rows → 2,112 tenant rent-family charges), delinquency (79 rows). Raw pulls + analysis scripts archived in the session scratchpad; re-runnable read-only.
Payment-method mix across all 1,618 transactions in the window:
| PaymentType | Txns | $ volume | Class |
|---|---|---|---|
| Money Order | 523 | $560,664 | Offline |
| eCheck | 469 | $584,470 | Portal |
| CC | 426 | $405,154 | Portal |
| Check | 190 | $299,145 | Offline |
| Flexible Rent | 9 | $11,545 | Third-party (Flex) |
| Uncategorized | 1 | $928 | — |
Per-household rollup, current-status occupancies with ≥1 payment in the window (n=91). The cohort definition matters, so here is every reasonable cut:
| Definition | Share of current households |
|---|---|
| Majority of txns online (eCheck/CC) — pilot cohort definition | 46/91 = 50.5% |
| Most recent payment was online | 47/91 = 51.6% |
| 100% of txns online (strictest) | 30/91 = 33.0% |
| ≥1 txn online ever | 50/91 = 54.9% |
| Zero online txns (the money-order/check population) | 41/91 = 45.1% |
AppFolio PortalActivated=Yes | 59/91 = 64.8% |
OptedOutOfPortal=Yes | 0/91 |
CertifiedFundsOnly=Yes (hard-excluded) | 2/91 = 2.2% |
| $ volume paid online (current households) | $696,520 / $1,307,671 = 53.3% |
Verdict: Fede’s ~40% estimate was low — it’s 50.5% by the cohort definition (46 households), 53.3% of dollars. The brief’s “~40–45 tenant” cohort-size assumption holds almost exactly: the pilot cohort is 46 households (44 after the 2 certified-funds exclusions). 13 more households have an activated portal but still pay offline — the conversion opportunity below.
2,112 tenant charges on rent-family GLs (Rent Income, Parking Space Rental, Pet Rent), days from charge posting (≈ the 1st) to earliest applied receipt:
| Paid… | Charges | Share |
|---|---|---|
| Day 0–7 (inside CO grace) | 1,170 | 55.4% |
| Day 8–14 | 372 | 17.6% |
| Day 15–21 | 143 | 6.8% |
| Day 22–30 | 104 | 4.9% |
| Day 31+ | 253 | 12.0% |
| Still open / partial | 70 | 3.3% |
The same distribution split by pilot-cohort membership — this is the number pair that actually sizes the pilot:
| Pilot cohort (online-majority, Current) | Non-cohort (offline / past) | |
|---|---|---|
| Rent charges · households | 809 · 46 | 1,303 · 111 |
| Paid in grace (day 0–7) | 79.9% | 40.2% |
| Day 8–14 | 7.5% | 23.9% |
| Day 15–21 | 2.7% | 9.3% |
| Day 22–30 | 3.1% | 6.1% |
| Day 31+ | 5.8% | 15.8% |
| Still open / partial | 1.0% | 4.8% |
| Past day 8 (trigger rate) | 20.1% | 59.8% |
| $ collected by day 8 / 15 / 22 | 80.1% / 87.0% / 90.4% | 42.1% / 67.4% / 77.0% |
| Days-to-receipt p50 / p90 / p95 | 1 / 17 / 33 | 9 / 42 / 60 |
| Households ≥6 charges: never late · 6+× late | 20 · 11 (of 43) | 10 · 50 (of 80) |
Distinct cohort households whose rent-family charge was still unpaid at day 8, per month — i.e. who would have received a day-8 reminder had the pilot been live:
| Month | Cohort triggered | Cohort rent-$ late | Non-cohort triggered |
|---|---|---|---|
| 2025-07 | 8 | $9,773 | 34 |
| 2025-08 | 7 | $8,734 | 49 |
| 2025-09 | 7 | $9,165 | 53 |
| 2025-10 | 8 | $9,644 | 37 |
| 2025-11 | 7 | $9,265 | 43 |
| 2025-12 | 8 | $8,125 | 37 |
| 2026-01 | 7 | $8,040 | 43 |
| 2026-02 | 11 | $12,580 | 39 |
| 2026-03 | 10 | $12,025 | 40 |
| 2026-04 | 15 | $15,560 | 44 |
| 2026-05 | 11 | $11,460 | 36 |
| 2026-06 | 10 | $12,345 | 39 |
| 2026-07 | 12 | $12,460 | 35 |
Source: read-only Microsoft Graph sweep of the camelliaapts@jp-co.com mailbox — the demand traffic with the eviction firm Tschetter Sulzer Muccio PC (TSM). AppFolio's Data API exposes no notice/eviction surface at all (33 candidate report endpoints probed, all rejected), so email is the only system of record. Tenant names withheld here (units only); the full machine-readable census lives in the session scratchpad.
delinquency.LateCount is 0 for every tenant — including the 61 households late 6+ times. Do not use it. Compute lateness from charge_detail receipt timing (as this audit did); the brief’s tone-adaptation logic must key off computed history, not AppFolio’s field.ChargeDate is the posting date (≈ the 1st for rent). Fine for day-8 triggers; the build’s bucket-aware daysDelinquent upgrade (net-new #4) stays necessary for mid-month charges like parking/pet added off-cycle.ReceiptDate is a comma-separated list on split payments — earliest-receipt parsing (already in parseEarliestReceiptDate) is mandatory or lateness is overstated.receivables_activity carries per-tenant PortalActivated, OptedOutOfPortal, CertifiedFundsOnly, MustPayBalanceInFull on every row — the cohort query can come from this one report plus charge_detail; no extra endpoint needed.Max 3 touches per resident per month — well under the Reg F 7-in-7 cap we self-impose. Stop instantly on: applied payment, promise-to-pay (one polite check-in if the date passes unpaid), opt-out, dispute (→ human), PM pause. Suppression re-checks the ledger at send time, not enqueue time. Quiet hours 8am–9pm resident-local enforced in the dispatcher. Tone adapts to history — first-time late gets the softest copy, chronic late gets neutral-firm, never harassment-adjacent — and the whole tone bank goes through promptfoo evals before launch.
Channels: SMS + email only. No outbound voice in the pilot — the FCC treats AI voice as “artificial voice” (highest consent bar), and the Camellia TFN has a T-Mobile block anyway. Disclosure-forward: first contact in any thread identifies Clara as Camellia’s automated assistant with an easy human handoff. EliseAI does the opposite (human name, disclose only if asked) and a National Housing Law Project litigator publicly called that “unfair and deceptive” — we make transparency the feature.
| Clara may (autonomous) | Clara may never |
|---|---|
| Send cadence reminders · answer balance/lease questions in any thread · record promises-to-pay · surface the portal pay link · escalate | Mention or threaten eviction, legal action, or credit reporting · state a late fee that isn’t posted + lease-valid + cap-compliant · offer/accept payment-plan terms (pilot: plans are drafted suggestions to the PM from a pre-approved menu; a human sends and enters them in AppFolio) · waive anything · contact guarantors · serve, send, or sign a 10-day demand (drafting one for human review is planned — see the demand section, hard-gated behind /review) |
Escalate to PM on: dispute, hardship mention, opt-out, promise broken twice, day-22 reached, any eviction/legal question, any conversation the agent can’t hold in the tenant’s language.
Added 2026-07-24 from two parallel deep-dives: a read-only Graph sweep of the Camellia mailbox (the real demand traffic with TSM), and primary-source legal research (C.R.S. §§ 13-40-104/106/108, 38-12-105; JDF 99A rev. 2025-09-04; HB23-1120 / HB24-1098 / HB25-1240). Not legal advice; counsel sign-off required before any of Clara’s demand-adjacent behavior ships.
Reality check from the census (audit §5): ~6 batches/year, 2–6 demands each, ~16 households. The single biggest failure: date math — one whole batch of 4 was voided for a 9-day pay-or-vacate window, weeks lost. And 4 of the 46 pilot-cohort online payers were served a demand this year (units 118, 410, 122, 620; two escalated to real eviction filings) — demand territory is not disjoint from Clara’s cohort, so the boundary rules below will actually fire.
languagePreference directly feeds./review queue/review — the typed proposed-mutation inbox Gera built; tenant-confirmation and vendor-outreach are the existing types) as a new review type, and executes only on explicit PM approval. Initial rollout: Clara proposes, a human approves and acts, every time — no exceptions, no auto-send even for the pre-demand warning. Loosening any of this requires counsel sign-off + Fede/Sean explicitly un-gating it.
/review item alongside the evidence (ledger snapshot, language preference, affidavit checklist). The killer feature is the date math: a computed, guaranteed-compliant PVD (≥10 full days from day-after-service, with the service-date entered by the human server), eliminating the failure mode that voided the whole April batch. PM approves → prints → signs → serves. Clara never signs, never serves, never emails a demand to a tenant./review for PM approval before send during initial rollout; suppressed entirely for any tenant with a disclosed SSI/SSDI/Colorado-Works status, subsidy tenancy, active dispute, or existing served demand. The word “eviction” stays out of Clara’s vocabulary — “formal demand” is the ceiling.Not doing, ever (this pilot): electronic “service” of anything; auto-sending warnings without review-queue approval; stating amounts that include late fees; contacting anyone post-filing; drafting anything for the court stage (JDF 101/102 is TSM’s job).
Open items for counsel: rent-only vs. Denver’s “other amounts” block; first-party status of Clara’s messaging (the pivotal classification); HB25-1240 effective date + covered-dwelling scope. Open item for Fede: confirm who signs/serves on-site today (the served scans show a signer whose name doesn’t match our team roster — verify before wiring the signature workflow).
getDelinquencyProfile() (src/lib/domain/leasing/delinquency/index.ts:30) computes balanceMonths / pastDueRent / 12-mo latePayments live from AppFolio charge_detail; fails closed (null = unknown, never “not delinquent”). Battle-tested by renewals.TenantBalanceSnapshot with bucketedAR aging (types.ts:1557), hourly lambda/appfolio-sync, refuseZeroRegression guard; canonical read getCurrentBalance().RenewalPolicyThresholds + per-property delinquencyThresholdMonths (types.ts:1031).lease_and_billing.get_tenant_balance with server-resolved identity (never LLM-supplied), text + voice.agents/clara/lib/messaging/dispatch-envelope.ts): Twilio SMS w/ TCPA consent lookup, Graph email, ElevenLabs voice. Temporal autonomous-send precedent from renewals.delinquency report — AppfolioDelinquencyRow (integrations/appfolio/types.ts:351) is fully typed (PaymentPlan, InCollections, NSF, LateCount, LastPayment…) but nothing calls it — plus payment history (receivables_activity/charge-receipt join). Through getPMSClient only; add to the domain interface so Yardi/RealPage can implement later.CollectionsCase per tenant-month: ELIGIBLE → REMINDED_1..3 → PAID | PROMISE | ESCALATED | SUPPRESSED, full audit trail (message, timestamp, channel, ledger snapshot behind every stated balance). Keep ≥ 4 years. Plus a PromiseToPay record (amount, date, kept/broken).lastPayment* (currently hardcoded null, handle-get-tenant-balance.ts:37-41) and bucket-aware daysDelinquent (currently assumes due-on-the-1st).payment_plans report and PaymentPlan column.Research 2026-07-23; counsel sign-off required before go-live. Not legal advice.
| Regime | Verdict | What it means for the build |
|---|---|---|
| FDCPA / CO CFDCPA | Not binding | We’re a first-party landlord collecting current-resident rent. Two trap doors: never present as a third-party collector (always “Clara at Camellia Apartments”), and never chase debt acquired already-in-default. Counsel must confirm the JP-Co/owner entity structure keeps this first-party. |
| CFPB Reg F | Adopt anyway | 7-in-7 caps don’t bind first parties — we self-impose them (our ceiling is 3/month) plus a cooldown after any live payment conversation. |
| CO late fees §38-12-105 | Hard law | Fee = greater of $50 or 5% · ≥7-day grace · must be in the lease · one fee per late payment · no fee-on-fee · payments apply to rent first · notice within 180 days · no eviction for unpaid late fees. $50/violation + CCPA deceptive-practice exposure. Clara never states a fee that violates any of this. |
| CO eviction §13-40-104 | Hard law | Nonpayment needs a written 10-day pay-or-quit demand; cure kills the notice. Clara never implies eviction is imminent — the word doesn’t exist in her collections vocabulary this pilot. |
| TCPA / FCC | Hard law | Number-on-the-lease = consent for transactional debt contact (email consent ≠ SMS consent — ask before texting email-only residents). Quiet hours 8am–9pm local. Opt-out by any reasonable phrasing, honored ≤10 business days, cross-channel — the agent needs an explicit opt-out tool, not just STOP webhooks. AI voice = “artificial voice” (why voice is out). Register collections as its own transactional 10DLC campaign. Keep consent/opt-out records ≥4 years. |
| CO AI Act | Not in force | SB24-205 repealed; SB26-189 disclosure duties start Jan 1 2027. We disclose anyway — UDAP hedge and brand position. |
| Fair housing | Hard law | Identical cadence/tone/escalation for all similarly-situated residents; monthly audit of outcome distributions; don’t penalize benefit-cycle payment timing; language access (Phase 0). |
| Payment plans | Careful | Accepting partial rent can waive eviction rights on a notice → counsel-approved reservation-of-rights template; plans only from the pre-approved menu; written confirmation of every plan. |
Lock the baseline before the first send: 12 months of charge_detail history. The portal cohort is 46 households (44 after certified-funds exclusions) with only ~9.3 day-8 triggers/month (audit §3), so month-one truth is direction + case narratives, not p-values — report absolute numbers. Baseline must be the trailing-6-month per-tenant window, because cohort lateness has been worsening since Feb 2026 (7–8 → 10–15 triggers/month) and a 13-month average would flatter the pilot’s starting point.
delinquency report + payment history) → cohort query with all exclusions. Portal-payer share is now measured (50.5%, 46 households — see audit); productionize that query (majority-eCheck/CC over trailing 13 mo, minus CertifiedFundsOnly/Flex) and refresh it monthly. Do NOT read delinquency.LateCount — it’s zero for everyone (audit §5); compute lateness from charge_detail.CollectionsCase/PromiseToPay + Temporal cadence with send-time suppression; tone bank + promptfoo evals; opt-out tool./review item types (demand draft, pre-demand warning, cure-clock expiry) on Gera’s review-queue primitive → AcroForm fill of the current Denver demand + compliant-PVD computation → cure-clock/return-of-service tracking → TSM packet checklist. Ships nothing tenant-facing until counsel signs off on the warning copy and the rent-only amounts question. See the demand section./review gate. (10-day-demand drafting is no longer deferred — it’s now a planned, counsel-gated, review-queue-only workstream: see the demand section.)
Sources: founders call 2026-07-23 (raw transcript) · EliseAI/competitor research pass · AppFolio KB pass (help-articles + Data API) · repo capability inspection (paths cited inline) · first-party collections legal research (CO/TCPA/FDCPA/Reg F) · Camellia ledger audit 2026-07-24 (live AppFolio Data API: receivables_activity / charge_detail / delinquency, property 7, 2025-07-01→2026-07-24). Full citations live in ADR-0117 and the research reports behind it. Vendor metrics are marketing claims, not benchmarks.