Skip to main content
These entries describe August releases. For current behavior, use the linked guides: ingestion verification does not complete onboarding, arrival totals remain complete when a small component is withheld, and legacy Launcher is disabled by default.
Plainrouter ships continuously. This page collects the customer-facing changes from August and leaves out formatting, CI, and internal draft work.

New accounts start directly in Signals setup

Improved · Registration now creates your default workspace and takes you straight to Signals setup. Empty workspaces also link to the next setup step. Follow the self-serve quickstart.

Connect Google Ads from workspace settings

New · Where the Google Ads integration is configured, workspace owners can connect, reconnect, or disconnect it from Workspace Settings and see the accessible customer IDs. Google Ads connection does not enable Google Ads Actions.

See last month’s workspace usage

New · The dashboard shows arrivals and observed platform spend for the previous completed UTC month. Incomplete spend or currency data appears as unavailable.

Passive measurement stores less commerce detail

Privacy · Passive measurement now rounds timestamps to the hour and omits product identifiers, quantities, and item counts. These records remain free of visitor identity and are not sent to advertising destinations. Review passive activity handling.

Conversion API responses identify the workspace

Changed · Conversion API responses now include numeric workspace_id. The deprecated signal_tracker_id alias remains available for existing clients, including published 0.5.x SDKs. Read the identifier transition.
Privacy · The dashboard’s channel subset now includes only attributed global arrivals and fully consented strict-EU arrivals. Portfolio, legitimate-interest revenue, and severed-measurement rows stay out of the channel split, while the separate total remains privacy-bounded. When a strict-EU passive total is below five, both the dashboard and CSV show Suppressed (<5) instead of the ledger count. Interpret channels and totals.

Send user-data deletion identifiers in the request body

Changed · User-data deletion accepts a verified raw identifier or legacy SHA-256 digest in the JSON body. Identifiers in URL query strings are rejected. Review deletion and identity fields.

Visitor identity retention is bounded to 30 or 90 days

Privacy · New and updated Signals configurations now use one fail-closed retention policy across the dashboard and API. The published choices are 30 and 90 days, with 90 days as the default; MCP exposes no retention setter. Review identity retention.

Ruby SDK and PyPI CLI expand the official clients

New · Ruby gem plainrouter-sdk 0.1.0 brings the signed Conversion API contract to Ruby 3.2 and newer. Python package plainrouter==0.5.1 now also includes the plainrouter command: install it with pipx install plainrouter==0.5.1 or run python -m plainrouter from an active environment. Install the Ruby SDK or choose a CLI distribution.

Official clients publish API 0.5.0

New · TypeScript SDK @plainrouter/sdk@0.5.0, Python SDK plainrouter==0.5.0, Go SDK github.com/plainrouter/sdk-go@v0.5.0, and CLI @plainrouter/cli@0.5.0 are published from the signed API contract. Install the CLI from npm or the official Homebrew tap with brew install plainrouter/tap/plainrouter. Choose an official client.

Try the API without an account

New · The public sandbox now lets you validate an identity-free synthetic event without an account or credential. One read-only request also returns a short-lived sandbox key for testing bearer-authenticated client setup. Sandbox requests read no production data, persist nothing, and contact no advertising provider. Try the sandbox.

Test MCP integrations without an account

New · https://plainrouter.com/mcp/sandbox exposes synthetic get_account_state, get_signal_health, get_performance, and validate_sandbox_event calls without a credential or human step. The endpoint is separate from account-bound production MCP, exposes no proposal or spend tools, stores nothing, and contacts no advertising provider. Start in MCP test mode.
Privacy · The v4.1.4 collector accepts browser identity only when all three advertising permissions are granted under the consent basis. Review Signals consent behavior.

Compare Signal arrivals with platform-claimed clicks

New · The Signals dashboard now compares privacy-bounded observed arrivals with stored account-level platform clicks over the same fully retained daily period. It shows the difference and claimed-click proportion, includes a CSV export, and never makes a live Marketing API request while rendering or exporting. Interpret the comparison.

Check Launcher draft status and readiness through MCP

New · Agents can inspect Launcher draft progress and run a readiness check without changing ads. The execution entry remains unavailable. Use the Launcher MCP workflow.

Signals keeps completed installation verification

Improved · A verified managed-hostname installation stays verified when recent traffic ages out. During same-origin secret rotation, the old secret remains valid until an arrival successfully authenticates with the replacement. Review serving verification.

Strict-EU passive totals honor small-cell privacy

Privacy · Strict-EU passive activity contributes zero to displayed Signal totals until its aggregate cell reaches five arrivals. Passive rows remain identity-free, aggregate-only, absent from event-level APIs, and ineligible for Meta delivery. Interpret Signal activity.

Passive measurement omits page URLs and traffic sources

Privacy · Passive measurement no longer stores page URLs or platform and channel sources. These arrivals remain identity-free aggregate data and are not sent to Meta. Review passive activity handling.

Signal serving setup now adapts to your hosting stack

New · The Signals dashboard detects your hosting stack in the background and produces one copy-ready setup: a managed-hostname CNAME for platform-constrained sites or same-origin forwarding for Vercel, Netlify, Next.js, Cloudflare, Nginx, and Caddy. Same-origin installs include secret rotation and turn green only after a side-effect-free forwarding probe and the first authenticated arrival. Configure Signal serving.

Signal activity includes privacy-bounded passive arrivals

Improved · Activity totals now include customer-visible passive arrivals without exposing them in event-level lists or detail APIs. Invalid traffic stays out of the totals, and strict-EU passive cells contribute only after their aggregate reaches five arrivals. Interpret Signal activity.

New Signal installs use the v3 browser contract

Fixed · Plainrouter now generates /s/v3.js installation URLs across onboarding, hostname responses, and the dashboard fallback snippet. The v3 browser API accepts structured consent snapshots and fails closed when required advertising permissions are missing, unknown, denied, malformed, or withdrawn. Its v3.0.1 patch also preserves previously consented visitor state while a returning page waits for the consent platform to restore its decision; no measurement resumes before that decision arrives. Install the current pixel.

Spend proposals now require performance evidence

Improved · Signal health remains available for diagnostics, but it can no longer support budget, status, creative-spend, or mixed proposals. Agents must use eligible observed reconciliation data from get_performance; modeled and portfolio-only events remain outside that evidence path. Upload-only asset proposals keep the narrow non-spend exception. Review the MCP evidence rules.

Import Launcher drafts from CSV or XLSX

New · Write and Admin workspace tokens can create Launcher drafts through POST /mcp/launcher/import. The adapter accepts bounded CSV/XLSX files, reports invalid rows without hiding valid work, resolves only already-synced Drive assets in the token workspace, and deletes staged uploads after parsing. Read the import guide.

MCP execution credentials fail closed

Security · OAuth management credentials are now rejected by default on MCP and agent-authenticated routes. The read-only agent-context route is the sole discovery exception; MCP tools require an account-bound workspace execution token whose tier is capped by the issuer’s current workspace role. Connect an agent.

Launcher draft batches arrive in MCP

New · Agents can use launcher.draft_batch to turn already-synced Drive assets into a structured Plainrouter draft. It requires a Write or Admin workspace token and does not write to Meta or activate spend. Read the MCP reference.New · Signal activation now uses an identity-free server verification event through REST or MCP, making the browser pixel optional for setup. Event ingestion now requires an explicit consent basis and fails closed before ineligible Meta delivery. See what changed in API 0.3.1.

SDKs and CLI ship API 0.3.1

New · TypeScript SDK 0.3.1, Python SDK 0.3.1, and CLI 0.3.1 are now published. Both SDKs expose all ten signed API operations, including ingestion verification and the consent-aware event contract. Choose a client.

Stripe revenue waits for settlement

Improved · Stripe Checkout creates a purchase only after an exact payment_status of paid. Failed, unpaid, free, missing, and malformed states stay out of the ledger, rollups, and Meta delivery. Review Stripe event behavior.

Drive ownership is verified before sync

New · Launcher verifies a connected Drive folder by workspace-domain ownership or a generated challenge file before inventory sync can run. Public folders always require the challenge path. Connect a Drive folder.

Workspace-scoped MCP tokens

New · Workspace owners can issue, rotate, and revoke Read, Write, or Admin bearer tokens bound to one workspace and Meta ad account. Plainrouter shows the credential once and audits its lifecycle without storing the plaintext value. Set up a workspace token.

Track action-policy changes in Audit

Improved · Workspace action-policy changes now appear in the audit history alongside proposals, approvals, executions, and token changes. Learn about the audit log.