Skip to content

v0.9.0 — new tagline, manual OAuth default, estimate_budget zero-value fix

Latest

Choose a tag to compare

@github-actions github-actions released this 15 May 06:54

What's New

This is a positioning + UX release driven by Google's OAuth verification status, plus the second half of the zero-value bug class fixed in 0.8.1.

New tagline

The AI command center for Google Ads, GA4, and tracking code.

Replaces the older "stop switching between dashboards" framing. It says concretely what AdLoop runs across — Ads, GA4, and tracking code — instead of describing a problem. Updated in the PyPI description and the README header.

Setup wizard now defaults to "bring your own Google Cloud project"

AdLoop's built-in OAuth client has reached Google's 100-user cap on unverified apps. New users who picked the bundled credentials in the wizard were getting stranded with a "This app is blocked" error at the Google consent screen — there's no way through that page without an approved app.

  • adloop init now defaults the credentials prompt to No (bring your own GCP) instead of Yes (use bundled).
  • An up-front warning explains the cap and links to Discussion #13 for verification status.
  • Bundled credentials stay available as an opt-in for existing users whose tokens predate the cap — their tokens keep working; this only affects fresh sign-ins.
  • README "Setup" section restructured to put the custom-GCP path front and center while verification is pending. The collapsible "Advanced Setup" is gone — those steps are now the primary path, renamed to "Custom Google Cloud Project Setup".

When Google verification completes we'll flip the default back to bundled in a follow-up release. Status updates live on Discussion #13.

Bug fix — estimate_budget zero values silently became None

Same class of bug as 0.8.1's discover_keywords fix (Bug 1). The forecast service can legitimately return zero clicks, zero cost, or zero CTR — that's the diagnostic signal for insights like "impressions but zero clicks" or "budget covers 100% of estimated cost". The old code used falsy guards (round(cost / 1_000_000, 2) if cost else None, round(clicks / days, 1) if clicks else None) which mapped those legitimate zeros onto None, hiding the signal.

  • Now uses _micros_to_currency (shared with discover_keywords) for the cost/CPC conversions.
  • Daily averages and CTR rounding use explicit is not None guards.
  • New TestEstimateBudgetZeroPreservation suite pins the behavior end-to-end across four cases: zero clicks, zero cost, all-None metrics, and the realistic happy path.

Tests: 262 pass (was 258 before the new suite).


Upgrade path

pip install --upgrade adloop

If you're an existing user: nothing to do. Your current OAuth token keeps working until it expires.

If you're hitting "This app is blocked" on a fresh install: that's the 100-user cap. Re-run adloop init and take the default — the wizard guides you through setting up your own Google Cloud project (~5 minutes, no cap).

Full changelog

v0.8.1...v0.9.0