Skip to content

Add catalog overrides for offer accept and decline CTAs#36

Merged
robert-moore merged 1 commit into
mainfrom
rob/offer-cta-overrides
Jul 14, 2026
Merged

Add catalog overrides for offer accept and decline CTAs#36
robert-moore merged 1 commit into
mainfrom
rob/offer-cta-overrides

Conversation

@robert-moore

Copy link
Copy Markdown
Contributor

Customer report (Slack, matt.mckenney): overriding the rebate button text had no path — offer.copy.cta/declineCta are server-synthesized defaults (step-normalizer.ts), the flow builder has no CTA fields, and the chrome catalog deliberately excluded offer copy. The embed's rebateAccept key covered exactly this case.

Design docs: Phase 2 implementation overview

What

New chrome keys, all with empty defaults:

  • offer.acceptCta.{discount,pause,trial_extension,plan_change,contact,redirect,rebate}
  • offer.declineCta (shared across types)

Default components render catalogValue || offer.copy.cta — a set key wins, an unset key falls through to the offer's copy. Since every CTA today is synthesized, this is behavior-neutral until someone sets a key; and when authored per-offer CTAs land later (builder fields), they keep winning over unset keys, so precedence stays coherent: authored copy → catalog override → synthesized default.

Rides the whole existing pipeline: org dashboard rows generate automatically from the catalog mirror (monorepo PR to follow), sdkTranslations delivery already handles the new keys, per-language works.

Testing

Override + fallthrough covered against the rendered rebate flow. 222 tests, tsc + biome clean.

Customer report: the rebate accept button ("Accept refund") had no
override path anywhere — offer cta/declineCta are synthesized
server-side defaults, the flow builder has no CTA fields, and the
chrome catalog deliberately excluded offer copy. The embed's rebateAccept
key covered exactly this.

New offer.acceptCta.<type> keys and a shared offer.declineCta, all with
empty defaults: a set value replaces the offer's copy, an unset key
falls through — so when authored per-offer CTAs exist someday, they
keep winning over unset keys. Rides the existing override pipeline, so
the dashboard rows and org-level delivery come for free.
@robert-moore
robert-moore merged commit 26d33ea into main Jul 14, 2026
1 check passed
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