Why teams switch to Dunwright from LedgerUp.
A side-by-side read on the things that change week-one for a service business: always-on dunning, QuickBooks-native reconciliation, the daily cash digest, TCPA quiet hours, and per-account pricing without seat fees.
Side by side
What Dunwright ships that LedgerUp doesn’t.
Each row names the artifact a Dunwright trial would walk you through — no hand-wavy "we’re better" framing.
| Capability | Dunwright | LedgerUp |
|---|---|---|
| Always-on dunning | DunningSequence model + editor at /app/sequences; nightly cron `dunning-sender` at 0 2 * * * (polsia.toml). | — |
| QuickBooks-native reconciliation | QB Online polled as ledger of record; Stripe settlement via /api/stripe-billing/verify writes back to the invoice. | — |
| Daily cash digest | DigestRun model with per-owner lastSentAt cursor, cron `daily-digest` at 0 7 * * *; Slack-delivered summary. | — |
| TCPA quiet hours | ComplianceSettings.quietHoursStart/End per owner, editor at /app/settings; dunning-sender gates sends inside the window. | — |
| Per-account pricing | Three tiers in src/lib/contracts/plans.ts: "no seat fees, no per-invoice penalty"; checkout via installed stripe-billing module. | — |
Every Dunwright cell above maps to a shipped feature: a Prisma model, a cron in polsia.toml, or a route handler you can audit in the repo.
Why teams switch
The first week is where the gap opens up.
Most teams coming off LedgerUp aren’t switching because of the dunning cadence itself — they’re switching because the cadence keeps running. The DunningSequence editor at/app/sequencesowns the four-step ladder; the nightlydunning-sendercron at0 2 * * *walks the queue while the team sleeps, applies the template + channel + offset, and writes a per-customer escalation row so the morning inbox shows what actually fired.
Reconciliation is where the second gap appears. QuickBooks Online stays the ledger of record and Dunwright polls it so the dunning queue is exactly what’s currently overdue — not what an export said last night. Stripe settlement flows back through/api/stripe-billing/verify, which writes the cleared payment to the matching invoice; short pays and partial splits are flagged inline rather than buried in a weekly reconciliation report.
The third piece is the morning digest and the quiet-hours window that keeps it safe. Thedaily-digestcron at0 7 * * *reads the per-ownerDigestRun.lastSentAtcursor and delivers the summary to Slack — and theComplianceSettingseditor at/app/settingsgates every send inside the owner’s quiet window before it ever reaches the customer.
Ready to move your AR off the spreadsheet?
Pick the plan that fits your week.
No seat fees, no per-invoice penalty, no commitment — cancel from the dashboard any time.
Prefer email? dunwright-5@polsia.app.