GoodInbound

Paid Traffic Monitoring

Paid traffic monitoring shows what happens after someone clicks your ad: whether they engaged with the page, whether they submitted a form, and whether that submission was a real lead. It also flags IP addresses that keep clicking your ads, so you can exclude them in Google Ads. Turn it on in Settings → Lead Screen and read the results in Analytics → Paid traffic.

To see lead rates across all your sources, not just paid ones, use the Lead Quality Report. To report only real leads back to the ad platforms, see Report Real Leads to Ad Platforms.

Turn on paid traffic monitoring#

  1. Open Settings → Lead Screen.
  2. In Setup, turn on Watch visits from ads and save. Once ad visits arrive, the switch shows when the last one was recorded.
  3. Install the Lead Screen script on your ad landing pages and the pages visitors use before submitting a form. Click Install in the same card for the snippet with your publishable key.
  4. Open Analytics → Paid traffic to review the results.
<script
  src="https://cdn.goodinbound.com/leadscreen.js"
  data-key="pk_live_YOUR_PUBLISHABLE_KEY"
  async
></script>

Pro includes 1,000 analyzed ad visits per workspace per month. Extra analyzed ad visits come in monthly tiers of 10,000, 30,000, or 50,000, separate from the screened-submission allowance.

What counts as an ad visit#

A landing qualifies when its URL contains an ad click ID or a paid utm_medium value.

Signal Recognized values
Ad click IDs gclid, gbraid, wbraid, msclkid, fbclid, li_fat_id, ttclid
Paid campaign tags Examples include cpc, ppc, paid, paid_search, paid_social, display, and retargeting

For example:

https://example.com/demo?utm_source=google&utm_medium=cpc&utm_campaign=operations-demo

utm_source alone does not identify a paid visit. Meta's _fbp and _fbc cookies help conversion matching, but do not themselves qualify a landing as an ad visit.

The script keeps the visit in the browser tab's session storage, reuses it across pages on that origin, and starts a new visit after 30 minutes of inactivity. Reloading within the same visit does not create another landing. If storage is unavailable, continuity across pages is limited.

An ad visit means an observed arrival with these signals. It does not prove that an ad platform charged for a click. Campaign tags and click IDs can be copied or forged.

Read the report#

Choose the last 7, 30, or 90 days.

Tile Meaning
Ad visits Observed paid arrivals
Engaged Share of measured visits with at least 10 seconds on the page, 25% scroll depth, or pointer interaction
Never engaged Share of measured visits with none of those. A high share is the first sign of click fraud.
Submissions Completed submissions attributed to paid traffic, including those screened out
Accepted leads Submissions accepted as leads after screening, excluding pending decisions

Below the tiles, a line shows how many submissions had their origin captured, and how many were accepted as conversions or withdrawn.

By campaign lists each campaign with its source, ad visits, engaged share, submissions, accepted leads, and what was withheld (bot, spam, junk, or review). A campaign with plenty of visits, low engagement, and no accepted leads is where to look first.

These are observed visits and screened submissions, not an ad billing ledger or a spend or ROAS report. Missing engagement is different from measured inactivity: the browser may leave before the measurement is sent.

Hosted form pages capture submission attribution, but not the same landing-visit coverage as the script on your own website. Keep the script on the original landing page and carry its session into screening.

Investigate repeated visits#

Needs a look lists IP addresses with 5 or more ad visits in the last day. Repeats are a reason to look, not proof of fraud: a shared office, mobile network, or VPN can hold real prospects. Each row shows the visits, how many engaged, the network, the campaign, and any accepted leads from that IP.

  • Exclude opens the steps to exclude the IP in Google Ads: open the campaign, then Settings → Additional settings → IP exclusions, paste the IP, and save. Each campaign holds up to 500 exclusions. Remove it after a day or two, because home and mobile IPs get reassigned. Excluding stops your ads showing to that IP; it doesn't refund past clicks or block the IP from your site.
  • Trust adds the IP to the project's trusted IPs in Lead Screen, so its submissions skip the IP checks.
  • Dismiss hides the finding.

Custom collection through the API#

The script manages collection automatically. If you build your own collector, start the session in the visitor's browser, using the publishable key. Do not run both collectors for the same landing.

const response = await fetch(
  "https://goodinbound.com/api/v1/leadscreen/sessions",
  {
    method: "POST",
    credentials: "omit",
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer pk_live_YOUR_PUBLISHABLE_KEY"
    },
    body: JSON.stringify({
      page_url: window.location.href,
      referrer: document.referrer,
      landing: true
    })
  }
);
if (!response.ok) throw new Error(`Session failed: ${response.status}`);
const visit = await response.json();

HTTP 201 returns session, expires_at, and ad_visit. Reuse the session across the visit and send it with /screens; this joins the submission to its origin. ad_visit: true indicates that the session qualifies for monitoring, not a guarantee that every downstream measurement was delivered.

Endpoint Body Authentication
POST /api/v1/leadscreen/sessions page_url, optional referrer, landing: true Publishable Bearer key
POST /api/v1/leadscreen/form-starts session, optional form string Publishable Bearer key
POST /api/v1/leadscreen/engagement session, dwell_ms, scroll, pointer, pages Signed session in body; no Bearer header needed

Report a form start once per form per visit. Send engagement with navigator.sendBeacon when the page becomes hidden or is left. dwell_ms is an integer from 0 to 86,400,000; scroll is 0–100; pointer is a boolean; pages is an integer from 1 to 500. Engagement sends coarse interaction measurements, not form field contents.

Coverage and troubleshooting#

Symptom Check
No visits appear Monitoring is on and saved, the script loads, the key matches the project, and the landing URL has a supported paid signal.
Monitoring was just turned on Try a fresh browser tab; the script remembers an unmonitored project for the current tab.
Visits appear without engagement Page-exit beacons may be blocked or interrupted. This does not establish bot traffic.
Submissions have no campaign Preserve the session token and original attribution when forwarding to your backend.
Collection returns 401 or 400 Check the key and request field types.
Collection returns 429 Back off. Landing sessions have a separate project budget of 3,000/minute and an IP budget of 60/minute.

Collection pauses when the workspace reaches its analyzed-visit limit. Form submission and screening use their own allowance. Traffic measurements cover up to 90 days; allow time for reports to refresh.

The paid traffic report is available in the dashboard only. Do not call the dashboard's /paid-traffic routes with an API key. For your own server-side integrations, use Lead Status Webhooks.