Junto Law partner compensation & collections dashboard
Updated after the July 10 call. Every open question in §8 has been answered; this document records the agreed scope accompanying the signature agreement.
01The problem
Junto Law pays attorneys on splits of collected revenue. All the underlying data lives in PracticePanther, but it's scattered across disconnected reports (productivity, origination, billing analysis) that never come together in one place. Every month, Swati manually pulls reports, cross-references invoices against payments, applies split percentages in spreadsheets, backs out expenses, and calculates what each person is owed: hours of careful work PracticePanther forces on her, with no way to show anyone how a number was derived. PracticePanther's own team has already told the firm that the report Junto needs would be a custom build.
The firm simplified its comp model on May 1, 2026 (one firm-wide split), which should have made this easy, but PracticePanther still can't answer the basic question: "Here's what happened this month, and here's what you owe each person."
The partners have a related problem: they can't see their own numbers. They can't tell what they've collected, what they're owed, or which of their invoices are sitting unpaid, so nobody chases the invoices they're personally waiting on.
02What success looks like
- Junto closes a month in one sitting, with zero spreadsheets. She opens the dashboard, reviews each partner's payout statement, resolves anything the system flagged, pays through Melio the way she does today, and marks each payout paid: the ledger closes the loop, all from a single screen of final numbers.
- Every partner logs in and sees their own numbers: what they've collected, what they're projected to be paid, which invoices are outstanding, and exactly how the math worked, without asking Shayn or Swati.
- Shayn sees the whole firm at a glance: collections over time, who's producing, who's originating, and where the money is stuck.
- Overdue invoices get chased by the people incentivized to chase them: the partner who won't get paid until it's collected.
- The numbers are trusted. Every dollar is traceable from payment → matter → split rule → payout. Anything ambiguous is flagged for a human, never silently guessed.
- Trust money is never mistaken for revenue: shown and labeled, excluded from "collected" until applied to an invoice.
Success metrics
| Metric | Today | Target |
|---|---|---|
| Time to close a month's payouts | Hours of manual spreadsheet work | Under 30 minutes |
| Spreadsheets in the payout process | Several | Zero |
| "What am I getting paid?" | Manual math, or a question to Swati/Shayn | Self-serve, line by line |
| Partner visibility into their own collections & aging | Pull PracticePanther reports and do the math | Self-serve, daily |
| Invoices past 60 days | Not surfaced to the attorney who's owed | Visible, alerted, shrinking |
| Payout verification | Manual cross-checks across PracticePanther reports | One downloadable report per close |
03Users & roles
| Role | Who | Access |
|---|---|---|
| Owner | Shayn | Everything: all data and payouts, comp settings, invite users, assign roles |
| Admin | Swati | All data and payouts, run month-close, resolve exceptions, manage notifications |
| User (Partner) | Each attorney (Roman, Eugenia, Matt Jones, McCall, …) | Their own data only |
Two ledger distinctions, not new roles: Shayn also appears as a partner line in the comp data (his 10% originations, any work he collects on), and Junto itself is a first-class entity in the ledger (the 40% bucket plus expense recoveries; see §4).
Owners invite new people and change roles. Adding a new attorney to the firm should take minutes, not a development request.
04Compensation rules the system must encode
Standard split
- Working attorney → 50% of what's collected for their work
- Originating attorney → 10% of what's collected on their matter, paid whether or not they did the work
- Junto always keeps 40%, no exceptions; this is only possible if the 10% goes to the originator independently of who worked (see examples)
- Splits are computed on collected money, not billed. Payouts go out the month after collection.
Worked examples: $1,000 of fees collected (confirmed in writing, July 10):
| Scenario | Payout |
|---|---|
| You worked it and it's your client | You $600 · Junto $400 |
| Danielle works a matter Shayn originated | Danielle $500 · Shayn $100 · Junto $400 |
| Danielle ($750 of the fees) and Eugenia ($250) both work Shayn's matter | Danielle $375 · Eugenia $125 · Shayn $100 · Junto $400 (the 50% pool splits pro-rata by each attorney's share of the fees) |
| Danielle opens and works a new matter for a client Shayn originated | Danielle $500 · Shayn $100 · Junto $400 (the 10% follows the client relationship; deliberately the same numbers as the second row, because opening the matter doesn't move the 10%) |
Cash application order:
- Expenses are reimbursed to the firm first, 100%; they never enter the split pool ("that always goes back to us first")
- What remains is fee collection, split per the table above
- A payment that partially covers an invoice allocates the same way: expenses first, then pro-rata across the fee lines (confirmed in writing, July 10)
Junto's bucket
Junto is tracked as its own entity in the ledger, like a partner. It accrues 40% of every fee collection plus 100% of expense recoveries, monthly. Recoveries are reimbursements of money the firm fronted, not earnings: every view labels them "recovered." Shayn's personal lines (50% for work he collects on, 10% for his originations) stay separate from the Junto bucket.
Transition policy
Settled in writing, July 10: all payments received from July 1, 2026 onward split at the current firm-wide rule, regardless of when the underlying work was billed. No legacy-rate engine is needed. Payout statements exist from the July 2026 close forward; earlier months sync for analytics only and are never restated as payout obligations. May and June payouts were made under the old splits, and the tool doesn't second-guess them.
Draw + quarterly true-up (currently Matt Jones)
- A recurring draw (biweekly or monthly; e.g., ~$50k per quarter)
- At quarter end, the system computes what the standard split would have paid: earned more than drawn → bonus for the difference; earned less than drawn → deficit carries forward and nets against the next quarter's true-up
- The carryforward chain is always visible, never a side calculation.
Configurability requirement
Comp is managed on a settings page, not in code:
- Define comp types (Standard Split, Draw + True-Up, and future variants)
- Set percentages, draw amounts, and true-up cadence per type or per person
- Assign each person a comp type with an effective date
- A per-matter split override as an escape hatch for one-off deals
- A firm-level payout effective date, now set: the July 2026 close. All history syncs for analytics, but payout obligations are only computed from that close forward
The bar: onboarding the next "Matt Jones-level" partner, possibly with different numbers, requires zero code changes.
05V1 features
F1 PracticePanther sync. Backfill of historical data, then continuous automatic sync (hourly freshness target). Entities: clients/accounts, contacts, matters, time entries, flat fees, expenses, invoices, payments, users, tags, and custom fields. A nightly reconciliation sweep catches records deleted or corrected in PracticePanther after they were first synced. Invoice paid/unpaid status flips on the hourly sync, and the tool never writes back to PracticePanther. Expense entries carry a real billed-by-user ID (name, email, date), which powers the expenses-by-partner view in F6.
F2 Compensation engine + settings page. As specified in §4.
F3 Monthly payout run. Swati opens the month and gets a per-partner statement: every attributed collection (client, matter, invoice, role as worked and/or originated, split %, dollar amount), plus Junto's 40% and expense recoveries. She reviews, resolves any flags, and approves. Statements move through a lifecycle: Draft → Approved → Paid. Approved statements are locked and archived for auditability.
- Downloadable verification report per close (CSV + PDF): every component line behind every payout number (payment → matter → invoice → split rule → dollars, plus expense recoveries), per partner plus a firm roll-up. Trust, but verify: this is Swati's benchmark artifact for the parallel run.
- Paid is a deliberate human step. Payments go out through Melio manually (see §6); Swati then marks each payout paid, and the tool records the paid-on date and who marked it. Approved-but-unpaid payouts total to an "owed to partners" figure (the A/P side in F6).
F4 Quarterly true-up. For draw-type partners: drawn vs. earned side by side, bonus or carryforward computed automatically, full history of the carryforward chain.
F5 Partner dashboard (each attorney, own data only):
- Projected pay this month and how it was calculated: every number on a statement drills to its components in one click
- Collections over any selected period
- Their matters, including which they originated
- Their invoices with status and aging, filterable to past due
- Hours billed and unbilled work in progress
- Their own recorded expenses
F6 Owner/Admin dashboard. Firm-wide collections over time, per-partner production and payouts, origination breakdown (who's bringing in business), and accounts-receivable aging across the whole firm. Plus:
- Expenses by partner: monthly, filterable, shown next to that partner's aging invoices, so fronted costs and stale unpaid invoices are visible as a pair
- The Junto entity view: a monthly firm waterfall (total collected → expenses recovered → partner payouts → Junto's net) with month-over-month trend
- A/R and A/P side by side: client-invoice aging next to approved-but-unpaid payouts, so money owed to the firm and money owed to partners read end to end
- The firm-wide outstanding number as a monthly total with month-over-month trend, not just per-invoice aging
F7 Exceptions & review queue. Anything the system can't attribute with confidence is flagged for a human, never silently guessed:
- Payments not tied to a specific matter
- Clients with no (or ambiguous) originating attorney
- Invoice line items that can't be matched to a person
- Refunds or credits that need a clawback decision
- Payments not linked to any invoice: classified as trust or expense (F10); ambiguous ones flagged, never silently counted
- Records deleted in PracticePanther after they were counted
Every resolution is recorded, so there's an audit trail for how each dollar was attributed.
F8 Notifications.
- Email alert to the assigned partner when one of their invoices crosses an overdue threshold (defaults: 30 and 60 days; configurable)
- Digest email: each partner receives their own outstanding/overdue invoices; Owner and Admin receive the firm-wide version. Recipients, cadence, and lookback are configurable. Each invoice line carries client name, client email, invoice number, amount, and days past due, attached as PDF and CSV, formatted cleanly enough that Swati can drop it straight into Claude to draft follow-up emails. Invoice PDF links where the API allows (verified in week 1). Auto-drafting and auto-sending stay on the roadmap (§10).
- Matching badges and filters inside the dashboard
F9 Auth & user management. Secure email-based login. Owner invites users, assigns roles, deactivates departed users.
F10 Trust visibility. Trust money is shown, never counted: trust lines are labeled distinctly (client, matter, date, source) and excluded from "collected" until applied to an invoice.
- Detection: the payment's bank-account type (Trust vs. Operating) is the primary signal. The backstop is the heuristic Swati uses manually: every payment should link to an invoice, and one that doesn't is either trust or an expense. Ambiguous payments are flagged (F7), never silently counted.
- Trust balance by client, plus a firm total.
- Honest caveat: balances are derived, validated against PracticePanther during the first close or two, and provisional for the first month or two.
F11 Exports. Every table view exports CSV; payout statements and digests export CSV + PDF.
F12 Ask your numbers in Claude (Owner/Admin only). Shayn signs in with his dashboard account and asks questions in plain language: canned ones (a month's payout statement, A/R aging, a partner summary) plus open read-only queries. Answers come from the same curated reporting views that power the dashboard, statements, and digests, so they match the dashboard by construction. Partners don't get this in v1, by design: not until per-user scoping is built and tested, because today it would expose everyone's comp.
06Explicitly out of scope for v1
- Sending payments: Melio remains the manual last step, by choice; the paid toggle in F3 is the deliberate human verification step
- Replacing PracticePanther data entry: PP remains the system where time, invoices, and payments are recorded (see roadmap, §10)
- Client-facing anything
- QuickBooks and card-statement (Capital One) reconciliation: the v2 profitability work (§10)
- Auto-drafting or auto-sending client collection emails (roadmap, §10; v1 ships the data they'd be built from)
- Editing PracticePanther data from the dashboard
07What we need from Junto
API access: done (app created in Shayn's account, July 6)- Light data hygiene going forward:
- An "Originating Attorney" custom field on clients in PracticePanther; matters inherit it (origination follows the client relationship, per §8). We'll pre-fill it from the current "assigned to" convention for Swati to review, and it becomes part of new-client setup.
- Attach the matter to payments whenever possible when recording them.
- Swati to validate. One walkthrough of her current close process, then one month-end run in parallel: tool vs. her spreadsheet. Her numbers are the benchmark; payouts cut over only when the tool matches them. With legacy splits retired, the parallel run is pure new-split math on July collections.
- Swati marks payouts paid in the tool as the last step of each close, after paying through Melio (F3).
- During onboarding week (non-blocking): decide digest recipients, cadence, and lookback, and who owns collections follow-up. The tool makes all of these configurable.
08Decisions: settled July 10, 2026
Junto returned written answers to every open question in the July 7 draft, and a follow-up call on July 10 (Shayn, Swati, and Matt) settled the remaining scope. The largest change is subtractive: legacy splits are retired, which deletes the override engine entirely. This section is the record.
Answered in writing
- The 10% goes to the originating attorney even when someone else does the work. In Junto's words: "that's what keeps Junto's 40% intact." The worked examples in §4 stand exactly as written.
- Legacy splits are retired. "Old splits are not being considered anymore… All payments received now will be split as per new rule." Every payment received from July 1, 2026 onward splits at the current firm-wide rule, whatever the billing date (§4, Transition policy). This deleted real scope: no legacy-rate engine, no pre-May rate list, no legacy review flag.
- Origination follows the client relationship, not the matter. A new matter opened for a client another partner brought in keeps the 10% with the client's originating partner.
- Shayn's own originations get the standard 10%, shown as his own partner line, never folded into the firm's share.
- Only operating-account money counts as "collected." Trust is shown but excluded until applied to an invoice; trust deposits are client money until then.
- Payout effective date: the July 2026 close, run in parallel in early August, cutting over once the tool matches Swati's numbers.
- Partial payments: expenses reimbursed first, then pro-rata across the invoice's fee lines.
- Expenses: fully excluded from the split pool; the firm recovers 100%, and first.
- Refunds and write-offs: clawed back from the next payout, surfaced in the review queue.
Agreed on the July 10 call
- Payout paid status is a manual toggle (F3). Swati marks each payout paid after sending it through Melio: a deliberate human-in-the-loop verification step, chosen over another integration.
- Expenses-by-partner view (F6): a partner's fronted costs shown next to their aging invoices, so the firm can push collections or require retainers before fronting more.
- Junto is tracked as its own entity, like a partner: the 40% bucket plus expense recoveries, read as a monthly firm waterfall (F6), always separate from Shayn's personal lines (§4).
- Downloadable payout verification report per close (F3): every component behind every number, per partner plus firm roll-up. Trust, but verify.
- Collections follow-up: v1 ships the data, not the automation. Digests and exports carry client name, client email, invoice number, amount, and days past due in a clean, machine-friendly format (F8); auto-drafting and auto-sending are roadmap (§10).
- Trust balance view (F10), with an explicit accuracy caveat: balances are provisional for the first month or two, reconciled against PracticePanther during the first close or two.
- CSV export in v1 (F11): every table view; statements and digests also as PDF.
- Ask your numbers in Claude (F12): Owner/Admin only in v1; answers read from the same reporting views as every other surface.
- Confirmed as already in scope: invoice paid/unpaid status flips on the hourly sync (F1); the firm-wide outstanding number is a monthly total with month-over-month trend (F6); every payout number drills to its components one click deep ("Eugenia owed $3,000: show how it's calculated and where from").
Still open, deliberately: none of it blocks the build
- Analytics tags and dimensions (client / investor / fund, work type): post-v1; shapes the analytics layer (§10).
- Digest recipients, cadence, lookback, and who owns collections follow-up: Junto's internal call during onboarding week; the tool makes them configurable.
- Invoice-PDF pull into digests: a week-1 API feasibility check.
09Target timeline: dashboards live in 4–5 weeks
Every date here is a target, not a commitment: deliberately aggressive, and confirmed or revised at the end of week 1 once we've seen the live API.
| Week | Focus |
|---|---|
| 1 | Validate the live API (pagination, rate limits, payment semantics, verified up front rather than discovered in week 3); verify trust/bank-account semantics and payment-linkage rates against live data; invoice-PDF feasibility; data model; full backfill and continuous sync running. Timeline confirmed or revised at end of week 1. |
| 2 | Compensation engine + settings page; trust/unlinked-payment classification; Junto entity ledger; exception detection; login and roles |
| 3 | Partner and owner/admin dashboards; payout statements; payout verification report + paid toggle; review queue |
| 4–5 | Notifications + digest; expenses-by-partner and waterfall views; CSV exports; Claude connector; quarterly true-up view; trust reconciliation polish; partner onboarding |
| First close after the engine is live | Full parallel close (tool vs. Swati's spreadsheet), then corrections, and cutover once the numbers match and she trusts them |
Three honest calendar notes (kickoff July 13):
- Dashboards go live on sprint time (target: weeks 4–5); payout cutover goes live on calendar time. Closes happen at month-end. The goal is to parallel-run the July close in early August; sync (week 1) and the comp engine (week 2) are scheduled to be ready in time. If the live API or the first exception rate pushes that, the fallback is the August close in early September. Either way, cutover happens when the tool and Swati's spreadsheet agree, not before.
- The under-30-minutes close target depends on the exception rate the first parallel run reveals (Shayn's own estimate: payments tie out cleanly "90% of the time"). The first close calibrates it; the review queue is designed to drive it down month over month.
- Trust balances are validated during the parallel-close window and treated as provisional until reconciled against PracticePanther (F10).
10After v1: examples, not a roadmap
There is no committed month-by-month roadmap: priorities reset every sprint, and Shayn's list wins. The theme stays constant: find the tedious, manual, repetitive work in running the firm and hand it to software and AI. Candidates already visible:
- Analytics layer: tag-driven insights: where revenue comes from, which clients and work types pay best, per-client profitability
- Collections tooling: Claude-drafted client reminders built straight from the v1 digest exports (client, email, invoice, amount, days past due), then sent automatically: the workflow Shayn sketched on the call, automated end to end
- Profitability dashboard: QuickBooks and card statements (Capital One) reconciled against PracticePanther expenses, catching spend that never made it into PracticePanther (Delaware Secretary of State fees, for example); per-partner and per-client profitability
- QuickBooks payment matching: auto-verifying the payout paid toggle against money actually leaving the account
- Intake & document automation: engagement letters, new-matter setup, recurring document generation
- AI on the practice itself: first-pass trademark research memos, contract review summaries, drafting support: AI-prepared, attorney-finished
- Progressive PracticePanther replacement: time entry → invoicing → billing inside Junto's own system, retiring the ~$700/month PracticePanther spend. A real project rather than a feature, but the v1 database is designed as Junto's canonical schema (Appendix A), so this path extends the dashboard's foundation instead of restarting.
AAppendix A: Technical approach (context)
Modern web application: Next.js hosted on Vercel; Neon Postgres database (Junto-owned); Better Auth for login and roles; UI kit with recharts for visualization. Data ingestion runs on Vercel's durable workflows: backfill and incremental sync jobs against the PracticePanther API survive retries, rate limits, and long-running pagination. The database is designed as Junto's own canonical schema: PracticePanther is an importer that feeds it, not a template it mirrors. That keeps the door open to progressively replacing PracticePanther later (§10) by extending this system rather than starting over. A curated reporting layer encodes the comp logic once; the dashboard, payout statements, digests, and the Claude connector (F12) all read from it, so every surface shows identical numbers by construction, and the connector lives inside the same application behind the same login. The OAuth app is already created under Shayn's PracticePanther account. Client and billing data is encrypted in transit and at rest, lives only in Junto-owned accounts, and access stays limited to this engagement.
BAppendix B: Known PracticePanther API constraints and how we handle them
| Constraint | Handling |
|---|---|
| Payments are not linked to invoices in the API (only to account, sometimes matter) | Attribute collections via matter plus invoice paid-amount tracking between syncs (payments expose unapplied_amount, which bounds what's been applied); anything ambiguous goes to the review queue (F7) rather than being guessed. The same linkage signal feeds the trust/expense classifier (F10) |
| No native "originating attorney" field | "Originating Attorney" custom field at the client level, inherited by matters, + the hygiene process in §7; missing or ambiguous origination is flagged |
| Invoice line items name the biller as text, not a user ID | Worker attribution primarily via time entries (billed_by_user_ref is a real user ID); line-item text is a cross-check, with mismatches flagged for review |
| Trust vs. operating money (§8, decision 5: only operating money counts as collected) | payment.bank_account.type identifies Trust vs. Operating directly: the primary signal, with unapplied/unlinked payments as the backstop heuristic (F10); balances are provisional until reconciled over the first close(s) |
| No webhooks | Polling sync on updated_since cursors; hourly freshness target |
| Deletions invisible to incremental sync | Nightly full reconciliation sweep |
| Pagination and rate limits undocumented | Week-1 validation spike against the live API before the timeline is locked |