{"name":"AdvisorPPC changelog","url":"https://advisorppc.ai/changelog","updated":"2026-09-02","releases":[{"label":"Unreleased","date":null,"changes":[{"category":"Added","entries":[{"summary":"Added illustrated niche pages and narrated campaign-economics examples with captions, transcripts and clearer buyer-fit guidance. (#310)","detail":[]},{"summary":"Gravity now has a home in the workspace for every signed-in role: a left-menu entry, a setup page at `/app/gravity`, a card on Connectors and a card in Settings, each explaining how to connect Claude and how to work the site.","detail":["One host, one MCP: `GRAVITY_ENDPOINTS` in `src/content/mcp-endpoints.ts` is the only public place `gravity.advisorppc.com` and `/mcp` are written for these surfaces. Copy lives in `components/app/gravity/gravity-product.ts` and is gated by `gravityCopyProblems()`. Members see the connect guide. The operator dashboard (orgs, drafts, client revoke) stays superuser-only on the same page, so its API hooks never run for other roles. No backend, no migration, no chat or memory writes. (#321)"]},{"summary":"Shield now has a home in the workspace: a left-menu entry, a setup page at `/app/shield`, a card on Connectors and a card in Settings, each explaining what Shield scores and how to connect it to Claude.","detail":["One host, one MCP: `SHIELD_ENDPOINTS` in `src/content/mcp-endpoints.ts` is the only place `shield.advisorppc.com`, its `/shield/mcp` endpoint and its pricing page are written; the connector catalog now reads that pricing link and states Shield's tool count as 20. Copy lives in `components/app/shield/shield-product.ts` and is gated by `shieldCopyProblems()`, which rejects a retired host, a price literal, a wrong product name, a claimed connection state or an off-product link. Every Shield surface is a guide and a link-out: Shield signs in on its own host, so nothing here calls an API or reports Shield as connected."]},{"summary":"TrackPPC, the conversion-tracking product formerly listed as Tracker, now has a home in the workspace: a left-menu entry, a setup page at `/app/tracker` and a card on Connectors, each explaining what TrackPPC measures and how to connect it to Claude. The public catalogue, the connectors landing copy and `llms.txt` use the new name.","detail":["One host, one MCP: `TRACKER_ENDPOINTS` in `src/content/mcp-endpoints.ts` is the only place `track.advisorppc.com`, its `/tracker` endpoint and its pricing page are written; the public TrackPPC leaf now links to that pricing page. Copy lives in `components/app/tracker/tracker-product.ts` and is gated by `trackerCopyProblems()`, which rejects a retired host or working name, a price literal, the ingest host, a claimed connection state or an off-product link. Every TrackPPC surface is a guide and a link-out: TrackPPC signs in on its own host, so nothing here calls an API or reports it as connected."]}]},{"category":"Fixed","entries":[{"summary":"TrackPPC setup now opens the connectors billing page at `/dashboard/billing#tracker`, the live subscribe form, instead of the public pricing page which has no TrackPPC section. (#321)","detail":[]},{"summary":"Fixed the Overview page showing only its heading when your account could not be loaded. It now shows a loading state, or a clear message with a Try again button that reloads your account and then your report. (#439)","detail":["`/api/auth/me` now has a 15 s deadline. Six new tests pin that the Overview body is never empty."]}]},{"category":"Changed","entries":[{"summary":"One price line, everywhere. `pricing.ts` now also projects a price-line manifest (`backend/app/knowledge/price_line.json`) that the backend, the billing page and the MCP connectors read, so included accounts, seats and add-on prices are enforced from the same numbers the pricing page prints.","detail":["Extra ad accounts are priced on a dated schedule stated everywhere the same way: one rate for accounts added through 30 September 2026 and the standing rate for accounts added from 1 October 2026 (both numbers live only in `pricing.ts`); an account added at the earlier rate keeps it. The half-off promo framing is gone. Needs the founder to create the `advisorppc_site_extra_account_intro_monthly` Stripe price; checkout refuses to mint until it resolves at the advertised amount.","The account-change rule: three free account changes per included account, counter always visible on Connectors; from the next new ad account the change is a billable extra managed account. Confirm-then-charge: the API answers 409 `connector_account_change_billable` with the price, the UI asks for a click, and `POST /api/stripe/addons/extra_account` adds the subscription item (prorated, invoiced now). Purchased add-ons raise the account and seat caps (`tenant_subscriptions.extra_accounts` / `extra_seats`, written by the webhook). Migration `d9e0f1a2b3c4`.","The price gate now hunts figures from $40 and the manifest is a gated generated artifact. Gates: price-gate, `test:gate` (pricing tests added), `pytest tests/test_connector_entitlements.py tests/test_price_line.py`."]}]}]},{"label":"2026-09-02","date":"2026-09-02","changes":[{"category":"Added","entries":[{"summary":"A workspace for SEO and AI search: decide what to change, edit it, compare versions, schedule the work and export it.","detail":["Gravity GEO package B per the frozen `gravity-geo/ARCHITECTURE.md`, built over the facts the Gravity MCP returns. Gates at build time: `tsc --noEmit` clean, `test:gate` clean, `pytest tests/test_geo_router.py` 8 passed. The backend baseline is red at merge-base (53 failures); the gate method is zero NEW failing test IDs, not green. (#249)"]}]},{"category":"Changed","entries":[{"summary":"The Shield connector page now explains Shield's own Free / Pro / Agency tiers and links to Shield's pricing.","detail":["`/connectors/shield` describes click scoring, Google Ads IP exclusions and the Bing paste list; a catalog-driven `pricingHref` CTA opens `shield.advisorppc.com/pricing`. Shield rungs are deliberately NOT added to the main `/pricing` ladder, which sells AI managers. (#137)"]}]}]},{"label":"2026-08-30","date":"2026-08-30","changes":[{"category":"Added","entries":[{"summary":"Reset your own password without contacting support. (#244)","detail":[]}]},{"category":"Fixed","entries":[{"summary":"Logged-out visitors can buy the Google Suite plan instead of hitting a wall at checkout. (#245)","detail":[]}]}]},{"label":"2026-08-27","date":"2026-08-27","changes":[{"category":"Added","entries":[{"summary":"The Google Suite plan is on sale. (#230)","detail":[]}]}]},{"label":"2026-08-26","date":"2026-08-26","changes":[{"category":"Added","entries":[{"summary":"Support answers the phone, with the same brain and the same guardrails as chat. (#173)","detail":[]},{"summary":"Live sales metrics on Overview: ad spend, paid vs organic, pending approvals, auto-refreshing. (#189, #188)","detail":[]},{"summary":"A secure AdvisorPPC Telegram channel, with the Mini App hosted on AdvisorPPC. (#222, #224, #223)","detail":[]},{"summary":"Super-admin DGX model lanes in chat. (#209)","detail":[]}]},{"category":"Changed","entries":[{"summary":"All 235 media files moved to R2 and off the origin, with every `/brand` source routed through the CDN resolver. (#212, #213, #214)","detail":[]},{"summary":"Editorial pass on all 98 blog posts, plus real image and media gates. (#210)","detail":[]},{"summary":"Two daily Field Notes through Aug 26. (#208)","detail":[]}]},{"category":"Fixed","entries":[{"summary":"Dark mode no longer forces light artwork: the multiply plate is neutralised on the homepage hero and elsewhere, and art keeps white with rounded corners. (#215, #216, #217)","detail":[]},{"summary":"The Telegram logo keeps its `i` dot and drops the top arc and circle. (#227, #226)","detail":[]},{"summary":"The Google Partner footer aria-label loses its em dash. (#211)","detail":[]},{"summary":"Alembic heads #189 and #224 each created are merged. (#225)","detail":[]}]}]},{"label":"2026-08-23","date":"2026-08-23","changes":[{"category":"Added","entries":[{"summary":"An in-app Billing page at `/app/billing`. (#171)","detail":[]},{"summary":"Every support conversation is remembered, and the owner can read it. (#164)","detail":[]},{"summary":"A context budget orchestrator: a 256k ceiling with dynamic per-turn allocation. (#191)","detail":[]}]},{"category":"Changed","entries":[{"summary":"Chat pipeline: speed, exposure hardening and manual write-gate enforcement. (#151)","detail":[]}]},{"category":"Fixed","entries":[{"summary":"Chat turns no longer block on `connector_account_locks`, and Google consent stays native without status-refresh lock starvation. (#148, #140)","detail":[]},{"summary":"One unreadable Google service no longer blanks the whole chat context. (#144)","detail":[]},{"summary":"The site's customers are signed into the MCP runtime, and the runtime is told which plan a workspace is on. (#168, #152)","detail":[]},{"summary":"A hyphenated ad account is read under its canonical id, and a target CPA can steer pacing. (#174)","detail":[]},{"summary":"A scheduled run targets the workspace's managed accounts. (#159)","detail":[]},{"summary":"The authorizing Google account is captured and shown on the card. (#146)","detail":[]},{"summary":"Enter no longer eats IME messages, and loads stop looking blank. (#149)","detail":[]}]}]},{"label":"2026-08-21","date":"2026-08-21","changes":[{"category":"Added","entries":[{"summary":"Field Notes stills and inline figure nodes. (#136)","detail":[]}]},{"category":"Changed","entries":[{"summary":"Plan-gate refusals are named and shown above the composer. (#128)","detail":[]}]},{"category":"Fixed","entries":[{"summary":"Dashboard, chat connect, billing, security and trust corrections. (#134)","detail":[]},{"summary":"The scaling page meta description is back inside 160 characters. (#135)","detail":[]}]}]},{"label":"2026-08-20","date":"2026-08-20","changes":[{"category":"Added","entries":[{"summary":"Superuser plan control for tenants. (#118)","detail":[]}]}]},{"label":"2026-08-18","date":"2026-08-18","changes":[{"category":"Added","entries":[{"summary":"Account agents in chat. (#107)","detail":[]}]},{"category":"Fixed","entries":[{"summary":"Dark marketing media fallback, and the Grok dark-marketing surface. (#104, #103)","detail":[]},{"summary":"Field Notes H2 and FAQ structure. (#100, #99)","detail":[]}]}]},{"label":"2026-08-14","date":"2026-08-14","changes":[{"category":"Added","entries":[{"summary":"Gravity runs on live data. (#92)","detail":[]}]}]},{"label":"2026-08-13","date":"2026-08-13","changes":[{"category":"Fixed","entries":[{"summary":"Startup recovery and RLS. (#89)","detail":[]},{"summary":"Meta dashboard first-recovered state. (#88)","detail":[]}]}]},{"label":"2026-08-05","date":"2026-08-05","changes":[{"category":"Added","entries":[{"summary":"The brand-green :30 film is the home hero. (#ac246f3)","detail":[]},{"summary":"Video files, :30 TV spots, an `/ads` library and six trade blog heroes. (#c1776e5)","detail":[]}]}]},{"label":"2026-08-03","date":"2026-08-03","changes":[{"category":"Added","entries":[{"summary":"Chat data visibility, a PDF rail, the Portfolio Manager orchestrator, and Fable / Opus 5 models. (#b0b757c)","detail":[]}]}]},{"label":"2026-08-02","date":"2026-08-02","changes":[{"category":"Added","entries":[{"summary":"Google Ads Ad Scheduling post. (#6a04c8b)","detail":[]}]}]}]}