1 Dashboard
2 Create
3 Detail
4 Payment
5 Recurring
6 Estimates
7 Expenses
8 Reports
Dashboard — Overview
9:41
Invoices
Outstanding
$4,280
3 invoices
Overdue
$1,750
1 invoice
Paid (Feb)
$12,450
8 invoices
Total Revenue
$67,830
YTD 2026
All
Draft
Sent
Overdue
Paid
SM
INV-2026-042
Sarah Mitchell · Kitchen Remodel
$2,400
SENT
JK
INV-2026-038
James Kowalski · Roof Repair
$1,750
OVERDUE
AB
INV-2026-037
Angela Briggs · Bathroom Tile
$3,200
PAID
TH
INV-2026-043
Tom Henderson · Deck Staining
$880
DRAFT

InvoiceDashboard component with stat tiles and filterable list

useQuery(api.billing.invoices.list) · useMemo for filter


Create — Form
9:41
New Invoice
Link to Job
Kitchen Remodel — Sarah Mitchell
Auto-PopulatedLine items pulled from your pricebook for this job.
Sarah Mitchell
sarah.mitchell@email.com · (330) 555-0142
1247 Oak Valley Dr, Akron, OH 44313
Line Items
Cabinet Installation
8 units × $175.00
$1,400.00
Countertop — Quartz
32 sq ft × $22.00
$704.00
Plumbing Rough-In
1 × $296.00
$296.00
Subtotal$2,400.00
Tax (7.25%)$174.00
Discount−$0.00
Total$2,574.00
Payment Terms
Apply Sales Tax
Notes / Memo

InvoiceCreateForm — job selector auto-fills customer + line items

useMutation(api.billing.invoices.create) · pricebook lookup


Detail — Full View
9:41
INV-2026-042
Invoice
INV-2026-042
SENT
Issued
Feb 10, 2026
Due
Mar 12, 2026
Bill To
Sarah Mitchell
1247 Oak Valley Dr
Akron, OH 44313
sarah.mitchell@email.com
Items
Cabinet Installation
8 × $175.00
$1,400.00
Countertop — Quartz
32 sq ft × $22.00
$704.00
Plumbing Rough-In
1 × $296.00
$296.00
Subtotal$2,400.00
Tax (7.25%)$174.00
Total Due$2,574.00
Payment Timeline
Invoice Created
Feb 10, 2026 · 2:15 PM
Sent to Customer
Feb 10, 2026 · 2:16 PM
Viewed by Customer
Feb 11, 2026 · 9:03 AM
Awaiting Payment
Due Mar 12, 2026
Remind
Record
Copy
Void

InvoiceDetail — full invoice with payment timeline and actions

useQuery(api.billing.invoices.getById) · Stripe payment link


Payment — Record
9:41
Record Payment
Invoice
INV-2026-042
Total Due
$2,574.00
Payment Amount
Remaining balance: $1,287.00
Payment Method
Cash
Check
Card
Transfer
Zelle
Payment Date
Reference / Check #
Payment Notes

PaymentRecordForm — partial payments with remaining balance

useMutation(api.billing.payments.record) · balance recalculation


Recurring — Templates
9:41
Recurring
C
Lawn Maintenance — Carter
$150.00 · Next: Mar 1, 2026
WEEKLY
B
HVAC Service Plan — Briggs
$89.00 · Next: Mar 15, 2026
MONTHLY
P
Gutter Cleaning — Park
$275.00 · Next: Apr 1, 2026
QUARTERLY
K
Snow Removal — Kowalski
$200.00 · Next: Mar 1, 2026
MONTHLY
Recurring Revenue
Monthly
$1,039
Active
3
Paused
1

RecurringInvoiceList — active/paused toggles with revenue summary

useQuery(api.billing.recurring.list) · useMutation(api.billing.recurring.toggle)


Estimates — List
9:41
Estimates
All
Draft
Sent
Accepted
Declined
DP
EST-2026-019
David Park · Fence Installation
$3,850
ACCEPTED
MC
EST-2026-021
Maria Chen · Bathroom Remodel
$7,200
SENT
RW
EST-2026-018
Robert Walsh · Driveway Repair
$2,100
DECLINED
LT
EST-2026-022
Lisa Torres · Window Replacement
$4,500
DRAFT
Estimate vs Actual
Fence — Park
Est: $3,850 Act: $3,720
3.4% under estimate

EstimateList — status filters with one-tap convert to invoice

useQuery(api.billing.estimates.list) · convertToInvoice mutation


Expenses — Overview
9:41
Expenses
By Category
Materials
$2,340
Fuel
$892
Tools
$710
Permits
$485
Other
$405
Recent Expenses
Home Depot — Lumber
Materials · Deck Build — Henderson
$342.18
RECEIPT
Shell Gas Station
Fuel · 42.3 miles · Feb 23
$67.40
Summit County — Permit
Permits · Kitchen Remodel — Mitchell
$185.00
RECEIPT
Mileage Tracker
GPS ON
This Month
847 mi
Deduction
$564.26
IRS rate: $0.67/mile · Auto-tracking enabled

ExpenseTracker — receipt scanning, categories, mileage GPS

useQuery(api.billing.expenses.list) · Clearbit Logo API for vendor icons, fallback to category IconCircle


Reports — Overview
9:41
Reports
Week
Month
Quarter
Year
Revenue
Bar Line
JulAugSepOctNovDecJanFeb
Feb Revenue
$12,450
vs Last Month
+18.3%
Accounts Receivable Aging
Current
$2,530
30-60d
$1,750
60-90d
$0
Top Customers by Revenue
SM
Sarah Mitchell
4 invoices · Kitchen Remodel, Bathroom
$8,740
DP
David Park
3 invoices · Fence, Gutter Cleaning
$6,280
AB
Angela Briggs
2 invoices · HVAC, Bathroom
$5,450
Tax Summary (YTD)
Total Revenue$67,830
Total Expenses$28,412
Mileage Deductions−$3,840
Net Profit$35,578
Estimated quarterly tax: $8,895 · Due Apr 15, 2026

FinancialReports — revenue charts, AR aging, tax summary

useQuery(api.billing.reports.summary) · useQuery(api.billing.reports.topCustomers)


Data Architecture

Screen Components

// Invoice flow
InvoiceDashboard → app/(contractor)/billing/index.tsx
InvoiceCreateForm → app/(contractor)/billing/create.tsx
InvoiceDetail → app/(contractor)/billing/[id].tsx
PaymentRecordForm → app/(contractor)/billing/record-payment.tsx

// Supporting screens
RecurringInvoiceList → app/(contractor)/billing/recurring.tsx
EstimateList → app/(contractor)/billing/estimates.tsx
ExpenseTracker → app/(contractor)/billing/expenses.tsx
FinancialReports → app/(contractor)/billing/reports.tsx

Convex Queries & Mutations

// Invoice CRUD
api.billing.invoices.list
  args: { status?: string, limit?: number }
  returns: Invoice[]
api.billing.invoices.getById
api.billing.invoices.create
api.billing.invoices.send
api.billing.invoices.void

// Payments
api.billing.payments.record
api.billing.payments.listByInvoice

// Estimates & Recurring
api.billing.estimates.list
api.billing.estimates.convertToInvoice
api.billing.recurring.list
api.billing.recurring.toggle

// Expenses & Reports
api.billing.expenses.list
api.billing.expenses.create
api.billing.reports.summary
api.billing.reports.topCustomers

Key Types

InvoiceStatus =
  'draft' | 'sent' | 'viewed'
  | 'overdue' | 'partial' | 'paid' | 'void'

EstimateStatus =
  'draft' | 'sent' | 'accepted' | 'declined'

PaymentMethod =
  'cash' | 'check' | 'card'
  | 'transfer' | 'zelle'

RecurringFrequency =
  'weekly' | 'monthly' | 'quarterly'

ExpenseCategory =
  'materials' | 'fuel' | 'tools'
  | 'permits' | 'subcontractor' | 'other'

Schema Tables

invoices {
  contractorId: Id<contractorUsers>
  jobId?: Id<jobs>
  customerId: Id<posterUsers>
  invoiceNumber: string
  status: InvoiceStatus
  lineItems: LineItem[]
  subtotal: number
  taxRate: number
  discount: number
  total: number
  paymentTerms: string
  dueDate: number
  stripePaymentLink?: string
}

expenses {
  contractorId: Id<contractorUsers>
  jobId?: Id<jobs>
  category: ExpenseCategory
  amount: number
  receiptUrl?: string
  vendor: string
  mileage?: number
}
3bids.io — Billing & Invoicing Prototype — Feb 2026
Invoices & Payments
9:41
Invoices & Payments
Recent Invoices
$42.8K
This Month
$12.4K
Outstanding
94%
Collection
3.2d
Avg Pay Time
Recent Invoices
INV-2847 — Johnson Roof
$4,250.00 — Due Mar 15
Paid
INV-2846 — Davis Siding
$8,100.00 — Due Mar 20
Sent
INV-2845 — Chen Gutters
$2,350.00 — Overdue
Overdue
Estimates & Expenses
9:41
Estimates & Expenses
Details
Title
Kitchen Remodel Estimate #1042
Description
Demolition, cabinetry, countertops, and plumbing rough-in.
Configuration
Auto-Send Receipts
Late Fee Reminders
Preview
Invoice Preview
Itemized line items with labor, materials, tax, and payment terms.
Performance
94%
Paid Rate
+15%
Revenue
$18K
Outstanding
Billing Dashboard
https://app.3bids.io/contractor/billing
3Bids
Invoices ⌘1
Payments ⌘2
Estimates ⌘3
Expenses ⌘4
Reports ⌘5
MK
Mike Kowalski
Contractor
Settings ⌘,

Billing Dashboard

$184.5K
Total Revenue
$24.8K
Outstanding
96%
Collection Rate
2.8d
Avg Pay Time
Recent Activity
INV-2847 — Johnson Roof
$4,250.00 — Due Mar 15
INV-2846 — Davis Siding
$8,100.00 — Due Mar 20
INV-2845 — Chen Gutters
$2,350.00 — Overdue
Performance