Thanks to visit codestin.com
Credit goes to github.com

Skip to content

feat: link premium paywall pages to their feature docs - #28398

Merged
david-fraley merged 6 commits into
dfraley/premium-paywall-copyfrom
dfraley/premium-paywall-docs-links
Aug 20, 2026
Merged

feat: link premium paywall pages to their feature docs#28398
david-fraley merged 6 commits into
dfraley/premium-paywall-copyfrom
dfraley/premium-paywall-docs-links

Conversation

@david-fraley

@david-fraley david-fraley commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

TL;DR: every "you need Premium" screen used to link to our pricing page. Now each one has a "Read the docs" button that goes to the docs for that actual feature.

Stacked on #28339 (base branch dfraley/premium-paywall-copy).

Every premium paywall linked to coder.com/pricing with a "Learn more about premium" link, which duplicated the trial CTA and said nothing about the feature being paywalled. This removes that link and gives each paywalled page a top-right Read the docs button pointing at the feature's docs page, using the "Learn more URL" column from the Premium Copy Updates doc.

  • PaywallPremium and PaywallSmall no longer render a pricing link; PREMIUM_PRICING_LINK and PaywallDocumentationLink are removed as dead code.
  • Pages that already had an inline "View docs" text link in their description now use the standard SettingsHeaderDocsLink button instead, so the affordance is consistent.
  • Template permissions moves its SettingsHeader from the view into the page container, so the header and button also render in the unentitled state.
  • Observability points at the audit-logs docs per the Notion column; AI Governance settings moves from /ai-coder/ai-gateway to /ai-coder/ai-governance.

URL mapping

Page Docs URL
Appearance /admin/setup/appearance
Workspace Proxies /admin/networking/workspace-proxies (unchanged)
Observability /admin/security/audit-logs
Groups /admin/users/groups-roles
IdP Organization Sync /admin/users/idp-sync#organization-sync
AI Governance Settings /ai-coder/ai-governance
AI Gateway Keys /ai-coder/ai-gateway/standalone#create-a-gateway-key
AI Gateway Sessions / Session Threads /ai-coder/ai-gateway/audit
Audit Logs /admin/security/audit-logs
Connection Log /admin/monitoring/connection-logs
Create Organization /admin/users/organizations
Organization Custom Roles /admin/users/groups-roles
Organization Provisioners /admin/provisioners
Organization Provisioner Keys /admin/provisioners
Organization IdP Sync /admin/users/idp-sync
Template Permissions /admin/templates/template-permissions

Proof

Captured from a local dev deployment (no license, so every paywall renders) at 1400x950, on the current branch head.

Page Screenshot
Appearance
Workspace Proxies
Observability
Groups
IdP Organization Sync
AI Governance Settings
AI Gateway Keys
AI Gateway Sessions
Audit Logs
Connection Log
Create Organization
Organization Custom Roles
Organization Provisioners
Organization Provisioner Keys
Organization IdP Sync
Template Permissions

Automated check against the same deployment, asserting the button target on each page and the absence of the old pricing link:

appearance             https://coder.com/docs/admin/setup/appearance | learnMore: 0 | paywall: 1
workspace-proxies      https://coder.com/docs/admin/networking/workspace-proxies | learnMore: 0 | paywall: 1
observability          https://coder.com/docs/admin/security/audit-logs | learnMore: 0 | paywall: 1
groups                 https://coder.com/docs/admin/users/groups-roles | learnMore: 0 | paywall: 1
idp-org-sync           https://coder.com/docs/admin/users/idp-sync#organization-sync | learnMore: 0 | paywall: 1
ai-governance          https://coder.com/docs/ai-coder/ai-governance | learnMore: 0 | paywall: 1
gateway-keys           https://coder.com/docs/ai-coder/ai-gateway/standalone#create-a-gateway-key | learnMore: 0 | paywall: 1
ai-sessions            https://coder.com/docs/ai-coder/ai-gateway/audit | learnMore: 0 | paywall: 1
audit                  https://coder.com/docs/admin/security/audit-logs | learnMore: 0 | paywall: 1
connection-log         https://coder.com/docs/admin/monitoring/connection-logs | learnMore: 0 | paywall: 1
create-organization    https://coder.com/docs/admin/users/organizations | learnMore: 0 | paywall: 1
custom-roles           https://coder.com/docs/admin/users/groups-roles | learnMore: 0 | paywall: 1
org-provisioners       https://coder.com/docs/admin/provisioners | learnMore: 0 | paywall: 1
org-provisioner-keys   https://coder.com/docs/admin/provisioners | learnMore: 0 | paywall: 1
org-idp-sync           https://coder.com/docs/admin/users/idp-sync | learnMore: 0 | paywall: 1
template-permissions   https://coder.com/docs/admin/templates/template-permissions | learnMore: 0 | paywall: 1
Investigation and scope notes

Starting state. Both paywall variants hardcoded a link to PREMIUM_PRICING_LINK: PaywallPremium rendered a bare <a> and PaywallSmall used PaywallDocumentationLink, both labelled "Learn more about premium". No paywall had a per-feature docs target.

Chosen affordance. SettingsHeaderDocsLink already existed (outline button, external-link icon, default label "Read the docs") and was in use on 12 non-paywalled settings pages, with ObservabilitySettingsPageView as the reference. Reusing it keeps the paywall pages consistent with the rest of settings, and all URLs go through the version-aware docs() helper rather than hardcoded coder.com links.

Per-page work, by difficulty.

  1. Already had the button: Observability, Workspace Proxies, AI Governance settings. URL retargeting only.
  2. SettingsHeader present and rendered in the unentitled state: Appearance, Groups (header lives in GroupsPage.tsx), Custom Roles (header lives in CustomRolesPage.tsx), Org Provisioners, Org Provisioner Keys, AI Gateway Keys (existing actions had "Create key", now a fragment with both).
  3. PageHeader rather than SettingsHeader: Audit and Connection Log. PageHeader already supports an actions slot, so no header migration was needed.
  4. Hand-rolled <header>: Org IdP Sync and IdP Org Sync. Inline "View docs" text links replaced with the button; on IdP Org Sync the button sits next to the existing ExportPolicyButton.
  5. Centered layout: Create Organization. The button is absolutely positioned top-right, mirroring the existing "Go Back" link on the left.
  6. Header not rendered when paywalled: Template Permissions. SettingsHeader moved from TemplatePermissionsPageView into TemplatePermissionsPage so both branches get it.
  7. No header of their own: AI Gateway Sessions and Session Threads. Both views early-return the paywall, so the button went into their shared AIBridgeSessionsLayout, replacing the inline "Learn how to audit AI sessions" link.

Self-review fixes applied after the first push. The Groups and Roles pages wrapped SettingsHeader in a flex flex-row div, which left the button content-sized in the middle of the header instead of at the right edge; those wrappers are gone. TemplatePermissionsPage keeps its <title> outside the gapped flex container, matching the other pages.

Known gaps. GroupsPage, CustomRolesPage, IdpSyncPage, IdpOrgSyncPage, TemplatePermissionsPage, and AIBridgeSessionsLayout are containers with no Storybook story, so their buttons are covered by the dev-deployment evidence above rather than by stories. Audit and Connection Log now have both the header button and their existing help popover link pointing at the same docs page; consolidating those is left out of scope.

Verification. make fmt, pnpm exec tsc --noEmit, pnpm exec biome check src, and pnpm exec vitest run --project=storybook (3401 tests, 1 pre-existing unrelated failure in ModelForm, "Cost Estimate Shows Loading While Debounce Pending"), plus the dev-deployment screenshots and DOM assertions above.


Generated by Coder Agents on behalf of @david-fraley.

Every premium paywall linked to coder.com/pricing with a "Learn more
about premium" link, which duplicated the trial CTA and told users
nothing about the feature they were looking at.

Remove that link from PaywallPremium and PaywallSmall, and instead give
each paywalled page a top-right "Read the docs" button pointing at the
docs page for that feature, per the Premium Copy Updates doc.

Pages that already had an inline "View docs" link in their description
now use the header button instead, so the affordance is consistent.
Template permissions moves its header into the page container so the
button also renders in the unentitled state.
Change the paywall hero and subtitle to lead with the trial rather
than the Premium plan name: "Get access with a Coder trial" / "Start
an unlimited 30-day trial today". Update the matching Storybook
interaction assertions.
@david-fraley
david-fraley marked this pull request as ready for review August 20, 2026 21:16
…stories

Drop the flex wrappers around SettingsHeader on the groups and roles pages
so the docs button reaches the right edge like every other settings page,
keep the template permissions <title> outside the gapped container, and
assert the docs link target in the paywall stories that previously
asserted the removed pricing link.
The connection log paywall bullet mentions SIEMs, which typos splits into
the "SIE" identifier and flags as a misspelling of SIZE.
@david-fraley david-fraley changed the title feat(site/src): link premium paywall pages to their feature docs feat: link premium paywall pages to their feature docs Aug 20, 2026
@david-fraley
david-fraley merged commit 59eb5d2 into dfraley/premium-paywall-copy Aug 20, 2026
29 of 30 checks passed
@david-fraley
david-fraley deleted the dfraley/premium-paywall-docs-links branch August 20, 2026 21:50
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 20, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants