Billing

Time tracking and billing

BopSuite's billing module turns time entries into invoices, and invoices into Stripe payments. Available on Practice plan and above.

Logging time

From any matter detail page → Time entries card → + Log time.

Each time entry needs:

  • Duration — in minutes (entered as 90 or 1.5 hours — both work)
  • Description — what you did (e.g., "Drafted demand letter, reviewed prior correspondence")
  • Billable / non-billable toggle
  • Hourly rate — defaults to null (use the inherited rate at invoice time); override per entry if needed
  • Date — defaults to today

Time entries are visible to all team members on the matter. They're not visible to the client.

Pro tip: log time as you do the work, not at month-end. The descriptions are sharper and clients reading itemized invoices appreciate the specificity. The Time Entries card on each matter is sortable by date so you can scan recent work quickly.

Why "is_billed?" isn't a column

You won't find an is_billed flag on time entries. That's intentional — "is this billed?" is computed by joining invoice_items.time_entry_id. Single source of truth: if a time entry shows up as a line item on a non-void invoice, it's billed.

This avoids the eternal data-integrity dance of "we updated the invoice but forgot to flip the flag" or "we voided the invoice but didn't unflip." Run the join, get the answer.

Building an invoice

From the matter → Invoices card → Create invoice from time entries.

You'll see all unbilled time entries pre-checked. Adjust:

  • Uncheck any you don't want billed yet
  • Add manual line items: flat fees ("Engagement fee — $1,500"), expenses, discounts (negative amount)
  • Set a due date (defaults to 30 days out)
  • Add an internal note (visible to firm only)

Click Save draft. The invoice is created with status draft — not sent yet, fully editable.

Sending the invoice

On the invoice detail page → Send invoice.

This:

  1. Generates a magic-link payment URL (/invoice/[token])
  2. Sends an email to the client with the link
  3. Flips status from draftsent
  4. Locks editing — you can void and re-create, but can't edit a sent invoice

The email includes:

  • Your firm's logo + accent color
  • Total + due date prominently
  • A "Pay now" button → magic-link payment page
  • Your custom message (if you wrote one)

What the client sees

The magic-link page (/invoice/[token]) is mobile-friendly and shows:

  • Itemized line items with descriptions
  • Total + due date
  • "Pay invoice" button → Stripe-hosted checkout

No login required. The link is single-purpose: pay this one invoice.

Stripe Connect requirement

Before invoices can be sent, your firm must complete Stripe Connect Express onboarding. Settings → Payments → "Connect Stripe."

Stripe walks you through ID verification + bank account linkage (~10 min). After that, your firm is the merchant of record on every payment — money lands directly in your bank, BopSuite is just the platform that built the invoice and surfaced the payment page.

Payment flow

When the client pays:

  1. Stripe processes the card (or ACH, depending on your Connect settings)
  2. Stripe webhook fires → BopSuite catches it → invoice status flips to paid, with paid_at stamped
  3. Client gets a receipt email from Stripe
  4. Firm gets an internal "Payment received" notification

The webhook is the source of truth. Even if a client refreshes the payment page right after paying, the status updates within a few seconds.

Overdue automation

Invoices with status sent whose due_date is in the past auto-flip to overdue once daily via the cron job. The matter shows the overdue invoice in red, the client gets a "your invoice is overdue" email, and your inbox count increments.

You can manually mark an invoice paid (e.g., if the client paid via wire transfer outside Stripe). On the invoice detail page → kebab menu → "Mark as paid externally."

Voiding

Invoices that haven't been paid can be voided from the invoice detail. Voided invoices stay in the database for audit purposes but don't count toward overdue stats.

You can't delete a paid invoice — that's a record-keeping requirement. Void or refund instead.

Application fee (you pay BopSuite)

BopSuite takes a small application fee on every Stripe Connect payment routed through the platform. Rate depends on your plan — Practice tier is around 1% on top of Stripe's standard processing fees, Firm tier is lower. See Settings → Billing for your rate.

This is how the platform sustains the Connect infrastructure. The client doesn't see it; it comes out of the firm's payout, post-Stripe-fees.

What's next

Was this helpful?

Email us at hello@bopsuite.com with feedback or suggestions.