feat: link premium paywall pages to their feature docs - #28398
Merged
david-fraley merged 6 commits intoAug 20, 2026
Merged
Conversation
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
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.
…ks' into dfraley/premium-paywall-docs-links
The connection log paywall bullet mentions SIEMs, which typos splits into the "SIE" identifier and flags as a misspelling of SIZE.
jeremyruppel
approved these changes
Aug 20, 2026
david-fraley
merged commit Aug 20, 2026
59eb5d2
into
dfraley/premium-paywall-copy
29 of 30 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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/pricingwith 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.PaywallPremiumandPaywallSmallno longer render a pricing link;PREMIUM_PRICING_LINKandPaywallDocumentationLinkare removed as dead code.SettingsHeaderDocsLinkbutton instead, so the affordance is consistent.SettingsHeaderfrom the view into the page container, so the header and button also render in the unentitled state./ai-coder/ai-gatewayto/ai-coder/ai-governance.URL mapping
/admin/setup/appearance/admin/networking/workspace-proxies(unchanged)/admin/security/audit-logs/admin/users/groups-roles/admin/users/idp-sync#organization-sync/ai-coder/ai-governance/ai-coder/ai-gateway/standalone#create-a-gateway-key/ai-coder/ai-gateway/audit/admin/security/audit-logs/admin/monitoring/connection-logs/admin/users/organizations/admin/users/groups-roles/admin/provisioners/admin/provisioners/admin/users/idp-sync/admin/templates/template-permissionsProof
Captured from a local dev deployment (no license, so every paywall renders) at 1400x950, on the current branch head.
Automated check against the same deployment, asserting the button target on each page and the absence of the old pricing link:
Investigation and scope notes
Starting state. Both paywall variants hardcoded a link to
PREMIUM_PRICING_LINK:PaywallPremiumrendered a bare<a>andPaywallSmallusedPaywallDocumentationLink, both labelled "Learn more about premium". No paywall had a per-feature docs target.Chosen affordance.
SettingsHeaderDocsLinkalready existed (outline button, external-link icon, default label "Read the docs") and was in use on 12 non-paywalled settings pages, withObservabilitySettingsPageViewas the reference. Reusing it keeps the paywall pages consistent with the rest of settings, and all URLs go through the version-awaredocs()helper rather than hardcodedcoder.comlinks.Per-page work, by difficulty.
SettingsHeaderpresent and rendered in the unentitled state: Appearance, Groups (header lives inGroupsPage.tsx), Custom Roles (header lives inCustomRolesPage.tsx), Org Provisioners, Org Provisioner Keys, AI Gateway Keys (existingactionshad "Create key", now a fragment with both).PageHeaderrather thanSettingsHeader: Audit and Connection Log.PageHeaderalready supports anactionsslot, so no header migration was needed.<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 existingExportPolicyButton.SettingsHeadermoved fromTemplatePermissionsPageViewintoTemplatePermissionsPageso both branches get it.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
SettingsHeaderin aflex flex-rowdiv, which left the button content-sized in the middle of the header instead of at the right edge; those wrappers are gone.TemplatePermissionsPagekeeps its<title>outside the gapped flex container, matching the other pages.Known gaps.
GroupsPage,CustomRolesPage,IdpSyncPage,IdpOrgSyncPage,TemplatePermissionsPage, andAIBridgeSessionsLayoutare 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, andpnpm exec vitest run --project=storybook(3401 tests, 1 pre-existing unrelated failure inModelForm, "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.