Process map
How the operation runs from lead source through move-out, from a PM's perspective. License-to-occupy model — closer to a hotel than a residential lease. Last updated: 2026-05-16.
1. The funnel — lead source to license signed
5 intake routes are LIVE in portal-api (inquire / tour / schedule-call / walkin / phone-log). Each writes both a lead and an activity. Plaid IDV is wired; Documenso for license signing is not yet set up.
flowchart TD A1[Lead source
landing inquire-now,
schedule-tour, schedule-call,
FB Leadgen, walkin tablet,
PM phone-log] --> B[lead_inbound + crm_sync_event
in portal-postgres] B -.drain pending.-> C[CRM sync drain
writes lead + activity to DV] C --> D[CRM lead created
in correct tenant] D --> E{PM follow-up?} E -->|tour, call, walkin captured| F[gr_toursignins or
phonecall activity logged] E -->|stuck > 24h| G[PM action queue
'follow up'] F --> H[Applicant clicks Apply] H --> I[Account create + OTP] I --> J[Plaid IDV
primary] J --> K{Co-applicant?} K -->|yes| L[SMS deep-link] L --> M[Co-app Plaid IDV] K -->|no| N[Pay $65 fee
AuthNet Accept.js] M --> N N --> O[Auto-fire
Plaid Income +
Kredifi screening] O --> P{PM decision
approve / conditional / deny} P -->|deny — sex offender, felony| Q1[Hard denial
no adverse-action cycle] P -->|deny — other| Q2[Soft denial
one-line reason +
Kredifi agency contact] P -->|approve| R[License agreement
via Documenso
NOT YET SET UP] R --> S[License signed] S --> T[Move-in prep fan-out] classDef pm fill:#dbe6cf,stroke:#143,color:#143 classDef appl fill:#fef3c7,stroke:#7a4d00,color:#7a4d00 classDef sys fill:#cfd6dc,stroke:#2f4a62,color:#2f4a62 classDef pending fill:#fff4e5,stroke:#ef6c00,color:#7a3a00,stroke-dasharray:5 3 class A1,H,I,J,L,M,N appl class E,F,P,Q1,Q2 pm class B,C,D,G,O,S,T sys class R pending
2. Pay frequency + invoice timing
Captured at license signing — weekly / biweekly / monthly. Invoice issues 7 days before due. Due before noon on the assigned day.
flowchart LR A[Lease.pay_frequency
weekly / biweekly / monthly] --> B{Frequency} B -->|weekly| C1[Invoice every 7 days
due before noon on
assigned weekday] B -->|biweekly| C2[Invoice every 14 days
due before noon on
assigned day] B -->|monthly| C3[Invoice on the 1st
due before noon on
the 1st] C1 --> D[Recurring invoice generator
fires 7 days before due] C2 --> D C3 --> D D --> E[Email + SMS to resident
w/ fair housing footer] E --> F{Paid by noon
on due day?} F -->|yes| G[Mark paid,
apply per priority engine] F -->|no| H[Late fee accrues
per catalog] classDef sys fill:#cfd6dc,stroke:#2f4a62,color:#2f4a62 classDef appl fill:#fef3c7,stroke:#7a4d00,color:#7a4d00 class A,B,F appl class C1,C2,C3,D,E,G,H sys
3. Move-in prep — the fan-out
After license signing, six things happen. Currently the PM does all six manually. Task #105 builds the orchestrator.
flowchart LR A[License signed] --> B[Pre-move-in inspection
cleared by delivery crew] B --> C[PPSK QR generated] B --> D[Lock code pushed
to Assa Abloy] B --> E[Portal flipped
applicant → resident] B --> F[Welcome email
via ACS Email] B --> G[First invoice cut
rent + prorations
per pay_frequency] B --> H{Autopay?} H -->|yes| I[ARB subscription
via AuthNet] H -->|no| J[Pay-on-portal
each cycle] classDef pm fill:#dbe6cf,stroke:#143,color:#143 classDef delivery fill:#cfe6e2,stroke:#0f3a36,color:#0f3a36 classDef sys fill:#cfd6dc,stroke:#2f4a62,color:#2f4a62 class B delivery class A,C,D,E,F,G,I,J sys
4. Resident steady state — what residents do every month
Residents have five payment surfaces: portal (AuthNet card / eCheck), cash kiosk on-site, Zelle (matched via queue), mailed check (LiveWire), in-person cash/MO at the office. No lease "renewal" — continuous pay-to-stay until they leave or stop paying.
sequenceDiagram
participant SYS as System
participant PM as PM
participant R as Resident
participant T as Technician
Note over SYS,R: 7 days before each cycle
SYS->>SYS: Generate invoice (rent + recurring fees)
SYS->>R: Email + SMS — fair housing footer attached
Note over R: Resident pays via any surface
par
R->>SYS: AuthNet Accept.js (portal)
and
R->>SYS: Cash kiosk (on-site)
and
R->>SYS: Zelle (matched in Zelle queue)
and
R->>SYS: Mailed check (LiveWire scan)
and
R->>SYS: Cash / MO at office (PM records)
end
SYS->>SYS: Priority engine applies cash:
rent → electric → propane →
utilities → fees → late
alt Overpayment
SYS->>SYS: Immediately bill next rent cycle
(GAAP — never hold money against zero obligation)
end
Note over PM,R: When something breaks
R->>SYS: Submit work order (portal)
SYS->>PM: Action queue + notify
PM->>T: Assign technician
T->>SYS: Photo before + after, status
SYS->>R: Email — resolved
alt Warranty-flagged asset
SYS->>PM: Route to Home Assembly action queue
end
5. Exit — NTV through SODA
Hard 7-day SODA deadline. Wild Energy final electric is estimated at move-out (not waiting 30 days for the actual bill) so SODA can close. We eat the variance.
flowchart TD A[Resident submits NTV] --> B[Lease.notice_given_date set] B --> C[PM confirms surrender date] C --> D[Final rent prorated to surrender] D --> E[Move-out date] E --> F[Delivery crew walks unit
inspection bundle + photos to Garage] F --> G[SODA created — draft] G --> H[Wild Energy
final electric estimate
from last accumulator +
avg daily kWh × days] H --> I[Damages assessed per room
clean / damaged-tenant /
damaged-warranty / normal-wear] I --> J[7-day SODA deadline timer] J --> K[Finalize SODA] K --> L[Refund disbursement
CHECK ONLY — no electronic] L --> M[Check stamped, mailed] M --> N[Bank ledger clears
refund — close lease] classDef pm fill:#dbe6cf,stroke:#143,color:#143 classDef delivery fill:#cfe6e2,stroke:#0f3a36,color:#0f3a36 classDef appl fill:#fef3c7,stroke:#7a4d00,color:#7a4d00 classDef sys fill:#cfd6dc,stroke:#2f4a62,color:#2f4a62 class A appl class C,K,M pm class F delivery class B,D,E,G,H,I,J,L,N sys
6. Who does what — reference card
| Stage | PM action | Automated | Surface |
|---|---|---|---|
| New lead lands (any of 5 intake routes) | None (until 24h stuck) | lead_inbound + crm_sync_event written | — |
| Stuck lead 24h+ | Call or email | Action queue surfaces | Action queue |
| Tour booked | Greet, walk unit | Confirmation .ics + email — fair housing footer | Tour sign-in |
| Walk-in (tablet) | Capture on tablet | lead + gr_toursignins activity | Tablet — Crosby |
| Phone log | Fill form during/after call | lead + phonecall activity | Log Call form |
| Application submitted + paid | None | Plaid Income + Kredifi auto-fire | — |
| Screening complete | Decision: approve / conditional / deny | Soft-denial notification (no formal adverse-action cycle) | Action queue |
| Approved | Send license agreement | Documenso envelope (NOT YET WIRED) | Lease action |
| License signed | Delivery crew inspection sign-off | Move-in prep fan-out (manual today) | Tools |
| Resident steady state | Triage WOs + messages | Rent invoice gen + payment apply + autopay | Action queue |
| NTV submitted | Confirm surrender date | Timer starts | Action queue |
| Move-out walk-through | Walk unit, photo, fill inspection | SODA draft + Wild Energy estimate auto-fired | SODA finalize |
| SODA finalize | Review math, confirm, stamp check | Damages invoice + check disbursement | SODA finalize |
7. Where things live (system of record)
| What | Canonical home | Sync to | Notes |
|---|---|---|---|
| Lead, applicant, lease state | portal-postgres | CRM (Dataverse) | Portal is source of truth. ADR-0021. |
| Per-lease subledger | portal-postgres | — | Invoice + payment rows. AR aging, deposits, refunds, revrec all source from here. CRM-side is delta/audit view only. ADR-0022. |
| Revenue recognition basis | portal-postgres line-by-line | — | Per-LINE: point-in-time products (propane, fees) recognize on invoice; period-bearing (rent, utilities) recognize ratably. Move-out clamps period_end. Lease dates are NOT the basis. |
| Bank ledger / Zelle | Business Central | Portal subledger via Zelle matcher queue | Match against LEASE not invoice; priority engine handles per-line allocation. |
| AuthNet transactions | AuthNet | Portal payment + CRM salesinvoice marked-paid | Webhook (#102) wires this. Manual today; blocked on signature key setup (#190). |
| Wild Energy meter readings | Wild Energy's cloud | Our DV via API ingest job | Sensors are Wild Energy's; we provide PoE + internet, consume data downstream. |
| Camera state | Dahua NVR (10.10{N}.30.5 per site) | portal camera_status table | PoE port state from MQTT broker as fallback. |
| WiFi PSK | PPSK app (LXC 110) | Resident welcome email | Phase 3 of design spec. |
| Door codes | Assa Abloy cloud | — | Manual today; #83 wires API. |
| Documents (license PDFs, photos) | Garage S3-compatible cluster (chronos + atlas) | R2 nightly mirror, AWS S3 at park-sale time | Per-home archive: homes/{site}/{pad}/{home_serial}/... |
| Secrets | Azure Key Vault (per-site) | — | Read by SP at startup. Never in repos. Never in .env on disk. |
8. Refunds — check only
We do not issue electronic refunds. AuthNet refund / ACH reverse / Zelle send-back are all explicitly excluded. Physical stamped check is the audit trail. Earlier ADR-0028 had AuthNet-refund-first as the path; that's been reversed.
9. Compliance items always on
| Item | Where | Status |
|---|---|---|
| Fair housing notice | Every email, invoice, SMS, portal page, modal trigger | Live canonical snippet in [[reference_fair_housing_notice]] |
| HOT (Texas Hotel Occupancy Tax) | Audit-gaps Section 4 flags every short-stay lease without HOT | Surfaced — backlog needs catalog product (#195) |
| FCRA — credit pull consent + report on request | Apply flow Plaid + Kredifi consent steps | Live per [[project_license_not_lease_model]] |
| FCRA — pre-adverse-action waiting period | NOT REQUIRED under license model | Lighter than residential tenancy |
| Park-readiness inspections (lender filings) | Monthly inspection-report-zip generator | Planned (#214, #215) |
10. Failure paths — what to do when something doesn't auto-resolve
| Symptom | Likely cause | Where to look |
|---|---|---|
| Payment landed but invoice still "open" | AuthNet webhook missed or CRM sync queued | BC ↔ Chase reconciliation; portal-api logs |
| Resident says "I paid" but no record | Unmatched Zelle, kiosk, or third-party payer | Zelle queue, kiosk report — PM links payer to lease |
| Tour booked, no .ics in inbox | ACS Email error or applicant typo | portal-api logs; resend manually |
| Plaid IDV stuck | Plaid session expired or applicant abandoned | Action queue surfaces after 30 min |
| Kredifi report not back > 4h | Vendor delay | Refresh on order page; escalate if > 6h |
| License envelope not delivered | Documenso not yet wired | Documenso integration is task #81 / #104 — manual today. |
| SODA past 7 days | PM did not finalize | P0 — finalize now. SODA dashboard surfaces. |
| Wild Energy reading is stale | API ingest job halted | Discovery task #231; meter-data-freshness check coming |
| Camera offline + PoE off | Switch port down or cable cut | MQTT switch state on chronos-broker |
| Camera offline but PoE on | Camera firmware fault or stream frozen | NVR diagnostic; remote reboot from Dahua console |
For the full system-architecture view (databases, integrations, network readiness across Mist + Adtran + Dahua + MQTT switches, system-of-record matrix) see reports.gatedrentals.com/process. For reports catalog + management gaps, see /catalog and /gaps.