Skip to main content
SHIPPING Q1 · 3 AI-NATIVE SaaS PRODUCTS300+ SALESFORCE PROJECTS DELIVERED15+ YEARS · TRUSTED IMPLEMENTATION PARTNERAI AGENTS · LLM · RAG · MLOPS · NOW HIRINGLIVE IN PRODUCTION ACROSS 3 INDUSTRIESSHIPPING Q1 · 3 AI-NATIVE SaaS PRODUCTS300+ SALESFORCE PROJECTS DELIVERED15+ YEARS · TRUSTED IMPLEMENTATION PARTNERAI AGENTS · LLM · RAG · MLOPS · NOW HIRINGLIVE IN PRODUCTION ACROSS 3 INDUSTRIES
Pro Trades Solutions logoprotradessolutions.com
Case Study · Skilled-Trades Staffing · SalesforceLive in production

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.

Skilled trades on a job site, representative imagery for the Pro Trade Solutions staffing platform
162
Custom Apex classes (~80 prod + ~80 test)
31
Lightning Web Components
30
Flows (record-triggered, screen, scheduled, event)
5
Experience Cloud sites
PlatformSalesforce (production org ptsProd) + Experience Cloud
01About the client

Industry: 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.

02The challenge

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.

Trades community and recruiting, the talent supply chain Pro Trade Solutions runs
Indeed + web form for applicant capture
Two parallel inboxes, manual copy/paste into Salesforce.
Spreadsheets for skills / licenses / certs
No structured search; expiry tracking was someone's calendar reminder.
Email + PDF for offer letters and contracts
Days-long signing cycles; no audit trail tied to a record.
QuickBooks Online for vendor / employee / invoicing
Double-entry between Salesforce and QB on every change.
QuickBooks Time (TSheets) for hours and payroll
Job codes maintained by hand; talent visibility to recruiters was indirect.
Phone / SMS / email for dispatch
No live view of who was actually available this week.
03The solution

Three surfaces, one custom data model.

01

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.

02

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.

03

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.

04The custom data model

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.

05Use cases

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.

Use case 01 · Inbound

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.

Use case 02 · Onboarding

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.

Use case 03 · Matching

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.

Use case 04 · QuickBooks Online (bi-directional)

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.

Use case 05 · QuickBooks Time

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).

Use case 06 · DocuSign embedded

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.

06Supporting capabilities

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.

07Automation patterns

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.

08Integrations

Nine integrations, each pulling its weight.

IntegrationMechanismRole
QuickBooks OnlineOAuth + webhooksCustomers, Vendors, Employees, Invoices, Estimates, Projects, all bi-directional.
QuickBooks Time (TSheets)REST APIUsers, Job Codes, Groups, Projects, Assignments, Timesheets, Time-Off Requests.
DocuSignEmbedded signingTwo environments (sandbox + live). Signed PDFs auto-attached to Contact.
Google PlacesAutocomplete JS APIValidated, geocoded addresses at every entry point.
Google Distance MatrixREST API + cacheTalent → jobsite distance / time. Cached per origin–destination.
IndeedEmail Services handlerParses Indeed-forwarded applicant emails into Leads.
Salesforce MapsManaged packageTerritory design, route optimization, live driver tracking.
360 SMS (Twilio)Managed packageSMS, voice, group chats, drip campaigns, AI conversation analysis.
GoTo WebinarConnectorLive training session registration + attendance tracking.
09Why this architecture matters

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.

10Build summary

What it took to ship.

The unmanaged inventory below excludes managed-package metadata. Custom-only, what we own, build, test, and maintain.

Dashboard view, representative of the internal staffing console
Component type#Notes
Custom Apex classes162~80 production + ~80 tests, organized by domain (QB_*, QBTime_*, Talent*, Community*)
Lightning Web Components31All custom-built, none from packages
Apex triggers5One per business object, handler pattern throughout
Flows30Mix of record-triggered, scheduled, screen, and platform-event flows
Custom objects~18PTS-specific (plus ~125 from managed packages)
Platform events2QB webhook, talent-match broadcast
Named credentials8DocuSign × 2 envs, QuickBooks × 4 envs, QB Time, QB GraphQL
Experience Cloud sites5Pro Trades portal, Marketing Landing Pages, ThankYou, MyStore, Service Messaging
Public Salesforce Sites11Including dedicated QB webhook receivers and Incoming SMS endpoint
Managed packages integrated3 majorSalesforce Maps, 360 SMS (Twilio), GoTo Webinar
Next step

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.