Lead lifecycle
{{ drawer.lead?.lead_id }}
Driver
{{ drawer.lead.name }}
Phone (hashed)
{{ drawer.lead.phone_hash }}
Position
{{ drawer.lead.position }}
Carrier
{{ drawer.lead.carrier }}
EMQ
{{ drawer.lead.emq }} / 10
Current stage
{{ drawer.lead.current_stage }}
Timeline
{{ t.time }}
{{ t.label }}
{{ t.event }} CAPI fired
{{ t.ack_ok ? 'ack ' + t.ack_ms + 'ms' : 'failed' }}
{{ t.event_note }}
{{ t.note }}
Latest CAPI payload PII hashed
{
  "event_name": "Lead_Qualified",
  "event_time": 1761329001,
  "event_id": "{{ drawer.lead.last_event_id }}",
  "action_source": "system_generated",
  "user_data": {
    "lead_id": "{{ drawer.lead.lead_id }}",
    "em": "{{ drawer.lead.email_hash.slice(0, 16) }}...",
    "ph": "{{ drawer.lead.phone_hash.slice(0, 16) }}...",
    "fn": "", "ln": "",
    "zp": "", "country": "",
    "fbc": "{{ drawer.lead.fbc || 'null' }}",
    "fbp": "{{ drawer.lead.fbp || 'null' }}",
    "client_ip_address": "x.x.x.x",
    "client_user_agent": "Mozilla/..."
  },
  "custom_data": {
    "lead_event_source": "Call2Action CRM",
    "lead_status": "qualified"
  }
}
Switch carrier
πŸš€
Launch new campaign
Step {{ wizard.step + 1 }} of {{ wizard.steps.length }} Β· ~{{ Math.max(0, 5 - wizard.step) }} min remaining
{{ i + 1 }}

What position are you hiring for?

Pick a position from your Call2Action CRM. We'll auto-fill the requirements, the qualification questions in the form, and the audience.

auto-synced {{ activeTenant.positions.length }} open positions in {{ activeTenant.name }}

Who should see this ad?

We pre-built the audience from the position's location and requirements. Edit any field below β€” these are starting points.

5 fields auto-filled. Pulled from {{ wizardSelectedPosition.title }} in your CRM. In Meta Ads Manager you'd type all of these by hand.
from position
industry default
to
carrier default
matched to position
{{ t }}
AI-suggested
{{ t }}
Estimated reach: ~38,000–112,000 drivers/day in this audience

Pick the creative

Pulled from your library and matched to {{ wizardSelectedPosition.title }}. Headlines and body text are AI-suggested β€” edit or pick from your library.

Videos
matched to position
9:16 OTR Hero
4:3 Sign-on Bonus
Add more
Aspect ratio coverage OK β€” 9:16 and 4:3 both present
AI-suggested
42/40 chars Β· keep under 40 for best mobile rendering
AI-suggested
183 chars Β· sweet spot is 90–125
Live preview
{{ activeTenant.initials.charAt(0) }}
{{ activeTenant.name }}
Β· Sponsored
Looking for CDL-A drivers with 1+ year OTR experience. {{ activeTenant.name }} β€” competitive pay, $0.65/mile + safety bonus.
{{ activeTenant.domain }}
Class A drivers β€” $0.65/mile + sign-on bonus

Instant Form β€” auto-built Β· v1 (draft)

Qualification questions are derived from the position requirements. UTMs are injected automatically so the lead lands in the right pipeline.

Once published, this form is immutable β€” Meta doesn't allow structural edits. We version it: any change spawns v2 (new draft, old form keeps receiving leads it already attracted).
{{ i + 1 }}
{{ q.label }}
{{ q.auto }}required
{{ opt }}
β€” text input β€”
if "{{ q.gate }}" β†’ end form (lead marked unqualified, no recruiter time wasted)
UTM injection (auto)
resolved from CRM
utm_company_id = {{ activeTenant.utm_company_id }}
utm_position_id = {{ wizardSelectedPosition.utm_position_id }}
β†’ Leads will land directly in the {{ wizardSelectedPosition.title }} pipeline in your CRM.
Form preview
{{ activeTenant.name }}
{{ wizardSelectedPosition.title }}
Tell us about yourself β€” recruiter will call within 24h.
{{ q.label }}
{{ opt }}

Budget & launch

Last step. Set your daily budget, review the checklist, hit Launch.

$
/ day
AI-suggestedBased on similar OTR campaigns at $35–48 cost-per-qualified driver
Est. reach
~12,000 / day
Est. leads
18–25 / day
Est. qualified
8–12 / day
Locked-in best-practice defaults
From the carrier playbook. We don't expose these because the right answer is always the same.
{{ d.label }}:{{ d.value }}
Pre-launch checks
{{ c.label }}{{ c.value }}
You can pause anytime from the Campaigns tab.

Campaign is live πŸŽ‰

First leads typically arrive within 30–60 minutes. CAPI events fire automatically β€” Meta will start retraining within 24h.

Campaign ID
23851029384751029
Form ID Β· v1
1789012345678901
Time to launch
4 min 18 sec βœ“
In Meta Ads Manager today, this same launch takes:
~25mnavigating BM, picking the right ad account
~40mbuilding Instant Form, conditional logic, copying UTM IDs
~30mconfiguring audience, interests, exclusions, placements
~25muploading creatives, writing headlines and copy
~20mpublishing, running test events, fixing mis-routed UTMs
~2.5hper campaign, every time. Per carrier.

Campaigns

Lead campaigns running for {{ activeTenant.name }}.

{{ emqAlerts.length }} alert{{ emqAlerts.length === 1 ? '' : 's' }}
{{ a.campaign }} Β· EMQ {{ a.emq }} (below floor 7.0) β€” {{ a.reason }}
Active
{{ tenantStats.active }}
+{{ tenantStats.learning }} learning Β· {{ tenantStats.paused }} paused
Spent (7d)
${{ tenantStats.spent_7d.toLocaleString() }}
${{ Math.round(tenantStats.spent_7d / 7) }} / day avg
Qualified leads (7d)
{{ tenantStats.qualified_7d }}
↑ {{ tenantStats.qualified_change }}% vs prev. 7d
Cost / qualified
${{ tenantStats.cost_per_qual.toFixed(2) }}
{{ tenantStats.cost_change < 0 ? '↓' : '↑' }} {{ Math.abs(tenantStats.cost_change) }}% since CAPI
{{ c.name }}
{{ c.status }} EMQ {{ c.emq }} Form v{{ c.form_version }}
{{ c.position }} Β· {{ c.audience }} Β· {{ c.creatives }} creatives
Daily
${{ c.daily_budget }}
Leads / Qual (7d)
{{ c.leads_7d }} / {{ c.qualified_7d }}
Cost / qual
${{ c.cost_per_qual }}
No campaigns yet for {{ activeTenant.name }}
Click Launch new campaign to start your first.
Why this is faster

Launch a campaign in 5 minutes, not 3 hours.

Pick a position, hit Launch. The wizard pre-fills the audience from the position's location and requirements, auto-builds the qualification questions in the Instant Form, picks creatives from your library, and injects the right UTM IDs so leads land in the correct pipeline.

{{ i + 1 }}
{{ s.title }}
{{ s.sub }}

CAPI dashboard

The feedback loop teaching Meta what a qualified driver looks like. Powered by stage transitions in your CRM.

Live
EMQ alert Β· {{ emqAlerts[0].campaign }}
EMQ {{ emqAlerts[0].emq }} below floor 7.0. {{ emqAlerts[0].reason }}.
Likely fix: ensure recruiter captures phone number on first contact (currently 38% of leads have only email).
Event Match Quality
{{ activeTenant.emq }}
/ 10
Floor: 7.0 Β· trend ↑ 0.3
Events sent (7d)
{{ tenantStats.events_7d.toLocaleString() }}
+18% vs prev. 7d
Delivery success
98.2%
22 retries Β· 0 dropped
Stage β†’ ack latency
14s
p95: 47s Β· target: <1h
Cost-per-qualified Β· before vs after CAPI
14-day window. CAPI activated on day 7 (vertical line). Lower is better.
Cost / qualified ($)
Qualified rate (%)
CAPI activated Day 1 Day 7 Day 14
Cost/qual before
$52.40
Cost/qual after
$28.43 (↓ 46%)
Qualified rate lift
18% β†’ 33% (+44%)
Funnel β€” last 7 days

Each stage transition fires a CAPI event. Tier 2 (Lead_Qualified) is the optimization target.

{{ s.stage }}{{ s.event }}
{{ s.count }} Β· {{ ((s.count / activeTenant.funnel[0].count) * 100).toFixed(0) }}%
Live event stream
streaming
click row β†’ lifecycle
TimeEventLeadEMQStatusLatency
{{ e.time }} {{ e.event }} {{ e.lead }} {{ e.emq }} {{ e.status }} {{ e.ack_ms }}ms
In plain terms
Meta currently optimizes for Lead_Qualified β€” looking for drivers who actually have a CDL-A, not just people who'll tap a form. Cost-per-qualified is down 46% in the 14 days since CAPI went live. Click any event row to see the full lifecycle of that lead.

Tenant onboarding

One-time setup per carrier. After this, everything pre-fills automatically inside the Launch wizard.

{{ i + 1 }}
Step {{ i + 1 }}
{{ s.label }}

Connect Meta Business Portfolio

Authorize Call2Action to read business assets, ad accounts, pages, and create CRM datasets.

f
{{ activeTenant.name }}'s Business Portfolio
BM ID: 1234567890123456 Β· 3 ad accounts Β· 2 pages
Connected

Pick the ad account

Operators often have access to several. The wrong choice burns the wrong client's budget.

Volume gate not cleared. Meta requires β‰₯ 200 leads/month for CAPI for CRM to work meaningfully. You can still proceed β€” CAPI will run but won't improve targeting until volume picks up.

CRM dataset & access token

Create a separate CRM-type pixel in Events Manager (don't reuse the web pixel) and a non-expiring System User token.

Events Manager β†’ Datasets β†’ CRM type β†’ ID
Stored encrypted (Fernet). Required scope: ads_management

Send a test event

We'll fire a sample Lead_Qualified event. It should appear in Events Manager β†’ Test Events tab within seconds.

{{ check.label }} {{ check.value }}

Instant Forms

Versioned per position. Published forms are immutable in Meta β€” duplicate to make changes.

Why versioning: Meta forbids structural edits on published Instant Forms. Our wizard auto-versions: edit a published form β†’ spawns v+1 draft β†’ old version keeps receiving leads it already attracted (history preserved).
{{ pos.position }}
{{ pos.location }}
VersionStatusForm IDLeads receivedPublished at
v{{ v.version }} {{ v.status }} {{ v.meta_id || 'β€”' }} {{ v.leads }} {{ v.published_at || 'β€”' }}

Creative library

Videos and images, tagged by carrier and aspect ratio. Used by the Launch wizard to auto-pick creatives matched to position type.

{{ c.ratio }} {{ c.duration }}s
{{ c.name }}
{{ tag }}
used in {{ c.used_in }} ads