P
ProDeskCPA Docs
Help center for firms + clients
All articlesBack to appContact Support
DocsStandard Operating ProceduresPortal Lock and Unpaid Invoice Escalation
Portal Lock and Unpaid Invoice Escalation

PURPOSE

Procedure for handling clients who fall behind on invoices — automated portal lock at threshold, demand-letter sequence, manual unlock after payment. Balances customer-success against firm cash collection. Auto-lock IS designed; manual unlock is required by design.

WHEN TO USE

- Client portal automatically flips to portalLocked=true (default: 30 days overdue OR 3 unpaid invoices, configurable 2/3/4/5) - Bookkeeper / preparer notices automated demand letter sent - Client contacts firm asking why portal is locked - Manual lock desired (e.g. firm decides to terminate engagement)

ROLES INVOLVED

- Primary owner: Billing / Accounts Receivable lead (or Office Manager) - Engagement Partner: approves manual unlock decisions - Bookkeeper / preparer: continues firm-internal work even when portal locked - Client: pays outstanding invoices to trigger unlock

PREREQUISITES

- Auto-Lock Policy configured in Billing Settings (M-010): threshold count (default 3), late fee policy if any - Payment gateway connected (Stripe / Square / PayPal / LawPay / CPACharge) - Demand letter template configured in Settings → Templates (M-036)

PROCEDURE

1. Auto-lock fires when threshold met: client.portalLocked=true + portalLockedReason set to "{N} unpaid invoices over {DAYS} days" 2. System effects (automatic): - Financial statements HIDDEN from client portal preview (M-007) - Document upload/download LOCKED in client portal - Automated demand letter sent via Email (M-025); from firm domain (NOT noreply@prodeskcpa.com once white-label send finalized) - AuditLog row written for the lock event (M-004) 3. Bookkeeper / preparer continues internal work; does NOT pause engagement (firm decision separate from client visibility) 4. If client contacts to resolve: confirm outstanding invoices; offer Pay Now via portal magic link OR direct invoice URL OR phone payment 5. Once payment received (Stripe webhook → /api/payment/success → invoice.status="PAID"; M-005 + M-010): system DOES NOT auto-unlock 6. Billing lead reviews: confirm ALL outstanding invoices for that client are now PAID (zero OVERDUE/LOCKED status) 7. If all paid: open client record → click 🔓 Unlock button → set portalLocked=false + portalLockedReason=null 8. AuditLog row written for unlock event with user attribution (M-004) 9. Send "Welcome back" email to client confirming portal access restored 10. If unpaid invoices remain (partial payment): keep locked; explain to client that partial payment doesn't unlock 11. For partial payment: record via Record Partial Payment (M-010) → invoice shows paid amount + remaining balance; remains LOCKED status

DECISION POINTS

- If client disputes the invoice: place invoice in dispute status (NOT yet implemented — track manually); partner reviews; potentially adjust invoice - If client cannot pay (financial hardship): partner judgment on payment plan; document via Notes; do NOT silently waive - If 60+ days past due with no client response: partner-level decision to terminate engagement; final demand letter; potential collections referral - If multiple service lines on same client (Tax + Audit + Accounting): lock applies to all; consider whether to unlock for one service while keeping others locked (advanced — manual handling) - If client is in Tax pipeline awaiting 8879: portal lock COEXISTS with "Awaiting 8879" — UI shows both states (verified in proto AWAITING list); 8879 link still works since signing is per-document not per-portal-state

EDGE CASES

- Auto-lock threshold should match firm's EL terms — if EL says "30 days net" but auto-lock at 3 unpaid invoices, this could trigger lock at >90 days; review threshold quarterly - Late fees: must comply with engagement letter terms + state law; system supports via line item OR auto-late-fee in Settings; firm responsible for legal compliance - Locked client + active engagement work: bookkeeper continues; financials are READY but client can't preview until unlocked — explain in client communication - Test mode: verify lock/unlock flow in non-production firm before relying in prod - Manual lock (no unpaid invoice basis): possible via direct flag set; document reason in portalLockedReason; rare scenario

KPIS / QUALITY CHECKS

- Average days from invoice issue → payment: target <30 days for accounting clients; <14 days for tax filing clients - Auto-lock incidence: <5% of active clients in any given month - Time from full payment received → manual unlock: target <2 business days (manual nature is intentional safety gate) - Demand letter response rate (clients who pay within 7 days of demand letter): >50%

RELATED MODULES & SOPS

- Modules: M-010 Billing · M-005 Webhooks · M-025 Email · M-007 Client Portal · M-008 Clients · M-004 AuditLog · M-024 Workflow (auto-lock action) - SOPs: SOP-001 (new client onboarding — sets up billing) · SOP-002 (accounting client onboarding) · SOP-005 (tax workflow)

NOTES

- Auto-Lock Policy callout block in billing UI is the canonical configuration surface - Stripe (and CPACharge) checkout sessions verified server-side via stripe.checkout.sessions.retrieve before marking PAID — payment authenticity verified - Manual unlock is REQUIRED after payment — no automatic unlock — design choice for safety against premature unlock - One outstanding workflow rule template: "Payment → Unlock Portal" (M-024) exists as a pre-built rule; firm can enable IF they want auto-unlock — but default is manual
Still need help?
Email our support team — we reply within 24 hours.
Email Live chat
ProDeskCPA — Practice Management for CPA Firms