Contract Builder POSTER
9:41

Create Contract

Job Summary
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
Plumbing
Selected Contractor
MR
Mike's Reliable Plumbing
4.8 (127 reviews)
Agreed Terms
Bid Amount$4,200.00
Estimated Duration3 days
Start DateMar 5, 2026
Materials IncludedYes
Permits IncludedYes
Scope of Work
Remove existing sink and faucet, install new undermount stainless steel sink with new Delta pull-down faucet, including all supply lines and P-trap...

ContractBuilder screen. Uses useMutation(api.contracts.contracts.generate) via internal trigger from acceptBid.

Contract Preview POSTER
9:42

Review Contract

SERVICE AGREEMENT

February 24, 2026

PARTIES

Contractor: Mike's Reliable Plumbing
License #PLB-2024-0847
Phone: (330) 555-0192
Homeowner: Sarah Johnson
Phone: (330) 555-0341

SCOPE OF WORK

Remove existing sink and faucet. Install new undermount stainless steel sink with Delta pull-down faucet including all supply lines and P-trap.

PAYMENT TERMS

Total: $4,200.00
Escrow funded before work begins. 40% released after 24h hold, 60% upon completion.

CANCELLATION

Either party may void prior to full execution. After funding, cancellation triggers admin mediation.
SIGNATURES
Contractor signature pending
Homeowner signature pending

ContractDocument component renders markdown. Contract status: pending_contractor. Sent via notification + alert.

Contract Received CONTRACTOR
10:15

Contract

New Contract Ready
Review and sign to proceed
Contract Summary
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
Contract Amount$4,200.00
Duration3 days
Start DateMar 5, 2026
Key Terms
Materials and permits included in bid
Escrow-protected payment via Stripe
40% payout after 24h hold, 60% on completion
8.5% platform fee deducted from payout

ContractDetailScreen for contractor. Uses useQuery(api.contracts.contracts.get). Status: pending_contractor.

Contract Signing CONTRACTOR
10:18

Sign Contract

SERVICE AGREEMENT

Full contract text is scrollable. Includes all sections: Parties, Scope, Payment Terms, Timeline, Cancellation Policy, and Platform Addendum with escrow details.
Total: $4,200.00
Platform Fee: 8.5% ($357.00)
Your Net: $3,843.00
1st Payout (40%): $1,537.20
2nd Payout (60%): $2,305.80
This contract was generated through 3Bids.io
DocuSeal Integration
Signatures are legally binding with IP logging and timestamps.
Your Signature
Draw your signature here
I have read and agree to all terms of this service agreement and platform addendum

SignaturePad modal + ContractDocument. Calls signAsContractor mutation. IP via useClientIp.

Fully Executed BOTH
2:30

Contract Signed

Signatures
Contractor
Mike's Reliable Plumbing
Signed
Homeowner
Sarah Johnson
Signed
Status
Fully Executed
ExecutedFeb 24, 2026 at 2:28 PM
Contract Amount$4,200.00
NEXT STEP (POSTER)
NEXT STEP (CONTRACTOR)
Awaiting Escrow Funding

Shared ContractDetailScreen. Status: fully_executed. Job transitions to pending_funding. PDF via getContractPdfUrl.

Fund Escrow POSTER
2:35

Fund Escrow

Kitchen Sink & Faucet Replacement
Contract #CTR-2026-0483
Contract Amount$4,200.00
Platform Fee (included)Deducted from contractor payout
Total to Fund$4,200.00
Payment Method
Visa ending in 4242
Expires 08/2028
Chase Checking ****6789
ACH Transfer
Add Payment Method
Stripe Escrow
Payments secured by Stripe. Funds held in escrow until work is approved.

FundEscrow screen. Calls createPaymentIntent then escrow.fund. Stripe Elements for card input.

Escrow Dashboard POSTER
3:00

Escrow Status

AMOUNT IN ESCROW
$4,200.00
24h Hold Active
Payment Timeline
Funded
Feb 24, 2026 — 2:36 PM
24h Hold Period
Ends Feb 25 at 2:36 PM
Work Begins
1st payout (40%): $1,537.20
First Payout Sent
$1,537.20 to contractor
Work Completed
Pending your approval
Final Release
2nd payout (60%): $2,305.80
Breakdown
Total Funded$4,200.00
Platform Fee (8.5%)$357.00
Contractor Net$3,843.00
Released$0.00
Remaining$4,200.00

EscrowDashboard. Uses useQuery(api.payments.escrow.getForJob). Escrow status: hold_period.

Payment Timeline CONTRACTOR
3:15

Payment Schedule

YOUR TOTAL PAYOUT
$3,843.00
After 8.5% platform fee ($357.00)
1st Payout (40%)
$1,537.20
After 24h hold
2nd Payout (60%)
$2,305.80
On completion
Payout Status
Escrow Funded
Feb 24 at 2:36 PM
24h Hold Period
16h 21m remaining
1st Payout — $1,537.20
Estimated: Feb 25
Final Payout — $2,305.80
After completion approval
Payout Destination
Huntington Bank ****3821
Checking · Stripe Connect

PaymentTimeline. Uses getForJob + calculatePayouts from financial.ts. Bank via Stripe Connect.

Mark Complete CONTRACTOR
4:45

Submit Completion

Completion Photos
4 of 10 photos uploaded. Show final results.
Scope Checklist
Old sink and faucet removed
New undermount sink installed
Delta pull-down faucet installed
Supply lines and P-trap connected
Leak test completed — no issues
Completion Notes
All work completed per scope. Replaced corroded shut-off valves at no additional charge. Customer should run water for 2 minutes before first use to clear any debris.

CompletionForm. Calls requestCompletion mutation. Job: in_progress → pending_completion.

Release Payment POSTER
5:10

Review Completion

Completion Photos
Contractor's Notes
All work completed per scope. Replaced corroded shut-off valves at no additional charge. Run water for 2 minutes before first use.
Scope Verified
Old sink and faucet removed
New undermount sink installed
Delta pull-down faucet installed
Supply lines and P-trap connected
Leak test passed
Rate This Contractor
Excellent work! Very professional, cleaned up after themselves, and even replaced old valves for free. Highly recommend.
Final Payout
$2,305.80

CompletionReview. Calls approveCompletion + submitReview. Escrow: first_payout_sent → released.

Build & Preview Contract
9:41

Create Contract

Plumbing
Job Summary
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
Selected Contractor
MR
Mike's Reliable Plumbing
4.8 (127 reviews)
Agreed Terms
Bid Amount$4,200.00
Duration3 days
Start DateMar 5, 2026
MaterialsIncluded
PermitsIncluded
Scope of Work
Remove existing sink and faucet, install new undermount stainless steel sink with new Delta pull-down faucet, including all supply lines and P-trap...
Live Preview

SERVICE AGREEMENT

February 24, 2026

PARTIES

Contractor: Mike's Reliable Plumbing
License #PLB-2024-0847
Phone: (330) 555-0192
Homeowner: Sarah Johnson
Phone: (330) 555-0341

SCOPE OF WORK

Remove existing sink and faucet. Install new undermount stainless steel sink with Delta pull-down faucet including all supply lines and P-trap.

PAYMENT TERMS

Total: $4,200.00
Escrow funded before work begins. 40% released after 24h hold, 60% upon completion.

CANCELLATION

Either party may void prior to full execution. After funding, cancellation triggers admin mediation.
SIGNATURES
Contractor signature pending
Homeowner signature pending

Review & Sign Contract
10:15

Sign Contract

Action Required
New Contract Ready
Review and sign to proceed
Contract Summary
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
Contract Amount$4,200.00
Duration3 days
Start DateMar 5, 2026
Key Terms
Materials and permits included in bid
Escrow-protected payment via Stripe
40% payout after 24h hold, 60% on completion
8.5% platform fee deducted from payout
Your Payout Breakdown
Contract Amount$4,200.00
Platform Fee (8.5%)-$357.00
1st Payout (40%)$1,537.20
2nd Payout (60%)$2,305.80
Your Net$3,843.00
Signing Area

SERVICE AGREEMENT

Full contract text is scrollable. Includes all sections: Parties, Scope, Payment Terms, Timeline, Cancellation Policy, and Platform Addendum with escrow details.
Total: $4,200.00
Platform Fee: 8.5% ($357.00)
Your Net: $3,843.00
1st Payout (40%): $1,537.20
2nd Payout (60%): $2,305.80
This contract was generated through 3Bids.io
DocuSeal Integration
Signatures are legally binding with IP logging and timestamps.
Your Signature
Draw your signature here
I have read and agree to all terms of this service agreement and platform addendum

Fully Executed Contract
2:30

Contract Signed

Fully Executed
Signatures
Contractor
Mike's Reliable Plumbing
Signed
Homeowner
Sarah Johnson
Signed
Details
ExecutedFeb 24, 2026
Amount$4,200.00
Contract#CTR-2026-0483
Next Steps
POSTER
CONTRACTOR
Awaiting Funding

Fund & Track Escrow
2:35

Escrow Management

24h Hold
Kitchen Sink & Faucet Replacement
Contract #CTR-2026-0483
Contract Amount$4,200.00
Platform FeeDeducted from contractor
Total to Fund$4,200.00
Payment Method
Visa ending in 4242
Expires 08/2028
Chase Checking ****6789
ACH Transfer
Stripe Escrow
Payments secured by Stripe. Funds held in escrow until work is approved.
AMOUNT IN ESCROW
$4,200.00
24h Hold Active
Payment Timeline
Funded
Feb 24 — 2:36 PM
24h Hold Period
Ends Feb 25 at 2:36 PM
Work Begins
1st payout: $1,537.20
Completed
Pending approval
Final Release
2nd payout: $2,305.80
Breakdown
Total Funded$4,200.00
Platform Fee (8.5%)$357.00
Contractor Net$3,843.00
Released$0.00
Remaining$4,200.00

Submit & Review Completion
4:45

Completion Review

Pending Approval
Contractor Submission CONTRACTOR
Completion Photos
4 of 10 photos uploaded
Scope Checklist
Old sink and faucet removed
New undermount sink installed
Delta pull-down faucet installed
Supply lines and P-trap connected
Leak test completed — no issues
Completion Notes
All work completed per scope. Replaced corroded shut-off valves at no additional charge. Customer should run water for 2 minutes before first use.
Homeowner Review POSTER
Scope Verified
Old sink and faucet removed
New undermount sink installed
Delta pull-down faucet installed
Supply lines and P-trap connected
Leak test passed
Rate This Contractor
Excellent work! Very professional, cleaned up after themselves, and even replaced old valves for free. Highly recommend.
Final Payout
$2,305.80
1st Payout (40%)$1,537.20
2nd Payout (60%)$2,305.80
This releases the remaining 60% to the contractor via Stripe Connect.
Poster View — Build & Send POSTER
https://app.3bids.io/contracts/CTR-2847/build

Create Contract

Plumbing Draft
Job Details
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
MR
Mike's Reliable Plumbing
4.8 (127 reviews)
Agreed Terms
Bid Amount$4,200.00
Duration3 days
Start DateMar 5, 2026
MaterialsIncluded
PermitsIncluded
Scope of Work
Remove existing sink and faucet, install new undermount stainless steel sink with new Delta pull-down faucet, including all supply lines and P-trap...
Contract Preview

SERVICE AGREEMENT

February 24, 2026

PARTIES

Contractor: Mike's Reliable Plumbing
License #PLB-2024-0847 · Phone: (330) 555-0192
Homeowner: Sarah Johnson · Phone: (330) 555-0341

SCOPE OF WORK

Remove existing sink and faucet. Install new undermount stainless steel sink with Delta pull-down faucet including all supply lines and P-trap.

PAYMENT TERMS

Total: $4,200.00
Escrow funded before work begins. 40% released after 24h hold, 60% upon completion.

CANCELLATION

Either party may void prior to full execution. After funding, cancellation triggers admin mediation.
SIGNATURES
Contractor signature pending
Homeowner signature pending
Contractor View — Review & Sign CONTRACTOR
https://app.3bids.io/contracts/CTR-2847/sign

Sign Contract

Action Required
New Contract Ready
Review and sign to proceed
Contract Summary
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
Contract$4,200.00
Platform Fee-$357.00
Your Net$3,843.00
Key Terms
Materials and permits included
Escrow-protected via Stripe
40/60 payout split
8.5% platform fee

SERVICE AGREEMENT

Full contract text scrollable. Includes Parties, Scope, Payment Terms, Timeline, Cancellation, Platform Addendum.
Total: $4,200.00 · Fee: 8.5% · Net: $3,843.00
1st (40%): $1,537.20 · 2nd (60%): $2,305.80
DocuSeal Integration
Signatures legally binding with IP logging and timestamps.
Your Signature
Draw your signature here
I have read and agree to all terms of this service agreement and platform addendum

Escrow Dashboard & Timeline POSTER
https://app.3bids.io/contracts/CTR-2847/escrow

Escrow Management

24h Hold Active CTR-2026-0483
In Escrow
$4,200.00
1st Payout (40%)
$1,537.20
After 24h hold
2nd Payout (60%)
$2,305.80
On completion
Platform Fee
$357.00
8.5% tier rate
Payment Timeline
Funded
Feb 24, 2026 — 2:36 PM
24h Hold Period
Ends Feb 25 at 2:36 PM · 16h remaining
Work Begins
1st payout released automatically
First Payout Sent
$1,537.20 to contractor
Work Completed
Pending your approval
Final Release
$2,305.80 to contractor
Payment Method
Visa ending in 4242
Charged Feb 24 at 2:35 PM
Financial Breakdown
Total Funded$4,200.00
Platform Fee (8.5%)$357.00
Contractor Net$3,843.00
1st Payout (40%)$1,537.20
2nd Payout (60%)$2,305.80
Released$0.00
Remaining in Escrow$4,200.00
Job Details
Kitchen Sink & Faucet Replacement
1847 Brookfield Dr, Akron, OH 44313
MR
Mike's Reliable Plumbing
Contractor · Licensed & Insured
Verified
Stripe Escrow
All payments secured by Stripe. Funds held in escrow and released according to the payment schedule.

Payment Released & Complete BOTH
https://app.3bids.io/contracts/CTR-2847/complete

Transaction Complete

All Funds Released
Total Paid
$4,200.00
Contractor Net
$3,843.00
Rating
5.0
Payment Receipt
Contract Amount$4,200.00
Platform Fee (8.5%)$357.00
Contractor Net$3,843.00
1st Payout (40%)$1,537.20
2nd Payout (60%)$2,305.80
Total Released$3,843.00
Signatures
Contractor
Mike's Reliable Plumbing
Signed
Homeowner
Sarah Johnson
Signed
Contractor's Review
All work completed per scope. Replaced corroded shut-off valves at no additional charge. Customer should run water for 2 minutes before first use to clear any debris.
Completion Photos

Data Architecture

Schema

contracts

jobId: Id<jobs> bidId: Id<jobBids> posterId: Id<posterUsers> contractorId: Id<contractorUsers> status: pending_contractor | pending_poster | fully_executed | voided contractContent: string (markdown) platformAddendum: string contractorSignature: {signatureImage, signedAt, ipAddress, userAgent} posterSignature: {signatureImage, signedAt, ipAddress, userAgent} fullyExecutedAt: number?

escrow

jobId: Id<jobs> status: pending | hold_period | funded | first_payout_pending | first_payout_sent | second_payout_pending | released | refunded | disputed totalBidAmount: number escrowBalance: number platformFee: number contractorNetAmount: number holdPeriodEndsAt: number? firstPayoutAmount/At: number? secondPayoutAmount/At: number?

jobs (relevant fields)

status: draft | open | pending_contract | pending_funding | in_progress | change_order | pending_completion | completed | cancelled | disputed contractorId: Id<contractorUsers>? totalBidAmount: number? completedAt: number?

Status Flows

Contract Flow

pending_contractorpending_posterfully_executed ↓ ↓ voided voided 7-day expiration auto-voids unsigned contracts

Escrow Flow

pendinghold_period (24h) → fundedfirst_payout_pendingfirst_payout_sentsecond_payout_pendingreleased Any stage can → disputed or refunded

Financial Model

Payout Calculation ($4,200 example)

Platform Fee: 8.5% = $357.00 Contractor Net: = $3,843.00 1st Payout: 40% = $1,537.20 (after 24h hold) 2nd Payout: 60% = $2,305.80 (after completion) Constants: PLATFORM_FEE_RATE=0.085, FIRST_PAYOUT_RATE=0.4 HOLD_PERIOD_MS = 24 * 60 * 60 * 1000

Security Measures

Optimistic locking (version field) TOCTOU race condition prevention Rate limiting on sign mutations Signature input validation (size + format) IP + User-Agent audit logging State machine transition validation Stripe webhook idempotency

Hooks & Integrations

Frontend Hooks

useQuery(api.contracts.contracts.get) useQuery(api.contracts.contracts.getForJob) useQuery(api.contracts.contracts.listForUser) useQuery(api.contracts.pdf.getContractPdfUrl) useQuery(api.payments.escrow.getForJob) useMutation(api.contracts.contracts.signAsContractor) useMutation(api.contracts.contracts.signAsPoster) useMutation(api.contracts.contracts.voidContract) useMutation(api.payments.escrow.fund) useClientIp() — IP for signature audit

Integrations

Stripe: PaymentIntent, Transfers (Connect) createPaymentIntent → fund → webhooks createTransfer → payout to contractor bank DocuSeal: Signature capture + legal binding SignaturePad component (base64 PNG) Slack: Contract alerts sendContractGenerationFailedAlert sendContractExpiredAlert Scheduler: 7-day contract expiry 24h hold period expiry (processHoldPeriodExpiry)