Tracking Conversions From Jobber's Embedded Request Form: Why GA4 and Google Ads Go Blind at the Iframe

Danilo Mališić

Danilo Mališić

Founder, Adeocode · Aug 16, 2026

This week a paving contractor’s hiring post for a website rebuild crossed our desk. New site, Google Ads already running, call it $2,000 a month. The quote form is Jobber’s embedded request form. One requirement was flagged as the thing nobody had been able to deliver: track form submissions in GA4 and Google Ads.

The contractor is right that the standard tools cannot do it. Jobber’s embedded request form is an iframe: a separate page, served from Jobber’s domain, displayed in a window inside your page. Your GA4 tag runs on your page and cannot see inside that window. A visitor submits, no event fires on your side, and Google Ads records nothing. Every fix that works routes around the iframe rather than into it.

The cost of leaving this alone is bigger than a blank report. Google’s automated bidding learns from conversions. Feed it zero and it bids blind. You also cannot tie one booked job to the ad that produced it. At $2,000 a month, that is $24,000 a year spent on faith.

We are independent builders and not affiliated with Jobber or Google. We wire forms, ads, and field service systems together for home-services companies, so this exact problem lands on our desk a lot.

Why your tags go blind at the iframe

One paragraph of theory, then fixes. Browsers wall off pages that come from different domains. A script on your page cannot read what happens inside a frame served from someone else’s domain: not the clicks, not the fields, not the submit. This is the cross-origin boundary, a security feature. It is the same wall that stops a random site from reading your bank page in another frame. Your GA4 tag is standing outside that wall.

The symptom this produces fools people for months. Analytics shows healthy traffic. Jobber shows requests arriving. Google Ads shows zero conversions. Every tool looks fine on its own, so everyone concludes the ads are the problem. The ads may be fine. The measurement is missing.

The four fixes, ranked

FixWhat it countsAccuracyEffort
1. Thank-you page redirectReal submissionsHighLow, if the setting exists
2. Click before the formIntent, one step earlyMediumAn afternoon
3. Listen for the embed’s messagesReal submissionsHigh, until the embed changesA developer day, plus retests
4. Your own form into Jobber’s APIReal submissions plus source dataHighestA real build

Start at the top. Each rung down trades accuracy or durability for availability.

Fix 1: land the visitor on your own thank-you page

The cleanest cheap fix, when it is available. The pattern: after a visitor submits, they should land on a thank-you page on your domain, something like yourdomain.com/thank-you/. That page is yours. Your tags run on it. Fire a GA4 event when it loads and count that event as your conversion in Google Ads. Submission tracked, iframe untouched.

The honest caveat: whether the embed offers a post-submission redirect depends on what Jobber ships today. Vendors change embed options without notice. We will not print a settings path that may be gone by the time you read this. Check the request form’s settings in your Jobber account for anything that controls where the visitor goes after submitting.

Two things to verify if you find such a setting. First, the redirect has to move the whole browser window to your page. If only the content inside the frame changes, your tags still see nothing, because the parent page never changed. Second, keep the thank-you page out of your navigation and out of search. A stray direct visit should not count as a conversion.

If the setting is there and it moves the top window, take this route and stop reading. Most shops are not that lucky, so the ladder continues.

Fix 2: track the click before the form

You cannot see inside the frame, but everything before the frame happens on your page. So move the measurable moment earlier. Put a quote button on your own page, and show the form only after that click: reveal the embed, or navigate to a /request/ page that holds it. The click is yours to track. Fire a GA4 event on it and import that event to Google Ads as a conversion.

Be honest with yourself about what this measures. A click proves interest. Some clickers will look at the form and leave, so this number runs higher than true submissions. Say 40 percent of clickers go on to submit, a made-up figure to show the shape: your click count would then double your real request count. Label it a soft conversion. Compare it against the requests arriving in Jobber, and keep the two numbers side by side.

It still beats zero by a wide margin. Google’s bidding gets a signal tied to the ad click. You get cost per quote-click by campaign. And it ships in an afternoon, with no dependence on anything Jobber may change.

Fix 3: listen for what the embed announces

Frames can talk to the page that holds them through the browser’s messaging channel, postMessage. Some embedded widgets announce their milestones this way: loaded, started, submitted. If Jobber’s embed announces a submission to the parent page, your page can listen for it. The conversion then fires at the exact moment of a real submission.

We are deliberately not printing event names here. What the embed emits, if anything, can change with any release. Test it instead of trusting a blog post, including this one. The test takes five minutes with a developer on the call. Open your page, open the browser console, and log every incoming message event. Submit a test request and read what appears. If a submission message shows up, your tag setup can key on it. If nothing shows up, this route is closed today.

If you build on it, schedule a monthly test submission. A listener like this breaks silently: the embed updates, the message changes shape, and your conversions flatline while the form keeps working. You want to be the one who notices. A five-minute recurring check is the whole insurance policy.

Fix 4: your own form, submitting into Jobber

The full fix removes the iframe from the story. Replace the embed with a form on your own domain. When a visitor submits, your server passes the request into Jobber through its GraphQL API. The visitor lands on your thank-you page. From the outside nothing changed: the visitor asked for a quote and the office sees it in Jobber. From the measurement side, everything changed.

You own the submit event, so GA4 and Google Ads see every real submission. You capture the Google click ID and the campaign source and store them on the lead. That is first-party data no iframe will ever hand you. You control the fields, the speed of the page, and what the thank-you page offers next. And nothing Jobber ships next quarter can break your tracking, because your tracking never depended on their embed.

The costs, plainly. It is a build, with a form, a small backend, and error handling for the day the API call fails. Jobber’s API requires an app your account authorizes through OAuth. API access sits on Jobber’s Plus plan, so price that in if you are on a lower tier. The API’s rate limits are real but sit nowhere near form volume. We measured them in production in our Jobber API rate limits post. And if your ad spend is a few hundred dollars a month, this is overkill: fix 1 or fix 2 covers you.

This is the exact category of work we do. Our integrations page covers what these builds look like, form-to-Jobber included. Where a build sits among the wider menu of Jobber connections, from Zapier up, is mapped in our honest guide to Jobber integrations.

Close the loop: booked jobs back into Google Ads

A tracked form fill is still a form fill. The number an owner cares about is booked work, and Google Ads can learn from that too. Google Ads accepts conversions uploaded after the fact, matched to the original ad click by the Google click ID captured with the lead, or by hashed contact details.

The loop looks like this. The click ID is stored on the lead the day it arrives. Weeks later the estimate becomes a booked job. You upload that conversion with the job’s value attached. Bidding then starts favoring the campaigns that produce booked installs over the ones that produce cheap form fills. Two campaigns with identical cost per lead can be a great buy and a money pit. This is the only view that tells them apart.

Notice the dependency: the loop needs the click ID, and capturing it means owning the form. This is the quiet reason fix 4 pays for itself past a certain ad budget. It tracks submissions today and makes every later measurement possible.

What to do this week if you cannot rebuild anything

No developer on hand, no appetite for a build, ads running right now. Do these three things.

  1. Add the quote button. Put the form behind one click on your own page and track that click as your conversion. An afternoon of work, and Google’s bidding finally gets a signal.
  2. Put a tracking number on the site for paid visitors. Call tracking tools can show a dedicated number to visitors who arrived from ads, and count those calls as conversions. In the trades a large share of leads phone in anyway. Those calls are currently as invisible as the form.
  3. Check the embed’s settings for a post-submission redirect. If a redirect exists and moves the whole window, use it. An hour of work upgrades your click tracking to true submission tracking.

Then mind what happens after the lead lands, because attribution only pays when the lead gets answered. The research on response time is uglier than most owners expect. The speed-to-lead numbers put the cliff at five minutes.

The short version

  • The embedded request form is an iframe from Jobber’s domain. Your tags cannot see into it. Submissions produce zero conversions while traffic and requests both look healthy.
  • The fixes route around the frame. Redirect to your own thank-you page if the setting exists. Listen for messages if the embed announces submissions. Track the quote-button click as the always-available soft conversion.
  • The full fix is a form on your domain submitting into Jobber through its API. Every submission gets tracked and click IDs get captured. Offline imports then feed Google Ads the number that matters: booked jobs.
  • This week, with no rebuild: the quote button, a call tracking number, and a check of the embed’s redirect options.

If your ads are spending against a form nobody can measure, that is a plumbing job, and it is the kind we take. See what we build on our integrations page, or book a discovery call and bring your ad account numbers. If a redirect setting or a call-tracking tool at call it $50 a month covers your case, we will say so on that call and you can keep the budget.

Danilo Mališić, founder of Adeocode

Talk to the founder

Bring us the workflow that doesn't fit

Every discovery call is with Dan, who wrote this and builds these systems. He stays your contact through the whole engagement: no sales team, no handoffs. If the tools you already pay for cover it, he'll tell you that too, and the call costs nothing.

No. The embedded request form is an iframe: a separate page served from Jobber's domain, shown in a window inside yours. GA4 runs on your page, and the browser walls it off from everything inside that frame. A submission happens on Jobber's page, so your side records no event and no conversion. The working fixes all route around the frame.

Pick the highest rung you can reach. If the form's settings can send visitors to a thank-you page on your own domain after submitting, fire the conversion there. If the embed announces submissions to your page, a listener can fire it. If neither is open, track the click on your own quote button as a soft conversion, and import booked jobs later as offline conversions. The full fix: a form you own.

Because the counts happen on different pages. Your GA4 tag counts the visit on your page. The form lives on Jobber's page, inside the iframe, where your tag cannot see. So traffic looks healthy, requests arrive in Jobber, and the conversion column stays at zero. The form is fine and the tag is fine. Nothing on your page can reach across the frame.

No. The page inside the frame is served by Jobber, and you cannot add scripts to a page you do not serve. Even if you could, the events would fire on another domain, and stitching them back to your ad click gets ugly fast. Do not fight the frame. Every durable fix moves the action onto a page you control.

Your own form. Build it on your domain and submit each request into Jobber through its GraphQL API. You control the submit event, so GA4 and Google Ads see every request. You can store the Google click ID on each lead, which later lets you upload booked jobs back into Google Ads as offline conversions. It is a build, and the API needs Jobber's Plus plan.

Yes, with one requirement. You have to capture the Google click ID when the lead first arrives, and that means owning the form. Store the click ID on the client record. When the request becomes a booked job, upload it to Google Ads with the job value attached. Bidding then learns from booked work instead of form fills. The embedded form cannot start the loop.

You may like these

Speed to Lead for Home Services: The Numbers That Decide Who Gets the Job

Speed to Lead for Home Services: The Numbers That Decide Who Gets the Job

Jul 29, 2026

The most-cited speed to lead statistic is from 2007: call a lead within 5 minutes instead of 30 and you are 100 times more likely to reach them, 21 times more likely to qualify them. Harvard Business Review's 2011 audit of 2,241 companies found an average response time of 42 hours, and 23% of companies never responded at all. Nobody has published a better study since, and in home services the decay is faster: a homeowner with a burst pipe hires whoever answers. Here are the verified numbers, the famous stat we refused to print, and the response ladder that actually fixes it.

Read more
Stop Losing Leads to Slow Follow-Up: The Automation Guide for Home Services

Stop Losing Leads to Slow Follow-Up: The Automation Guide for Home Services

Jul 31, 2026

Harvard Business Review's 2011 lead-response study found that companies contacting a lead within an hour were nearly 7 times more likely to qualify it than companies that waited even an hour longer. In a home-services operation, leads die in four predictable places: the call missed while you're on a roof, the web form emailing an inbox nobody watches, the Facebook lead sitting unseen in Meta's Leads Center, and the estimate that never gets a second touch. Here is each leak, the manual fix, the off-the-shelf fix with its plan gate, and when custom routing earns its cost.

Read more
Jobber Integrations: The Honest Guide to What Connects and What's Gated

Jobber Integrations: The Honest Guide to What Connects and What's Gated

Aug 1, 2026

Jobber integrations come in three tiers: native marketplace apps (QuickBooks, Gusto, Zapier, available on mid plans), Zapier automations (good for notifications, weak for live two-way data), and custom API integrations, which require the Plus plan at $399 to $529 per month billed annually. Most owners hit the ceiling at tier two without knowing tier three has a paywall. Pricing verified August 1, 2026.

Read more
Jobber API Rate Limits: What You Can Actually Build, Measured in Production

Jobber API Rate Limits: What You Can Actually Build, Measured in Production

Aug 14, 2026

Jobber's GraphQL API has a 10,000 point query-cost budget that refills at 500 points per second, plus a second cap of 2,500 requests per 5 minutes. One KPI dashboard we run in production costs 13,456 to 20,762 points per load. Every limit with numbers, and what fits inside them. Verified August 14, 2026.

Read more