Skip to content

docs(roku-dsp): Roku Ads and DSP ad network guides (LIN-3325) - #309

Open
tashviks wants to merge 5 commits into
mainfrom
tashvik/lin-3325-roku-dsp
Open

tashviks wants to merge 5 commits into
mainfrom
tashvik/lin-3325-roku-dsp

Conversation

@tashviks

@tashviks tashviks commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Docs for LIN-3325.

Reader task

  • ad-networks/roku-ads: connect Roku Ads, what Linkrunner reports, and set up Conversions API postbacks and event mapping.
  • ad-networks/dsps: buy ads through Samsung Ads, The Trade Desk or Google DV360 and paste one Linkrunner impression tag into the DSP.
  • api-reference/s2s-impressions and api-reference/ctv-impressions: the DSP mode of the two impression endpoints (lr_key).
  • docs.json: both pages in the Ad Networks navigation.

Behavioral evidence

  • Claims about Linkrunner behavior were read against the matching hazelnut and backend branches (not a released build). They hold only after those PRs ship.
  • DSP macro names and rules are from each vendor's public help (Samsung Ads macro page, last updated 2023-06-27, fetched 2026-10-22; Google Display & Video 360 macro reference). The Trade Desk has no public macro table, so its tag uses the tokens that vendor guides publish and the page says what is not documented. Samsung's IP macro is restricted to Samsung certified vendors in GDPR countries; which vendors are certified is not published, so the page does not promise it.
  • Amazon DSP is not covered: it only accepts certified measurement partners.

Checks

  • npm run check:agents and npm run check:routes -- origin/main pass.
  • Not run: mintlify dev preview of these two pages, and no screenshots (none of the UI is captured here).

Publishing

Draft on request. The repo policy is a non-draft PR with RathodDarshil as reviewer; I did not request the reviewer so the draft does not notify anyone. Publishing needs its own approval, and the pages should not go live before the backend, hazelnut and dashboard PRs ship.

Also in this PR (DSP clicks and Google TV)

  • ad-networks/dsps and api-reference/s2s-clicks: the DSP click tag, the lr_key and device id rules, and the per-source clicks switch (LIN-3325).
  • ad-networks/google-tv-campaigns (new, in the Ad Networks navigation after Google Ads): the Video route is reporting only; the Demand Gen route uses a Linkrunner link as the Final URL with auto-tagging and an optional Final URL suffix. An install is credited only when a click reaches a Linkrunner link with Google click parameters, or through iOS ICM context; a viewer who only watches is not credited.
  • features/ctv-attribution: the Google TV section.
  • docs.json gains the Google TV page.

After combining: npm run check:agents 9 of 9 and npm run check:routes -- origin/main valid (136 pages). Not run: the Mintlify render. Google's behavior was read in the live Google Ads UI (nothing was published) and in Google's help pages; whether Google tags a scan of its TV QR codes with click parameters is unverified.

Publishing: the Google TV page must not go live before the dashboard and backend ship.

Related PRs (LIN-3325 and LIN-3905)

Closed because their content is folded into the PRs above: hazelnut #979 and #980, backend #1479, dashboard #920, docs #312 (Google TV, LIN-3905, which also carried the Connected TV base that never had its own PR).

Merge and deploy order (all of LIN-3325 and LIN-3905)

  1. Migrations: backend #1458 (Prisma, including clicks_enabled), hazelnut #967. Postgres first, then the 84_ and 85_ ClickHouse DDL: put only those two files in a temporary directory and run go run . ch-schema --sql-dir <dir> against staging and then prod. A full make ch-schema-prod runs every file in clickhouse/init/prod and would probably stop at 14_create_hazelnut_backup_schema.sql (bare CREATEs) on the live cluster. You run it; the ClickHouse user needs INSERT on both new tables; flip the CHANGE LOG entries from PENDING to APPLIED afterwards. The clicks_enabled column must exist before the backend and gateway images: a gateway loader ahead of the column fails the whole DSP key query, so impressions would answer 503 too.
  2. ops #1239: impression-consumer Postgres env, Roku sync CronJob and ExternalSecret, Google device sync CronJob, every CronJob suspended. It must be on ops main before the prod-campaign-daily-stats-v* tag, because the image workflow now edits two CronJob files and fails if one is missing. GSM props ROKU_CLIENT_ID, ROKU_CLIENT_SECRET, ROKU_DEVELOPER_APP_UID and ROKU_REDIRECT_URI must exist first.
  3. hazelnut #968 merged, then the image tags in .github/workflows/prod-image-build.yml: impression-consumer BEFORE the first DSP key is issued, the gateway image after the column exists, prod-metrics-server-v* (serves GetCtvMetrics, including include_google_tv), and prod-campaign-daily-stats-v* (rewrites both CronJob images, still suspended).
  4. backend #1459 (merge to main is prod), after the metrics-server image is live: until then the Connected TV endpoint answers 503.
  5. dashboard #912 (merge to main is prod).
  6. Turn the syncs on: a dry run and one manual Job each for roku sync and google-device-sync, compare one account to the ad network, then a one-line ops PR per CronJob setting suspend: false. Rollback is suspend: true.
  7. docs docs(roku-dsp): Roku Ads and DSP ad network guides (LIN-3325) #309 after the dashboard is live.

Docs update (2026-10-26)

Removed the "Three DSPs are supported" comparison table from the top of ad-networks/dsps.mdx (cd47ad1). The Trade Desk and Google DV360 sections further down the page are unchanged.

🤖 Generated with Claude Code

Add ad-networks/roku-ads (connect, reporting, Conversions API postbacks) and
ad-networks/dsps (Samsung Ads, The Trade Desk and Google DV360 impression
tags), link both in the navigation, and document DSP mode on the S2S and CTV
impression endpoints.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@tashviks
tashviks marked this pull request as ready for review October 22, 2026 19:33
tashviks and others added 4 commits October 26, 2026 02:56
…(LIN-3905)

Adds "Run Google Ads on connected TV": the Video route (reporting only) and the Demand
Gen route, where Google can show a QR code on TV from a Linkrunner Final URL. Says
what Linkrunner credits and what it sends postbacks for, and why a viewer who only
watches the ad is not credited. Adds the Google TV section to CTV attribution.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…N-3325)

Document GET /v1/click with lr_key, the clicks_enabled switch (default false),
required device id, and the Samsung click tag as the only supported tag.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Trade Desk and Google DV360 are hidden in the dashboard for now, so the
side by side table of the three DSPs no longer belongs at the top of the page.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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