SproutVestSproutVest

SproutVest and the Google Ads API

SproutVest runs paid search ads on Google. This page describes the software we built to measure them, because measuring an ad honestly turns out to require more than a tag on a page.


What it is

An internal integration between this website and the single Google Ads account SproutVest owns and funds. It has no user interface, no sign-in, and no users other than the person who runs SproutVest. It is not a product, it is not sold or licensed, and it is not available to anyone else. It does not touch any Google Ads account but our own.

The problem it solves

We sell coaching and advisory engagements that close weeks after someone first arrives. A form submission on the day of the click is a weak signal, and optimizing advertising toward weak signals is how budgets get spent on the wrong things. The conversion worth paying attention to is the engagement that actually starts, and that happens away from the browser, long after the tag that watched the visit has stopped watching.

The Google Ads API is the only mechanism that can report it, which is the entire reason this integration exists.

What it does

  • Reports completed sales. When someone who arrived from an ad later becomes a client, we tell Google that the ad produced a sale, so the campaign optimizes toward revenue instead of toward form fills.
  • Reads performance data. Campaign, keyword, and search term numbers are pulled into an internal weekly summary, replacing manual export.
  • Adds negative keywords. Search terms that attract the wrong audience become exclusions on our own campaign, reviewed by a person first.

Who runs it and who can use it

The integration has exactly one user, the person who runs SproutVest. It is not distributed, licensed, resold, or offered to any other advertiser, and there is no plan to offer it. The code lives in a private repository and deploys to infrastructure SproutVest controls. It reads and writes one Google Ads account, the account SproutVest owns and pays for. Because it never serves another advertiser, the Required Minimum Functionality rules that apply to third-party tools do not apply to it.

The services it calls

Service and methodWhat it is for
ConversionUploadService.UploadClickConversionsReport a purchase against the stored click identifier, with the conversion time and value.
GoogleAdsService.SearchRead campaign, keyword_view, and search_term_view metrics for the internal weekly summary.
CampaignCriterionService.MutateCampaignCriteriaAdd negative keywords to our own campaign, after a person has reviewed them.

On a busy day that is fewer than 100 operations: one scheduled reporting query, and one upload per sale.

How a sale gets back to Google

Someone clicks one of our search ads and arrives here carrying a Google click identifier. If advertising consent is in effect, the landing page keeps that identifier for the browsing session. If the visitor completes the free leadership diagnostic, the identifier is stored next to their submission in our database. Weeks later, when that person buys an engagement, a scheduled job uploads a conversion against the stored identifier. The identifier is the only value that makes the return trip.

What is sent to Google, and what is not

One value travels back to Google: the click identifier it issued when you arrived from an ad. Nothing else does. Not your email address, not your name, not your answers to the diagnostic, not your report. Google's enhanced conversions feature is switched off, so no personal data is transmitted in hashed form either. We build no remarketing lists and no audience segments.

The click identifier is captured only with advertising consent, and that consent starts as "no" for every visitor, in every country. Decline, or simply never answer the banner, and the identifier is discarded in your browser before it reaches us. It is held for the browsing session only, and we delete it from a stored submission on request.

The full detail is in our Privacy Policy.

Where it runs

The integration is a Cloudflare Worker on our own domain, the same one that already serves the diagnostic and its email delivery. Submissions and click identifiers are stored in Cloudflare D1, a private database. The developer token, OAuth client, and refresh token are held as encrypted secrets in the Worker runtime, never committed to source control and not readable by anyone outside SproutVest. Uploads and reporting run unattended on a schedule.

How this integration makes money

It does not. SproutVest sells leadership coaching and advisory engagements, and that is where revenue comes from. This software is a cost. Its only purpose is to measure our own advertising accurately enough to decide whether to keep buying it.

Compliance

  • Used only on the Google Ads account SproutVest owns and funds.
  • Not distributed, resold, licensed, or offered to any third party.
  • No access to any other advertiser's account or data.
  • No personal data sent to Google at any point, and enhanced conversions switched off.
  • Advertising cookies and click identifiers are consent gated and disclosed in the published Privacy Policy.
  • Credentials stored as encrypted runtime secrets, never in source control.

Questions about this integration

Write to [email protected].

Book a Call