Context
Why minimize Jobber users?
Jobber charges per user. As PSS grows — adding techs across restoration, cleaning, and janitorial — every person who needs daily job access adds a seat. The goal is to build PSS's own field operations layer that field staff use daily, so only the owner (Clayton) and potentially one bookkeeper/billing role need Jobber access. Everything else — job creation, field notes, scheduling, photos, drying documentation — runs on the PSS stack.
Current State
What Jobber is used for today — and what's already replaced
| Jobber Function | Who Uses It | PSS Dashboard Alternative | Status |
| Job creation | Alexis, Clayton |
First Response Intake Tool → POST /jobs → KV |
✓ Built |
| View today's jobs | Alexis |
Dashboard → Tech View → Today's Jobs |
✓ Built |
| Drying documentation | Alexis |
Drying Documentation System v3 (S500 compliant) |
✓ Built |
| Job photos | Alexis |
Dashboard → Job Photos (localStorage + API sync) |
✓ Built |
| Add job notes / field updates | Alexis |
Dashboard → Job Notes (built today, PUT /jobs/:id) |
✓ Built — today |
| Schedule visibility | Alexis, Clayton |
Dashboard → Schedule (week view, built today) |
✓ Built — today |
| Equipment deployment | Alexis, Clayton |
Dashboard → Equipment (localStorage state) |
✓ Built |
| Invoicing / billing | Clayton |
Invoice Builder — not yet built |
Phase 2 |
| Payment collection | Clayton |
Stripe integration — not yet built |
Phase 3 |
| Client portal / comms | Clayton |
Client status page — not yet built |
Phase 3 |
| Quote / estimate builder | Clayton |
Estimate tool — not yet built |
Phase 4 |
| Financial / P&L reporting | Clayton |
QuickBooks (keep) + PSS summary reports |
Jobber long-term |
User Count Trajectory
Reducing Jobber seats as each phase ships
Today
2
Jobber users
Clayton + Alexis
→
Phase 1 Complete
1
Jobber users
Clayton only
Alexis off Jobber
→
Phase 2 Complete
1
Jobber users
Clayton (billing only)
Full ops on PSS stack
→
Phase 3–4
0
Jobber users
Full PSS stack
At renewal decision
Key principle: Never force a hard cutover. Jobber and the PSS stack run in parallel. Jobber is reduced incrementally — one feature at a time — until it no longer justifies the seat cost. If invoicing and payments are solid in the PSS stack before the annual renewal, cancel. If not, renew at 1 user and continue building.
Build Roadmap
Four phases — each one removes Jobber dependency
✓
Phase 0 — Foundation Complete
Done · Field ops core running
Field tech (Alexis) has everything she needs to run a restoration job without touching Jobber: intake, drying docs, photos, equipment tracking, pre-job checklist, close-out workflow.
First Response Intake Tool
Full job creation form → POST /jobs → KV. Sends vertical, cat/class, safety flags, adjuster info.
Done
Drying Documentation System v3
IICRC S500 compliant. Psychrometrics, MC tracking, room map, export. Synced to API.
Done
Field Ops Dashboard
Owner + Tech roles. Today's jobs, drying visits due, equipment, photos, pre-job checklist, close-out.
Done
Demo vs Dry-in-Place Tool
S500 decision flowchart with XACT codes. 8-step interactive logic tree.
Done
Field Tech Guide
Mobile-first reference guide covering all PSS equipment, protocols, contacts.
Done
Cloudflare Worker + KV
API live at pss-drying-api.clay-d-reynolds.workers.dev. /jobs, /clients, /health endpoints.
Done
1
Phase 1 — Remove Alexis from Jobber
Now → Month 1 · Removes 1 Jobber seat
After Phase 1, Alexis has zero daily reason to open Jobber. All her job info, notes, schedule, and field workflows run entirely on the PSS stack.
Vertical Selector on Job Creation
✅ Built today. Drying docs new-job modal now has restoration / cleaning / janitorial dropdown. Filters dashboard correctly.
Built Today
Job Notes
✅ Built today. Per-job timestamped notes in dashboard → Job Notes view. Saves to job object via PUT /jobs/:id. Author tag (Clayton/Alexis).
Built Today
Functional Schedule — Week View
✅ Built today. 7-day week planner with draggable add blocks. Assign active jobs to date+time+tech. Stored in localStorage (pss_schedule).
Built Today
Schedule → API Sync
Move schedule data from localStorage into KV so both Clayton and Alexis see the same schedule on any device. Requires /schedule Worker endpoint.
Phase 1 Next
Push Notifications (optional)
When a new job is assigned to Alexis in the schedule, send a text/push via Zapier → Twilio. Wires ZAP_JOB_CREATED webhook.
Phase 1 Next
Zapier Zap 1 — Job Created
POST /jobs webhook → Jobber Create Job + CompanyCam Create Project. Eliminates manual Jobber job creation for both users.
Phase 1 Next
🔓
Phase 1 unlocks: Alexis removed from Jobber. She opens PSS dashboard for schedule, notes every job action in PSS (not Jobber), and never needs to create or look up jobs in Jobber. Clayton stays on Jobber for invoicing only.
2
Phase 2 — Invoice Builder + Stripe
Month 2–3 · Makes Jobber billing-only
PSS can generate and send invoices directly from job data. Clayton doesn't need Jobber for invoicing — he just uses it as a billing record system. Stripe handles payment collection.
Invoice Builder — Owner View
New "Invoices" view. Select a job → auto-fill client name, address, line items (labor, equipment, materials). Preview and export as PDF or email-ready HTML.
Phase 2
Invoice → Jobber Sync (Zapier)
Zap 2 already planned: job complete webhook → Jobber Find Job → Create Invoice. Wire ZAP_JOB_COMPLETE. For the transition period, invoices exist in both systems.
Phase 2
Stripe Payment Links
Generate a Stripe payment link per invoice. Attach to email summary. Customer clicks → pays online. No Jobber Payments needed.
Phase 2
Daily Job Summary Report
Zap 3: daily webhook → Google Sheets append. Auto-log all active jobs, visits completed, revenue in pipeline. Replaces Jobber activity reports.
Phase 2
Equipment → API (not just localStorage)
Move equipment state from pss_equip_state localStorage to a /jobs/:id/equipment API endpoint. Both Clayton and Alexis see live deployment status.
Phase 2
Photo → API Sync (Worker endpoint)
Build /jobs/:id/photos Worker endpoint. Photos currently silently fall back to localStorage. With this endpoint, photos sync and are visible on all devices.
Phase 2
🔓
Phase 2 unlocks: Jobber becomes billing-only for Clayton. He logs in once a week to review QuickBooks sync, not daily for operations. All day-to-day ops — scheduling, job notes, drying, invoicing — run on PSS stack.
3
Phase 3 — Client Portal + Quoting
Month 3–6 · Near-complete Jobber independence
Clients get a job-specific URL to view status, photos, and drying progress. Clayton can send estimates and convert them to jobs. At this point, evaluate whether to cancel Jobber at annual renewal.
Client Status Portal
Unique read-only URL per job (e.g. tools.peachstateservices.com/portal/job_xxx). Shows job status, drying progress, daily photos. No login required — link shared via SMS/email.
Phase 3
Estimate / Quote Builder
Build an estimate from scope notes captured in intake. Line items: demo, drying, equipment, labor. Convert accepted estimate to job with one click.
Phase 3
Email/SMS Job Updates (Automated)
Trigger daily drying update email to client from drying app day report. Send via Zapier + SendGrid or Twilio. Eliminates manual Jobber email sends.
Phase 3
PS Suites Worker + Dashboard
Separate Worker deployment for coworking vertical. Members, offices, billing, access codes. Does not require Jobber at all — clean-slate build.
Phase 3
🔓
Phase 3 unlocks: Annual renewal decision point. With invoicing, payments, quoting, and client portal built, PSS has everything Jobber offered. If Phase 3 is solid, cancel Jobber and redirect ~$100+/month to PSS infrastructure costs (~$0 on current Cloudflare free tier).
4
Phase 4 — Full Independence (Optional)
Month 6–12 · Scale with zero per-user cost
PSS can add field techs with zero additional software cost. The stack handles multi-tech scheduling, crew dispatch, and multi-vertical operations. Each new tech costs $0 to onboard to the PSS platform.
Multi-Tech Scheduling (Drag-Drop)
Full calendar with multiple techs. Drag jobs between days and techs. Crew dispatch with route optimization via Google Maps API.
Phase 4
Time Tracking + Job Costing
Tech clock-in/out per job. Labor cost against job record. Revenue vs. cost per job. Feeds QuickBooks via Zapier.
Phase 4
Recurring Janitorial Jobs
Set recurring schedule for commercial cleaning contracts. Auto-generate jobs weekly/monthly. Send completion notes + photos to building manager.
Phase 4
Document Signing (Certificate of Drying)
Auto-generate Certificate of Drying at job close with IICRC reference numbers, final readings, tech signature. Send via email with e-sign. Replaces Jobber job completion workflow.
Phase 4
Technical
Job object schema — current + additions per phase
The existing KV job object grows incrementally. No breaking changes to existing tools — all new fields are additive.
{
id: 'job_[timestamp]',
jobnum: '1042',
clientName: 'Smith, John',
addr: '123 Main St, Macon GA',
status: 'active' | 'complete',
vertical: 'restoration' | 'cleaning' | 'janitorial',
plan: { cat, lossClass, source, tech, dryDays, equip, ... },
humDays: [ ...psychrometric readings... ],
mcRows: [ ...moisture content points... ],
roomCards: [ ...room map cards... ],
intakeMeta: { safetyFlags, adjuster, insCarrier, ... },
notes: [ { id, ts, author, text } ],
invoice: { lineItems:[], total:0, status:'draft', stripeLink:'' },
timeTracking: [ { tech, clockIn, clockOut, notes } ],
portalToken: 'tok_[random]',
estimate: { lineItems:[], total:0, accepted:false, acceptedTs:null },
clientEmail: '',
clientSMS: '',
}
Worker endpoints to add per phase:
Phase 1: GET/PUT /schedule — move schedule from localStorage to KV
Phase 2: POST /jobs/:id/invoice, GET /jobs/:id/invoice, POST /jobs/:id/photos (already wired in dashboard, endpoint pending)
Phase 3: GET /portal/:token — public (no auth) client status read-only endpoint
All Worker changes deploy in <1 min via Cloudflare dashboard. No downtime.
Action Items
What to do right now
Immediate — this week
- Deploy the updated pss-drying-docs-v3.html and pss-field-ops-dashboard.html to Cloudflare Pages (drag-drop or CLI:
wrangler pages deploy)
- Configure custom domain: tools.peachstateservices.com → Cloudflare Pages → Custom Domains (5 min)
- Set up Cloudflare Access on tools subdomain — email PIN lock so only Clayton + Alexis can access
- Wire Zapier Zap 1 (ZAP_JOB_CREATED): new job webhook → Jobber Create Job. This way intake jobs auto-appear in Jobber and Clayton doesn't have to create them manually
- Submit LSA background check — highest priority paid marketing action per handoff doc
For Alexis, week of May 5: When she returns from Reets, walk her through the PSS dashboard Tech view. Show her: today's jobs, how to open the drying app, job notes (new — replaces Jobber notes), schedule view, pre-job checklist, close-out. The goal is she goes through her first real job without opening Jobber once.