Jobber integration

Jobber is the field service management platform we built our revenue tracking around first. Connecting it closes the loop between ad spend and paid invoices, so Google Ads' Smart Bidding can optimize for revenue instead of just leads.

What it does

Three things:

  1. Lead sync. Every lead captured in VibeAds (form submission or qualified call) auto-creates a Client + Request in your Jobber account. You see new leads in Jobber's Requests pipeline.
  2. Job completion sync. When you mark a Job complete in Jobber, the corresponding VibeAds lead status flips to completed.
  3. Paid invoice upload (Max). When an invoice is marked paid in Jobber, VibeAds uploads the revenue to Google Ads as an offline conversion (UPLOAD_CLICKS_REVENUE). Smart Bidding learns which keywords drive paid customers.

Tier gating

FeatureFreeProMax
Connect JobberNoYesYes
Lead → Jobber Client + RequestNoYesYes
Job completion → lead status syncNoYesYes
Paid invoice → Google Ads revenue uploadNoNoYes
Predictive LTV for recurring categoriesNoNoYes
Bidding ladder auto-promotion based on revenueNoSuggestionAuto-execute

End-to-end flow

  1. Ad click captures gclid + UTM params at funnel page load
  2. Visitor submits lead form OR calls tracking number
  3. VibeAds creates lead record with gclid + UTM + funnel data
  4. VibeAds calls Jobber GraphQL API to find or create Client by email/phone
  5. VibeAds creates Jobber Request linked to the Client
  6. Stores jobber_client_id + jobber_request_id on the lead
  7. You see the lead in Jobber Requests, schedule + dispatch the job
  8. Tech completes the work, you mark the Job complete in Jobber
  9. Jobber fires JOB_CLOSED webhook → VibeAds updates lead status
  10. You invoice the customer in Jobber, they pay
  11. Jobber fires INVOICE_UPDATE webhook with paidStatus=PAID → VibeAds upserts jobber_paid_invoices row
  12. upload-jobber-conversions runs every 15 min, uploads the row to Google Ads as offline conversion to UPLOAD_CLICKS_REVENUE (Max only)
  13. Smart Bidding learns which keywords drive paid customers

Predictive LTV for recurring categories

Google Ads offline conversion uploads must be within 90 days of the click (the GCLID window). Recurring-service businesses often see the first invoice 30 to 60 days after the click and subsequent invoices well past 90 days.

Predictive LTV solves this by uploading revenue × multiplier on the FIRST invoice when:

  • Category is recurring (cleaning, pool, pest, landscaper)
  • This is the first paid invoice for this lead
  • GCLID is still within the 85-day buffer window

Multipliers per category:

CategoryMultiplierRationale
cleaner10xAvg 10 invoices over 2 years
pool_services12xMonthly + chemical upsells
pest_control8xQuarterly + seasonal
landscaper6x4 to 6 visits/yr
hvac3xInstall + maintenance + repeat
christmas_lighting2xSeasonal repeat
Others1xOne-time or emergency

For nth-invoice-of-same-lead recurring invoices, the upload is skipped (the LTV was already uploaded on invoice 1). Per-invoice attribution is tracked in jobber_paid_invoices.conversion_value_type with values: actual, predicted_ltv, skipped_recurring, skipped_gclid_expired.

Webhook events

VibeAds subscribes to these Jobber webhook topics:

  • REQUEST_CREATE: confirms VibeAds' Request creation succeeded
  • JOB_CREATE: when you create a Job from a Request
  • JOB_UPDATE: status changes (scheduled, in progress)
  • JOB_CLOSED: tech marked complete, triggers lead status update
  • INVOICE_CREATE: when an invoice is generated
  • INVOICE_UPDATE: status changes, including paidStatus=PAID

Signature verified via HMAC-SHA256 with X-Jobber-Hmac-SHA256 header using JOBBER_CLIENT_SECRET.

Double-counting protection

When a call comes in and gets qualified (score over 30), the upload-call-conversions cron normally uploads it to Google Ads as a UPLOAD_CLICKS_LEAD conversion. With Jobber connected, the call upload is SKIPPED if the lead also has jobber_job_id set. The eventual paid invoice will upload to UPLOAD_CLICKS_REVENUE, and we do not want Google to credit two conversions on the same gclid.

Net result: one gclid = one conversion. The conversion is either the call (if no Jobber Job) or the paid revenue (if the Job ran).