Signal Dispatch
The conversion pipeline between your CRM and your ad platforms.
Connect ServiceTitan and other CRMs to Google Ads and Meta Ads — so booked jobs and closed-won revenue become bidding signals, with idempotency, consent gating, and a verifiable audit trail on every event.
The Problem
You're bidding against the wrong conversion.
The conversions that pay your bills live in your CRM — booked jobs, completed jobs, signed retainers, closed-won revenue. The conversions your bidding algorithm sees are form submits and page views. The gap between those two is where your media budget gets wasted.
Today
- ✕ Meta and Google bid toward form_submit — the cheapest, leakiest signal in your funnel.
- ✕ Booked jobs and revenue live in ServiceTitan, invisible to the algorithm.
- ✕ Zapier flows fire duplicate conversions and silently leak plaintext PII.
- ✕ When something breaks, no one notices until the spend has shifted to the wrong audience.
With Signal Dispatch
- ✓ Real revenue events become server-side bidding signals.
- ✓ Idempotent dispatch with HMAC-verified webhooks. Retries cost zero duplicate conversions.
- ✓ PII hashed at the boundary. Consent gating enforced per destination.
- ✓ A persisted receipt with the platform's authoritative receipt id for every event.
Bid against booked jobs.
Not form fills.
A Dispatch in Flight
ServiceTitan booking → Meta CAPI in < 2 seconds.
What actually happens when a tech books a job. End-to-end, signed, hashed, idempotent.
# 1. ServiceTitan posts a signed Job.Booked webhook
POST /api/webhooks/signal-ops/serviceTitan/{userId}/{propertyId}
X-ServiceTitan-Signature: sha256=ab12... (HMAC-verified, raw body)
→ 1 SignalEvent emitted: booked_job, value: 1250 USD
# 2. Lead enrichment recovers the originating click
identifiers: { gclid, fbc, fbp, hashedEmail, hashedPhone, ga4ClientId }
consent: { adUserData: granted, adPersonalization: granted }
# 3. Router selects destinations (per-event-type rules)
booked_job → [meta, ga4]
# 4. Dispatch (parallel, isolated error boundaries)
POST https://graph.facebook.com/v19.0/{pixel_id}/events
→ fbtrace_id: A1b2C3..., events_received: 1, executionStatus: accepted
POST https://www.google-analytics.com/mp/collect
→ 204 No Content, executionStatus: accepted
# 5. Receipts persisted to the property timeline
fixArtifacts: 2 records (kind: executable_adapter_run)
timelineEvents: 2 entries — visible in The Helm UI
idempotencyKeys: signal-ops:meta:{eventId}, signal-ops:ga4:{eventId}
Same payload re-delivered? Idempotency short-circuit. Consent revoked? Routing skips the destination. Meta returns a 4xx? Per-adapter error boundary — other adapters still dispatch.
The Operator View
Every dispatch, surfaced as a receipt.
Operators see every event — accepted, duplicate-prevented, or failed — alongside the audit history they already trust in The Helm.
Mock-up of the in-app dispatch panel. Live in The Helm UI alongside the existing Property Timeline.
How It Works
The Dispatch Loop.
Every event flowing through Signal Dispatch follows the same five steps — regardless of which CRM the event came from or which ad platform it's headed to.
CRM webhook → verified payload (HMAC + raw body)
Mapped to canonical SignalEvent + PII hashed
Per-event-type rules pick destination adapters
Server-side POST with idempotency
Receipt persisted to the property timeline
Signal Dispatch is the dispatch half of the Measurement Operations Engine. Pair it with the Measurement Operations API to detect, fix, and validate the upstream signal stack that feeds it.
Engineering Principles
Built like infrastructure, not a script.
The dispatch layer is what stands between "the algorithm trains on real revenue" and "the algorithm trains on garbage." We engineer it accordingly.
Idempotent by default
Every dispatch carries a deterministic idempotency key derived from event_id and adapter. The router refuses to fire the same conversion twice, even under webhook retry storms.
PII hashed at the boundary
Email, phone, and any other PII fields are SHA-256 hashed inside the adapter before they touch a logger or a network call. Plaintext PII never leaves the ingest layer.
Consent-aware routing
Routing rules respect Consent Mode v2 signal state per destination. Ad-platform dispatches gate on ad_user_data; analytics dispatches gate on analytics_storage. Conservative-by-default: unknown is treated as denied.
Receipts, not hopes
Every successful dispatch persists an ExecutableAdapterRunArtifact with the platform's authoritative receipt id (fbtrace_id, conversion_action_id, etc.). Forensic-grade audit trail for every signal sent.
Built on the OCI Framework
Every adapter implements the field contracts, validation tiers, and failure-mode handling defined in the OCI Signal Integrity Framework — our public reference for what production-grade Offline Conversion Integration looks like.
Reversible
A separate dispatch surface, not a rip-and-replace. Existing client-side gtag and Meta Pixel tags stay live. Signal Dispatch deduplicates against them via shared event_id and transaction_id. Turn it off and nothing breaks.
Destinations
Where your conversion signals land.
Each destination has its own field contract, identifier requirements, and quirks. Signal Dispatch encapsulates them so you don't have to.
Meta Conversions API
Server-side conversion events with hashed PII (em, ph), click identifiers (fbc, fbp), value, and consent state. Validated against Meta's 7-day event window before dispatch. Returns Meta's fbtrace_id as the platform receipt.
GA4 Measurement Protocol
Server-side hits to GA4 with the gtag client_id captured at lead origination, transaction_id deduplication, and full Consent Mode v2 signaling. Optional /debug/mp/collect cross-validation.
Google Ads Offline Conversions
GCLID-keyed offline conversion uploads tied to closed-won revenue. Preserves the bid-side feedback loop so Smart Bidding optimizes for booked jobs and qualified leads — not form submits.
Microsoft Ads UET
Server-side offline conversion uploads via the Microsoft Advertising API, keyed on msclkid. Restores attribution for the search budget that lives outside Google.
TikTok Events API
Server-side events with TikTok Click ID (ttclid) and hashed identifiers. Same dispatch contract, same idempotency guarantees, different destination.
LinkedIn CAPI
Conversions API for LinkedIn — high-value B2B offline conversions tied back to ad-served impressions. Prioritized when partner demand warrants.
Adapter prioritization is partner-driven. Need a destination not on this list? Talk to us — adapter scaffolding takes days, not quarters.
Sources
Where your conversion signals come from.
CRM, intake platform, call tracking, ITSM. Different schemas, different webhook conventions — all normalized to a single canonical event shape. See the full curated integration map →
ServiceTitan
Job.Booked, Job.Completed, Invoice.Paid webhook ingest. Lead enrichment lookup recovers gclid / fbc / fbp captured at the marketing landing page so dispatched events carry the originating click.
Lead Docket
Intake-to-signed lifecycle webhooks for personal injury, mass tort, and consumer law firms. Dispatches qualified-lead and signed-retainer events as conversion-grade signals.
Litify
Salesforce-native legal CRM. Matter creation, intake conversion, and case milestone events normalized into the canonical SignalEvent schema.
ServiceNow
Enterprise workflow events normalized for B2B marketing attribution. Bridges ServiceNow records to ad-platform conversion APIs without bespoke ETL.
Salesforce
Opportunity stage transitions (qualified, closed-won) dispatched as offline conversions with revenue-weighted value. Prioritized once two enterprise design partners commit.
CallRail
Inbound call events with caller PII and source attribution. Pairs with field-service CRM dispatches to close the call-to-booked-job loop.
Who This Is For
Built for one wedge first. Designed to extend.
Agencies running paid media for field-service operators
Your client uses ServiceTitan for booked jobs and Google Ads + Meta for demand gen. The conversion you optimize against is "form_submit" — a leading indicator at best, a lie at worst. Signal Dispatch closes the loop: every booked job becomes a server-side conversion fed back to the bidding algorithm with the originating click identifier intact.
"Bid against revenue, not form fills."
Also Serving
Legal & professional services
Lead Docket and Litify webhooks normalized through the same canonical schema. Optimize against signed retainer, not page view.
Enterprise marketing operations
One dispatch contract across brands, business units, and regions. Replace twelve bespoke Zapier flows nobody can audit.
Embedded / OEM partners
Embed the dispatch engine in your own product. Adapters as a service.
Two ways to get this in your stack.
Whether you want us to operate the pipeline for you or you want to consume it as infrastructure — we're onboarding partners now.
Managed Service
Signal Integrity Ownership
We design, build, validate, and operate the dispatch layer end-to-end against your CRM and ad platforms. You see the receipts; we own the integrity.
Book a Consultation →Infrastructure Partner
Early Access Partner
Embed the dispatch engine into your agency stack or your product. We're onboarding a small number of design partners for Meta CAPI, GA4 MP, and Google Ads OCI.
Talk to Us About Early Access →The Helm app is generally available with the full audit and Navigator experience. Signal Dispatch and the Measurement Operations API are shipping incrementally to partners.