Skip to content

feat(ads): add the Google Ads surface - #26

Merged
alihesari merged 1 commit into
mainfrom
feature/google-ads
Oct 4, 2026
Merged

alihesari merged 1 commit into
mainfrom
feature/google-ads

Conversation

@alihesari

Copy link
Copy Markdown
Member

This SDK was the only one without Google Ads. Task 46 shipped /v1/ads/google/* to all 14 other client repos and missed this one — no ads.google, no models, and AdsResource only knew connections/meta/authorize. There was no unmerged branch for it either.

Adds client.googleAds() covering all 33 Google-only routes:

  • recommendations and the optimization score, with apply and dismiss
  • keywords, keyword ideas, historical metrics, search terms
  • bid strategies, the ad schedule
  • negative keyword lists
  • assets, Performance Max asset groups
  • Local Services leads, conversions
  • the raw GAQL passthrough

17 model records, 9 param builders, one resource.

What is deliberately not here

The shared surface is not duplicated. Campaigns, ad groups, ads, audiences, insights, labels, change history, experiments and conversion value rules already work on Google through ads(), because those routes dispatch by connection — this SDK's 169 existing ad methods already cover them. Only what has no equivalent on another network is new.

authorize("google", workspaceId) already worked through the generic provider route, so there is no authorizeGoogle.

Notes

GoogleAdsScope renders snake_case on a query string and camelCase in a body, because the API takes the same three fields both ways. An object id is <customerId>~<kind>~<id>: a Google resource name has slashes and cannot ride in a path segment.

8 new tests; mvn -B verify green on 135 tests, no new warnings.

Unrelated, noticed while editing: the README resource table has duplicate inbox() and ads() rows from an earlier merge. Left alone rather than silently collapsed.

This SDK was the only one without it. Task 46 shipped /v1/ads/google/* to
every other client repo and missed this one, so googleAds() is new here
rather than an extension of something existing.

Covers all 33 Google-only routes: recommendations and the optimization score,
keywords and keyword research, search terms, bid strategies, the ad schedule,
negative keyword lists, assets, Performance Max asset groups, Local Services
leads, conversions, and the GAQL passthrough.

The shared surface is deliberately not duplicated. Campaigns, ad groups, ads,
audiences, insights, labels, change history, experiments and conversion value
rules already reach Google through ads(), because those routes dispatch by
connection.

GoogleAdsScope renders snake_case on a query and camelCase in a body, since
the API takes the same three fields both ways.
@alihesari
alihesari merged commit 24417de into main Oct 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant