1 Create Schedule
2 View Detail
3 Manage Jobs
4 Complete Visit
5 History & Billing
Poster — Create Recurring Job
9:41
New Recurring Service
Service Type
Lawn Mowing & Maintenance
Frequency
Weekly
Bi-Weekly
Monthly
Quarterly
Custom
Preferred Day
Thursday
Preferred Time
9:00 AM
Estimated Duration
1 – 2 hours
Service Details
Front and back yard mowing, edging along walkways and driveway. Bag clippings and dispose. Trim hedges along fence line.
Assign Contractor
MG
Martinez Groundskeeping Past contractor • 4.9 rating
Auto-Pay Automatically charge after each visit

Visa ending in 4242

RecurringJobCreate — form with frequency chips, contractor selector

createRecurringJob mutation, useContractorHistory hook

Poster — Recurring Job Detail
9:41
Service Detail
Lawn Mowing Every 2 weeks • Thursdays 9:00 AM
Active
12 of 26 visits completed this season
MG
Martinez Groundskeeping Carlos Martinez
4.9 (47 visits)
Payment Summary
Per-visit rate $45.00
Season total paid $540.00
Auto-pay Enabled
Upcoming Visits
27 Feb
Thursday 9:00 AM
Scheduled
13 Mar
Thursday 9:00 AM
Scheduled
27 Mar
Thursday 9:00 AM
Scheduled

RecurringAgreementDetail — schedule card, contractor, upcoming instances

useRecurringAgreement, pauseAgreement, upcomingInstances query


Contractor — Recurring Jobs List
9:41
Recurring Services
Active 4
Pending
Completed
SD
Sarah Donovan 1247 Merriman Rd, Akron, OH
Active

Lawn Mowing Bi-Weekly
$45/visit
Next: Thu, Feb 27
JW
James Whitfield 892 Portage Path, Cuyahoga Falls, OH
Active

HVAC Service Quarterly
$180/visit
Next: Mon, Mar 15
RM
Rachel Morgan 456 W Market St, Akron, OH
Paused

Gutter Cleaning Monthly
$75/visit

ContractorRecurringScreen — FlatList with segmented filter tabs

listForContractor query, SegmentedControl, AgreementCard component

Contractor — Today's Instance
9:41
Service Visit
Lawn Mowing Confirmed
Visit #12 • Bi-Weekly Service
SD
Sarah Donovan 1247 Merriman Rd, Akron, OH 44303
Service Checklist
Mow front yard
Mow back yard
Edge walkways & driveway
Trim hedges along fence line
Bag and dispose clippings
Notes from Last Visit
Noticed brown patch near east side of front yard. Customer aware and watering more. Avoid mowing too short in that area.
Work Photos
Take before/after photos to document work Add Photos
Report an Issue

RecurringInstanceScreen — checklist, notes, photo upload

instances.get query, confirmInstance, startWork, completeInstance mutations

Contractor — Instance Completion
9:41
Complete Service
Lawn Mowing Thursday, February 27, 2026
Completed Items
Mow front yard
Mow back yard
Edge walkways & driveway
Trim hedges along fence line
Bag and dispose clippings
Before / After Photos
Before
After
Before
After
Work Notes
Completed full service. Brown patch on east side is improving. Mowed at 3.5 inch height as requested. Recommend reseeding in early spring.
Time spent 1 hr 15 min
Next visit auto-scheduled Thursday, March 13 at 9:00 AM

CompleteInstanceScreen — photo grid, notes, time entry

completeInstance mutation, MediaUpload component, generateUploadUrl


Poster — Recurring History
9:41
Visit History
Last 30 days Last 90 days All Time
Feb 13, 2026 Completed
CM
Carlos Martinez
$45.00
Jan 30, 2026 Completed
CM
Carlos Martinez
$45.00
Jan 16, 2026 Skipped
Skipped due to weather — heavy snowfall
Jan 2, 2026 Rescheduled
CM
Carlos Martinez
Moved to Jan 5 • Completed $45.00

RecurringHistoryScreen — timeline with status dots, filter chips

listForAgreement query (paginated), date range filter, InstanceRow component

Poster — Billing Summary
9:41
Recurring Billing
Monthly Spending
Sep
Oct
Nov
Dec
Jan
Feb
Feb 2026 $315.00
Breakdown by Service
Lawn Mowing 2 visits • $45/visit
$90.00
Gutter Cleaning 1 visit • $75/visit
$75.00
HVAC Quarterly 1 visit • $180/visit
$180.00
Auto-Pay
Status Active
Payment Method
Visa 4242

Upcoming Charges
Feb 27 — Lawn Mowing $45.00
Mar 15 — HVAC Service $180.00

RecurringBillingScreen — spending chart, service breakdown, auto-pay

billingForPoster query, Stripe PaymentMethod, listUpcomingCharges

Both — Schedule Conflict
9:41
Schedule Conflict
Scheduling Conflict Your contractor is unavailable for the next visit
Lawn Mowing Conflict
Thu, Feb 27 at 9:00 AM — Unavailable
Resolution Options
Reschedule This Visit Pick a new date and time with your contractor
Skip This Visit Next visit resumes on Mar 13 as scheduled
Find Substitute Request a substitute contractor for this visit
Available Substitutes
TL
Thompson Lawn Care
4.7 (32 jobs)
$50
GG
Green Grove Services
4.5 (19 jobs)
$48
Notification Preferences
Push notifications Alert when schedule changes
Email summary Weekly recap of upcoming visits

ScheduleConflictScreen — conflict banner, resolution options, substitutes

skipInstance, rescheduleInstance mutations, findSubstitutes query


Data Architecture

Schema

recurringServiceAgreements
  title: v.string()
  frequency: "weekly" | "biweekly" | "monthly" | "quarterly" | "custom"
  preferredDayOfWeek: v.optional(v.number())
  preferredTime: v.optional(v.string())
  posterId: v.id("posterUsers")
  contractorId: v.id("contractorUsers")
  pricePerOccurrence: v.number()
  status: "active" | "paused" | "completed" | "cancelled"
  autoPayEnabled: v.boolean()
  startDate / endDate: v.number()

recurringServiceInstances
  agreementId: v.id("recurringServiceAgreements")
  scheduledDate: v.number()
  status: "scheduled" | "confirmed" | "in_progress" | "completed" | "skipped"
  completionMedia: v.optional(v.array(...))
  completionNotes: v.optional(v.string())
  paymentStatus: v.optional(v.string())

Hooks & Queries

useRecurringJobs
  agreements.listForPoster({ status })
  agreements.listForContractor({ status })

useRecurringInstances
  instances.listUpcomingForPoster({ limit })
  instances.listForAgreement({ agreementId })
  instances.get({ instanceId })

agreements.get
  Returns: agreement, contractor,
  property, upcomingInstances,
  recentInstances

Mutations

createRecurringJob
  title, frequency, dayOfWeek,
  contractorId, price, autoPay

completeInstance
  instanceId, completionNotes,
  completionMedia[]

pauseSchedule / resume
  agreementId, reason?

skipInstance
  instanceId, reason

rescheduleInstance
  instanceId, newDate, newTime

Billing & Stripe

Auto-charge flow
  1. Instance completed
  2. Stripe PaymentIntent created
  3. Charge saved payment method
  4. Update instance paymentStatus

Fee structure
  platform fee deducted based on subscription tier
  40/60 payout split
  (same as one-time jobs)

Conflict resolution
  findSubstitutes query
  assignSubstitute mutation
Schedule & Calendar
9:41
Schedule & Calendar
Schedule Stats
18
Active
6
This Week
+3
New
$8.4K
Monthly
Active Schedules
Lawn Care — Adams
Weekly · Next: Mar 15
Active
Pool Service — Chen
Bi-weekly · Next: Mar 18
Active
Cleaning — Lopez
Monthly · Next: Apr 1
Paused
March 2026 Calendar
Calendar with scheduled visits
Job Management
9:41
Job Management
Schedule Details
Customer
Jennifer Adams
Service
Lawn Care — Full Service
Frequency
Every Monday, 9:00 AM
Automation
Auto-create visit
Send reminders
Auto-invoice
Visit History
Mar 8, 2026
Completed · Invoice #1247
Done
Mar 1, 2026
Completed · Invoice #1238
Done
Feb 22, 2026
Skipped · Rain
Skip
Recurring Jobs Dashboard
https://app.3bids.io/contractor/recurring
3Bids
Schedules ⌘1
Calendar ⌘2
Active Jobs ⌘3
History ⌘4
Analytics ⌘5
Settings ⌘6
MK
Mike Kowalski
Contractor
Settings ⌘,

Recurring Jobs Dashboard

18
Schedules
42
Monthly Visits
$8.4K
MRR
96%
Completion
Upcoming Today
Adams — Lawn Care, 9 AM
In 2 hours
Chen — Pool Service, 11 AM
In 4 hours
Lopez — Cleaning (paused)
Needs attention
Monthly Revenue Trend