Junto Law · Comp & Collections Dashboard lever.is
Product requirements · PRD

Junto Law partner compensation & collections dashboard

Prepared by
Matt · Lever.is
For
Shayn · Junto Law
Date
July 11, 2026
Status
v1.0 · Agreed scope

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

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

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:

  1. Expenses are reimbursed to the firm first, 100%; they never enter the split pool ("that always goes back to us first")
  2. What remains is fee collection, split per the table above
  3. 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)

Configurability requirement

Comp is managed on a settings page, not in code:

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

07What we need from Junto

  1. API access: done (app created in Shayn's account, July 6)
  2. 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.
  3. 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.
  4. Swati marks payouts paid in the tool as the last step of each close, after paying through Melio (F3).
  5. 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

Nothing blocks the build

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

  1. 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.
  2. 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.
  3. 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.
  4. Shayn's own originations get the standard 10%, shown as his own partner line, never folded into the firm's share.
  5. Only operating-account money counts as "collected." Trust is shown but excluded until applied to an invoice; trust deposits are client money until then.
  6. Payout effective date: the July 2026 close, run in parallel in early August, cutting over once the tool matches Swati's numbers.
  7. Partial payments: expenses reimbursed first, then pro-rata across the invoice's fee lines.
  8. Expenses: fully excluded from the split pool; the firm recovers 100%, and first.
  9. Refunds and write-offs: clawed back from the next payout, surfaced in the review queue.

Agreed on the July 10 call

  1. 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.
  2. 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.
  3. 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).
  4. Downloadable payout verification report per close (F3): every component behind every number, per partner plus firm roll-up. Trust, but verify.
  5. 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).
  6. 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.
  7. CSV export in v1 (F11): every table view; statements and digests also as PDF.
  8. Ask your numbers in Claude (F12): Owner/Admin only in v1; answers read from the same reporting views as every other surface.
  9. 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

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):

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:

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