Management gaps

What we are still missing from a property-manager perspective. Each gap names the pain, where it shows up, and what would close it.

This page captures gaps from the operator point of view — “I can’t do my job today because…”. Engineering tasks already exist for most of these (numbers in parentheses link to the master task list). The point of this page is to make the impact visible: what each gap blocks, and what closing it unlocks. P1 = directly blocks PM daily work or revenue. P2 = causes recurring manual work. P3 = quality-of-life.
P1 blocks operator daily work / revenue   P2 recurring manual work   P3 quality of life

Quick reference

PriorityGapWho feels itBlocksTask
P1No payments dashboardPM, accountantCan't answer "did this resident pay this week"#73
P1AuthNet webhook → CRM not wiredPM, ownerCRM invoice marked-paid drifts from real settle#102
P1Move-in prep fan-out is manualPMPPSK, lock code, welcome email, first invoice — all PM does by hand#105
P1PM action queue not surfacedPMNo single place to see "what needs my action today"#79
P1Resident portal does not existResident, PMResidents email PM for things they should self-serve#84, #85
P1Recurring invoice generator missingPM, accountantRent + recurring fees billed manually each month#138
P2SMS/ACS numbers not provisionedPMNo transactional SMS for tour confirms, payment receipts, NTV reminders#178, #179
P2Maintenance app on the wrong hostPM, techLives on finrep LXC 114, not migrated; tech has no real workflow#107–#109
P2Documenso integration missingPMLease send-out is a manual PDF email#81, #104
P2FB Leadgen webhook in flightPMFacebook ad leads land in a queue not in CRM#175
P2Zelle matcher not autoAccountantBC ↔ CRM delta is exposed but un-actioned#136, #135
P2Cash kiosk not portal-integratedPM, residentReads from legacy /ckreports; residents have no visibility#137
P2Payment-application priority engine missingPMPartial payments don’t auto-apply rent → utilities → fees correctly#139
P23rd-party payer handling missingPM, accountant“Mom paid for me” Zelles get mis-credited#140
P3Funnel stage-conversion view missingOwnerCan’t answer “where do leads die in the funnel”#103
P3Daily/weekly KPI rollup not builtOwnerNo single morning email summarizing the day
P3Dashboards lack drill-throughOperatorHave to leave dashboard for a CRM tab to investigate a row#129, #157
P3Discount engine missingPMSpecials are hand-applied at invoice time, not from the catalog rules#44
P3Damages-invoice generator missingPMSODA damage lines do not auto-bill#112
P3Ad pixels not wiredMarketingCan’t close the loop on FB/Google ad spend#46

P1 — Blocks daily operator work or revenue

1. Payments dashboard

P1   Task #73   |   Owner: PM, accountant
Pain
PM can see AR aging, can see kiosk activity, can see refunds — but cannot answer in one screen “did this resident pay this week, by what method, and against which invoice”. They flip between three reports + CRM.
What closes it
Combined view of customerpayment + AuthNet daily settle + Zelle (from BC) + kiosk + LiveWire checks, grouped by resident, with AR aging on the same row.
Unblocks
Removes 90% of “is this paid” phone tag between PM, accountant, owner.
Depends on
Per-lease subledger (already canonical), AuthNet settle ingest, ACH/eCheck once it lands.

2. AuthNet webhook → CRM invoice marked-paid

P1   Task #102   |   Owner: backend
Pain
Today the AuthNet receipt page tells the applicant “paid” but the CRM salesinvoice isn’t updated until someone notices the email. Drift between portal “paid” flag and CRM aging is ≤ 24h but it shows up as ghost AR.
What closes it
Listener at POST /api/authnet/webhook (idempotent on transaction_id) that writes the portal payment row, fires the canonical application.fee_paid CRM sync event, and triggers the move-in prep fan-out where applicable.
Unblocks
Removes the only known case of CRM lagging portal reality. Required by ADR-0021 (intentional CRM sync).
Blocked by
USER task #190 — operator must generate signature keys + configure webhooks in the AuthNet merchant dashboards for both tenants.

3. Move-in prep fan-out orchestrator

P1   Task #105   |   Owner: PM
Pain
After lease signing, PM has to manually: generate the PPSK QR, push the lock code to Assa Abloy, flip the portal to resident mode, send the welcome email, cut the first invoice, set up autopay if requested. Six clicks across four systems. High mistake rate — usually one step gets missed.
What closes it
Single orchestrator that fans out from lease.signed event: PPSK → Assa Abloy → portal flip → welcome email → first invoice → CRM contact update. Idempotent, retry-able, surfaces failures to the action queue.
Unblocks
Removes the highest-error PM workflow. Required for the “6 sites at 6 PMs” scaling thesis.
Depends on
PPSK API (#82), Assa Abloy API (#83), Documenso (#81), portal mode flip (#85), inspection-cleared gate (#86, #106).

4. PM action queue

P1   Task #79   |   Owner: PM
Pain
PM has no single “what needs my action today” surface. They scan email + the funnel + voicemail + work orders, every morning.
What closes it
Action-queue UI on pm.gatedrentals.com (scaffold landed in #187). Each action is a row: applicant waiting on screening review, lease ready to send, inspection cleared but lease not yet sent, refund disbursement pending, etc. Click row → take action inline; advance state.
Unblocks
Replaces “CRM views” as the PM’s morning surface. Cuts inbox triage time materially.

5. Resident portal

P1   Tasks #84, #85   |   Owner: backend + design
Pain
Residents have no self-service surface. They email the PM for: ledger balance, autopay setup, work-order status, lease copy, NTV submission, certificate of insurance update. PM forwards or rekeys.
What closes it
portal.gatedrentals.com — same portal codebase, different role. Resident sees: ledger, pay, autopay, work orders, lease docs, NTV submit. Reuses the applicant portal’s authn (CF Access → portal session).
Unblocks
Eliminates roughly half of PM inbound email by best estimate. Required for autopay (#87).

6. Recurring invoice generator

P1   Task #138   |   Owner: backend
Pain
Rent and recurring fees (storm-water, pet rent, electrical mockup, etc.) are billed by a manual monthly job on Crosbyprodinternal. If it doesn’t run, residents don’t get invoices and revrec misses earned rent.
What closes it
Portal-side generator running on the 1st of each month: walks active leases, applies the product catalog (rent + recurring fees + discounts), writes invoice + lines to portal, then fan-out CRM sync per ADR-0031.
Depends on
Discount engine (#44), product GL map (done, #159), per-site accounting email (#114).

P2 — Recurring manual work

7. ACS phone numbers + SMS pipeline

P2   Tasks #178, #179
Pain
No transactional SMS today: tour reminders, payment receipts, NTV ack, lease-signing nudge are all email-only. Applicant flow v3 (ADR-0030) needs SMS to deep-link the co-applicant.
What closes it
Provision toll-free + 10DLC numbers per tenant (Christian to verify the application). Wire send/receive against ACS Communications Services. Log inbound SMS as activities in CRM via the canonical event handler.

8. Maintenance app migration

P2   Tasks #107–#109
Pain
Maintenance app is on finrep LXC 114 — not in the monorepo, not in CRM, not in the action queue. Techs use it ad-hoc. Inspection flow is paper.
What closes it
Migrate into apps/maintenance. Add technician model, per-site roster, assignment workflow. Inspection app with room/item checklist + photo capture to R2 + cleared/holds workflow. Cleaning catalog table (#115).
Unblocks
Damages-invoice generator (#112), pre-move-in cleared gate (#106).

9. Documenso lease send-out

P2   Tasks #81, #104
Pain
Lease is generated as a PDF and emailed manually. Tracking who has signed lives in PM’s head.
What closes it
Documenso envelope create + webhook integration. Templates per site (lease + adverse-action + renewal + NTV). PM action “Send lease” in the funnel triggers envelope; webhook flips applicant state on full-execution.

10. Facebook Leadgen webhook

P2   Task #175 (in flight)
Pain
FB lead-ad submissions land in Meta’s leadgen queue; nobody is watching it consistently. Leads age 1–3 days before contact.
What closes it
Webhook handler at /api/lead/facebook → write lead_inbound with channel=facebook → fire lead.inquired CRM sync event. Same path as the inquire form, different channel tag.

11. Zelle matcher

P2   Tasks #135 (in flight), #136
Pain
BC ↔ CRM delta dashboard exposes the un-matched Zelles, but pairing them with the right invoice is still manual.
What closes it
Email parser for Amegy/Origin Zelle notices, repeat-payer pattern tracker keyed on payer name, automatic match to the correct lease where confidence is high; surface low-confidence as PM-review action queue.

12. Cash kiosk → portal

P2   Task #137
Pain
Kiosk reports still come from Crosbyprodinternal /ckreports. Residents cannot see “I paid at the kiosk yesterday” in the portal.
What closes it
Direct kiosk vendor ingest → portal payment table → CRM sync. Then deprecate Crosbyprodinternal legacy path.

13. Payment-application priority engine

P2   Task #139
Pain
When a resident sends a partial payment, CRM’s apply-to-invoice is FIFO. PMs want rent first, then utilities, then fees — by date.
What closes it
Portal-side allocator that walks open invoices and applies in priority order. Writes customerpayment rows in CRM with explicit invoice ref so revrec lines align with cash receipt order.

14. 3rd-party payer handling

P2   Task #140
Pain
A resident’s mom Zelles rent on their behalf. Today it lands as “unmatched” because the payer name doesn’t equal the resident.
What closes it
Linked-payer audit trail: payer_party separate from applied_to_lease, with a deliberate operator action “link this payer to lease X” that persists going forward.

P3 — Quality of life

15. Funnel stage-conversion (cohort)

P3   Task #103
Pain
Owner can see “how many leads” per stage but not “what percentage of inquiries that came in March 2026 became leases”.
What closes it
Cohort-conversion rendering on the funnel report. Time-series snapshot already in place (#98). Per ADR-0016.

16. Daily/weekly KPI rollup

P3   No task yet
Pain
No single morning email summarizing day-over-day: new leads, tours, applications, payments, AR delta, work-order backlog, voicemails. Owner reads 4 reports instead.
What closes it
Single cron that builds the rollup and sends via ACS Email. Reuses the time-series snapshot store.

17. Dashboard drill-through

P3   Tasks #129, #157
Pain
PMs leave the dashboard for a CRM tab to investigate a row, lose context, come back.
What closes it
Inline drawer on every row showing the underlying ledger / transitions / activities. CRM deep-link as fallback only. Pattern was working on revrec v3; needs to be applied across the board.

18. Billing-time discount engine

P3   Task #44
Pain
Specials and concessions are manually applied when generating invoices. Catalog has the rules but the invoice generator doesn’t consult them.
What closes it
Discount rules evaluator at invoice-generation time that walks the canonical discount-rules JSON and applies eligible discounts as line items with the explicit rule ID for auditability.

19. Damages-invoice generator from SODA

P3   Task #112
Pain
SODA finalization captures damage line items but doesn’t auto-cut a damages invoice. PM rekeys.
What closes it
On SODA finalize, generate the damages invoice with the line items already itemized, mark paid by deposit-forfeit, mark unpaid balance owed (if any).

20. Ad conversion pixels

P3   Task #46
Pain
Can’t close the loop on FB/Google/TikTok ad spend. Reference memory for unified funnel tracking (ADR pending).
What closes it
Per-landing config block firing the four pixel networks (client + server, deduped by event_id). Plausible is the cross-channel funnel report. All four pixels fire on the same events.

Cross-cutting infra gaps (not operator-facing but listed for completeness)

This page is hand-authored. If you spot a missing gap from the operator side, open an issue or add it directly here — the value is in capturing operator pain that does not have a task yet. See also the reports catalog for what exists today and the process map for how the pieces fit.