Pro Trade Solutions: A Salesforce-Native Talent Supply Chain
From a Google search to a signed contract, a synced QuickBooks payroll record, and an assigned project, all without anyone re-keying data.
A high-volume staffing model for skilled tradespeople (electricians, welders, technicians) rebuilt as a single operating system on Salesforce. Bi-directional QuickBooks sync, embedded DocuSign, real-time matching, talent-facing community portal. One source of truth for talent, orders, hours, pay, and territory.

ptsProd) + Experience CloudIndustry: Skilled-trades staffing and contractor placement.
Model: High-volume: skilled tradespeople are recruited, vetted, trained, contracted, dispatched to client job sites, tracked on the clock, and paid weekly.
Mandate: Make Salesforce the single operating system for the business, from the first inbound application to the weekly payroll run, while preserving QuickBooks as the system of record for accounting.
Six systems pretending to be one.
Before this build, the staffing pipeline lived across half a dozen disconnected tools. The result was double-entry between every system, slow contractor onboarding (days, not minutes), no real-time view of who was actually available this week, and constant reconciliation between Salesforce records and QuickBooks payroll.
Three surfaces, one custom data model.
Public marketing + capture layer
Branded landing pages with Web-to-Lead, Indeed inbox-to-Lead conversion, and a separate thank-you confirmation site. Cleaner than the stock Salesforce post-submit flow.
Talent community on Experience Cloud ("Pro Trades")
Where applicants self-register, complete a multi-step screening, capture skills / licenses / certs, watch orientation videos, sign their contractor agreement via embedded DocuSign, and manage availability and time-off after activation.
Internal staffing console
Lightning app for recruiters and dispatchers. Custom LWCs for talent matching, available-talent boards, project assignment, supervisor sync, QuickBooks sync status, and timesheet review.
A talent supply chain in 18 objects.
Every entity in the business is modeled natively so reports, automations, and integrations work without workarounds.
Talent profile
Contact extended with custom objects for Skill, Skill Assessment, Certification / Training, Licenses, Employment History, Industry Experience, Reference, Pre-Qualification, User Assessment Answer.
Client + project structure
Account → Account Projects → Project (the job site / scope of work). Supervisor Projects link the on-site supervisor to specific projects.
Orders + assignments
Order (the staffing request), Order Match (a candidate paired with an order), Order Assignment (a confirmed placement with start/end dates), Project Assignment (the talent's link to a specific project).
Operations
Time-Off Request (talent-submitted PTO, synced to QB Time) and Distance Matrix (cached Google Distance Matrix results, so route / commute cost is computed once per origin–destination pair).
Platform events
QB Webhook Event (receives QuickBooks change notifications) and Talent Match Update (broadcasts match changes to every open recruiter screen). Real-time fan-out, not polling.
How it works, six surfaces deep.
Each surface below earned its complexity. Skip what doesn't apply to your business; what remains is the architecture worth understanding.
From Indeed click to qualified Lead
Marketing landing pages hosted on a dedicated Experience Cloud site push into standard Web-to-Lead. LeadTrigger enriches and routes the record. A dedicated test class guards the W2L path specifically.
IndeedEmailHandler is an Email Services handler: when Indeed forwards a new applicant to a monitored inbox, the handler parses the email, extracts contact + resume metadata, and creates a Lead. No more copy-paste from the Indeed dashboard.
A separate Experience Cloud ThankYou site closes the loop with a branded post-submission page.
Self-service onboarding in the Pro Trades community
Converted Lead → Contact → community user (via CommunityUserCreator). A welcome flow sends a magic-link invite to the portal.
Once logged in, the talent walks through a stage-aware onboarding wizard built as a Lightning Web Component (`onboarding`) backed by OnboardingController. The wizard captures everything the staffing model needs to match the talent to a job.
Each step is its own LWC: googleAddressPicker for address auto-complete with geocoding, screeningProcess + screeningProfileTable + screeningIndExp for skills / preferences / pay expectations, license + cert capture with expiry tracking, work history and references, auto-served skill assessments scored per declared skill, orientation video player with completion tracking.
Contract signing is embedded: DocuSignService creates the envelope server-side, signatureLWC + SignatureCtrl render the signing ceremony inline. When the signed-doc event fires, automation flips the Contact's category, triggers the QuickBooks push, and notifies the recruiter.
Intelligent talent matching
Recruiters work from a custom matching console powered by TalentMatchingController. A Talent Match Update platform event broadcasts changes to every open recruiter screen in real time.
The matching engine considers: skill overlap between Order requirements and Contact Skill records, license / cert validity filtered against the order's date range, current Order Assignment end dates plus open Time-Off Requests for availability, and commute distance / time via GoogleMapsDistanceService (cached in Distance Matrix to avoid re-billing the same calculation).
Four purpose-built LWCs make up the recruiter workspace: availableTalents, availableTalentsInNext7Days, inProgressMatches, completedMatches. A one-click approveTalent action creates the Order Match → Order Assignment records, fires the placement flow, and triggers the QuickBooks Time job-code sync.
Operational truth in Salesforce, financial truth in QuickBooks
Outbound (Salesforce → QB) is a service per entity: QB_AccountService for clients → QB Customers, QB_ContractorService for 1099 contractors → QB Vendors, QB_EmployeeService for W2 talent → QB Employees, QB_OrderService for Order → QB Invoices / Estimates, QB_ProjectController for Project → QB Projects. Each pairs with Pull/Push Invocables so the same logic is reusable from flow buttons, record-triggered flows, and scheduled batches.
Inbound (QB → Salesforce) is webhook-driven, not polled. A public Salesforce Site (QuickBooksWebhookSite) exposes a REST endpoint. QuickBooksWebhookHandler validates the signature, parses the change, and publishes a QB Webhook Event platform event. A flow with QBWebhookInvocable Apex fans the change out to the right Contact / Account / Order. Changes made by accounting in QB appear in Salesforce within seconds.
Five named credentials cover dev / sandbox / two production rotations / GraphQL. An ApiCallout / ApiResponseWrapper layer abstracts every HTTP call so retries, logging, and test mocking work uniformly. A qbSyncStatus LWC sits on every key record page so users can see at a glance whether the record is in sync.
Hours, job codes, and payroll attribution
Salesforce owns the structure (who works on which project for whom); QB Time owns the clock. The QBTime_* namespace covers the round trip.
QBTime_UserService provisions every active talent as a QB Time user. QBTime_JobService + QBTime_GroupService keep every Account / Project mapped to a hierarchical QB Time job code. QBTime_AssignmentSyncController + Queueable push every confirmed placement so the talent sees the right job in their TSheets app the moment they're scheduled.
Supervisors are mapped via QBTime_SupervisorSyncQueueable for approval routing. Order placed-by attribution flows through QBTime_OrderPlacedBySyncQueueable so the recruiter who closed the order shows up on the timesheet record.
Timesheets pull back into Salesforce via QB_TimesheetService for review and dispute resolution. PTO submitted in the community pushes to QB Time so the schedule respects it. A master sync flow orchestrates everything; category-management flows keep the QB Time user category aligned with the talent's lifecycle state (active, on-assignment, off-board, rehire).
Contract signing inside the journey, not bolted on
Two environments are wired in (DocuSign sandbox and DocuSignLive production) so envelopes can be tested before going live.
DocuSignService programmatically creates envelopes and embeds talent profile data into template tabs, then returns an embedded signing URL. signatureLWC + SignatureCtrl render the signing ceremony inline. The talent never leaves the portal.
The Contact_Docusign_Doc_Signed flow listens for the completion callback, advances the talent's stage, attaches the signed PDF to the Contact, and triggers downstream QuickBooks employee / vendor creation.
Four more layers where automation pays for itself.
Google Places + Distance Matrix
googleAddressPicker LWC powers every address input. GoogleMapsDistanceService + GoogleDistanceResponse compute talent-to-jobsite distance and drive time, cached in Distance_Matrix__c keyed by origin+destination so the same pair is never billed twice.
Salesforce Maps
Maps managed package deployed for territory design, route optimization, and live driver tracking. Surfaced inside the internal console so dispatchers see open orders alongside available talent on the map.
360 SMS (Twilio)
Outbound SMS, voice messaging, group chats, drip campaigns, and inbound message ingestion via a public Incoming SMS Site. Surveys, scheduled messages, and AI conversation analysis round out the recruiter outreach surface.
GoTo Webinar
Connector for scheduled live training sessions. Talent register from the community, attendance is tracked back to the Contact, and completion feeds the certification record.
Three idiomatic Salesforce patterns, end to end.
Apex trigger + handler (one trigger per object)
LeadTrigger / OrderAssignmentTrigger / TimeOffRequestTrigger / AccountProjectsTrigger / SupervisorProjectsTrigger. Lead enrichment, assignment lifecycle, PTO push to QB Time.
Record-triggered + screen flows (30 unmanaged flows)
Onboarding stage advancement, QuickBooks push/pull orchestration, welcome emails, duplicate-name prevention, lifecycle category management.
Platform events (real-time fan-out)
QB Webhook Event for QuickBooks change notifications. Talent Match Update for live recruiter UI updates, no polling.
Nine integrations, each pulling its weight.
| Integration | Mechanism | Role |
|---|---|---|
| QuickBooks Online | OAuth + webhooks | Customers, Vendors, Employees, Invoices, Estimates, Projects, all bi-directional. |
| QuickBooks Time (TSheets) | REST API | Users, Job Codes, Groups, Projects, Assignments, Timesheets, Time-Off Requests. |
| DocuSign | Embedded signing | Two environments (sandbox + live). Signed PDFs auto-attached to Contact. |
| Google Places | Autocomplete JS API | Validated, geocoded addresses at every entry point. |
| Google Distance Matrix | REST API + cache | Talent → jobsite distance / time. Cached per origin–destination. |
| Indeed | Email Services handler | Parses Indeed-forwarded applicant emails into Leads. |
| Salesforce Maps | Managed package | Territory design, route optimization, live driver tracking. |
| 360 SMS (Twilio) | Managed package | SMS, voice, group chats, drip campaigns, AI conversation analysis. |
| GoTo Webinar | Connector | Live training session registration + attendance tracking. |
Five properties that change how the business runs.
Single source of truth, two systems of record
Operational truth in Salesforce; financial truth in QuickBooks. Bi-directional webhook + queueable sync keeps them aligned without picking a winner.
No double-entry, ever
Address auto-complete (Google), resume parsing (Indeed), document signing (DocuSign embedded), payroll provisioning (QB + QB Time), and territory mapping (Salesforce Maps) all push their output directly into Salesforce objects. Recruiters approve and act, they don't transcribe.
Talent-facing self-service
The community portal eliminates the most expensive part of staffing operations: recruiter-driven data collection. Talent enter their own profile, sign their own contract, request their own PTO, and view their own timesheets.
Real-time, not batch
Platform events for QB webhooks and talent-match updates mean recruiter screens reflect the world now, not at the next polling interval.
Test discipline
Every custom Apex class ships with a dedicated *Test class. ApiCalloutMock + QBTime_MockApiCallout make external integrations testable in isolation. ~80 production classes are paired with ~80 test classes.
What it took to ship.
The unmanaged inventory below excludes managed-package metadata. Custom-only, what we own, build, test, and maintain.
| Component type | # | Notes |
|---|---|---|
| Custom Apex classes | 162 | ~80 production + ~80 tests, organized by domain (QB_*, QBTime_*, Talent*, Community*) |
| Lightning Web Components | 31 | All custom-built, none from packages |
| Apex triggers | 5 | One per business object, handler pattern throughout |
| Flows | 30 | Mix of record-triggered, scheduled, screen, and platform-event flows |
| Custom objects | ~18 | PTS-specific (plus ~125 from managed packages) |
| Platform events | 2 | QB webhook, talent-match broadcast |
| Named credentials | 8 | DocuSign × 2 envs, QuickBooks × 4 envs, QB Time, QB GraphQL |
| Experience Cloud sites | 5 | Pro Trades portal, Marketing Landing Pages, ThankYou, MyStore, Service Messaging |
| Public Salesforce Sites | 11 | Including dedicated QB webhook receivers and Incoming SMS endpoint |
| Managed packages integrated | 3 major | Salesforce Maps, 360 SMS (Twilio), GoTo Webinar |
Salesforce engineering
How we approach Salesforce builds, from data model design to integrations to test discipline.
Salesforce integration
Webhook-driven, bi-directional integrations like the QuickBooks layer in this case study.
GetLogan: Trucking Insurance CRM
Another platform build with the same engineering discipline, applied to a different vertical.
Running a staffing operation on six disconnected tools?
We build Salesforce platforms like this one for talent supply chain, field operations, or anywhere accounting, time tracking, and operations have to act like one system. Start a conversation and we'll tell you honestly whether Salesforce is the right fit.