Skip to content

seo(copy): query-driven titles, descriptions and FAQ for the money pages - #239

Open
BSalaeddin wants to merge 1 commit into
seo/claim-integrityfrom
seo/money-page-copy
Open

BSalaeddin wants to merge 1 commit into
seo/claim-integrityfrom
seo/money-page-copy

Conversation

@BSalaeddin

Copy link
Copy Markdown
Collaborator

Text/metadata-only edits to the money pages (home, /pricing, /supported-stores, /coupons, /coupons/[store]) plus three FAQ entries, every one motivated by a Search Console number from the 90-day pull. No layout changes, no new sections, no new dependencies, no rating/review markup.

Stacked on #233 (seo/claim-integrity) — merge after it, then retarget/merge this one. It builds on the reconciled figures that PR introduced ("4,000+ stores", "100,000+ coupon codes", past-tense Honey wording) and uses no other numbers.

Source: caramel-artifact/seo-2026-09-11/query-brief.md (query clusters computed from the raw GSC pull, 90 days to 2026-09-11), STATE.md (baseline), claim-inventory.md §"Store count claims".

Protect the position-2 cluster

The home page owns the "honey alternative" cluster: 40 queries, 2,358 impressions, 187 clicks at position ~2.3 (honey alternative extension 615 impr / pos 2.3, honey extension alternative 404 / 2.3, honey app alternative 158 / 2.7, extensions like honey 143 / 3.0, apps like honey 127 / 4.0, best honey alternative extension 76 / 2.4, paypal honey alternative 36 / 5). That is most of the property's clicks (920 total). Every edit below was checked against one rule: nothing that carries this cluster leaves the page.

  • "Honey Alternative" stays in the home <title> (and OG title); "alternative to Honey" stays in the hero copy and the existing FAQ untouched.
  • The H1 is untouched on every page.
  • The only home strings that change are the <title> and the meta description — the "extension" / "app" / "alternative" vocabulary is preserved and extended, never swapped.

Change table

Page Element Old → New Why (query / impr / pos)
/ (src/app/layout.tsx) <title> + og:title Caramel | The Trusted Alternative To Honey For Finding Coupons (62) → Caramel: Free Coupon Extension & Trusted Honey Alternative (58) Keeps "Honey Alternative" for the cluster above; adds "Coupon Extension" for the generic cluster no page targets today (coupon extension 117 impr / pos 10.2, best coupon extension 25 / 9.4, coupon browser extension 19 / 15.8); "Caramel" stays first (caramel extension 237 impr / pos 1.3, 33% CTR).
/ meta description + og:description Open-source, privacy-first coupon extension that finds and applies the best codes at checkout — without selling your data or hijacking creators' commissions. (157) → Free, open-source coupon extension and app for Chrome, Firefox, Edge & Safari — the privacy-first Honey alternative that applies the best codes at checkout. (156) Adds "app" for caramel app (67 impr / pos 6.0 / 1 click) and the browser list for caramel chrome (28 / 4.3) and the Safari cluster (coupon extension safari 63 / 9.7, safari coupon extension 37 / 10.6, best coupon extension for safari 9 / 8.1). All four browsers are live listings (src/lib/brandLinks.ts).
/pricing (pricing/page.tsx) <title> Caramel Pricing | Free Forever Coupon Extension (47) → Is Caramel Free? Yes — Free Forever & Open Source | Caramel (59) 513 impr, 2 clicks, pos 7.9 — 0.4% CTR vs ~3.3% benchmark (quick win #1). Its queries are brand (caramel extension 71 impr, caramel coupon extension 46, caramel coupon 30, caramel coupons 24) where home already ranks #1, so the snippet competed with home; it now states the one thing the page answers.
/pricing meta description Caramel is 100% free, open source, and privacy-first. No hidden fees, no data selling, no credit card required. Save money with the trusted alternative to Honey. (161) → Yes, Caramel is free forever: no premium tier, no hidden fees, no credit card. An open-source coupon extension for 4,000+ stores that never sells your data. (156) Same; drops the "alternative to Honey" phrase from THIS page so it stops duplicating the home snippet (the cluster stays on home). "4,000+" is the reconciled figure.
/supported-stores (supported-stores/page.tsx) <title> Caramel | Supported Stores (26) → 4,000+ Supported Stores — Caramel Coupon Extension (50) 175 impr at pos 37 with a title carrying nothing a searcher types.
/supported-stores meta description Explore the stores supported by Caramel and start saving with our coupon extension. (83) → Search the 4,000+ online stores where the free Caramel coupon extension finds and applies promo codes at checkout, and see the stores added most recently. (154) Same; describes what the page actually does (search + the recently-added strip). H1 Is your favourite store supported? untouched.
/coupons (coupons/page.tsx) meta description Browse coupon codes and promo codes for your favorite stores. Caramel finds and applies the best deals automatically at checkout. (129) → Browse Caramel coupon codes and promo codes for 4,000+ online stores. The free Caramel extension finds and applies the best codes automatically at checkout. (156) Hub: 56 impr / pos 8.8 on caramel coupons / caramel coupon; the description now carries the brand phrase and the reconciled count. Title untouched (tests/unit/coupons-index-page.test.ts pins its prefix).
/coupons/[store] (coupons/[store]/page.tsx) <title> / og:title / twitter:title when total > 0 michaels.com Coupons & Promo Codes | Caramelmichaels.com coupons & promo codes — 74 active codes | Caramel (singular 1 active code) Store pages sit at pos 25–55 for <store> promo code queries (michaels promo code 12 impr / 53.6, helmut lang promo code 13 / 28.4, mypillow promo code 13 / 38.8, books a million coupon code 11 / 39.6). Uses ONLY data the page already renders — base domain + the live total the prose section already states — no invented display names or dates.
/coupons/[store] meta description when total > 0 Find michaels.com coupon codes, promo codes, and discounts — refreshed as new codes are found.Caramel lists 74 active coupon codes for michaels.com — promo codes and discounts refreshed as new codes are found and dead ones retired. Same. The total === 0 (noindex) page keeps the old title and description exactly, pinned by a new assertion. "verified" stays out (removed by #233).
/ FAQ (src/components/FaqSection.tsx) new entry Is Caramel the same as Honey? — No. Caramel is an independent coupon extension, not affiliated with Honey or PayPal. Like Honey, it looks up coupon codes for the store you are checking out on and applies the best one; unlike Honey, its extension and web app are open source, it contains no affiliate code, and it leaves creators' affiliate links untouched. ~400 impr / 90 days from people searching for Honey itself land on home at pos 9–11 (honey coupons 187 / 8.9, honey coupon 123 / 11.2, honey coupon finder 48 / 11.2, honey code finder 38 / 9.7). Serves them truthfully without pretending to be Honey. Facts = the existing FAQ/Features claims (open source scoped to extension + web app, no affiliate code).
/ FAQ new entry How is Caramel different from SimplyCodes? — SimplyCodes does not publish its source code, so what its extension does with your data and with affiliate links can only be taken on trust. Caramel's extension and web app are published under the AGPL-3.0 license for anyone to audit, it contains no affiliate code at all, and it works without an account. simplycodes vs honey 56 impr / pos 9.6 + honey vs simplycodes 13 / 10.8, no page targets them. The one claim about SimplyCodes is an absence verified today: simplycodes.com (200, 284 KB) links no source code / GitHub anywhere — the same test claim-inventory.md applies to Honey, Capital One Shopping, Rakuten and Coupert (F14). Their /about was a Cloudflare challenge today, so nothing from it is quoted.
/ FAQ new entry Is there a Caramel coupon extension for Safari? — Yes. Caramel ships as a Safari extension through the App Store for Mac (macOS) and for iPhone and iPad (iOS), and it is free there like every other version — the same open-source coupon extension as the Chrome, Firefox and Edge builds. coupon extension safari 63 / 9.7, safari coupon extension 37 / 10.6, best coupon extension for safari 9 / 8.1 — no page targets them. Verified 2026-09-12 by fetching SAFARI_APP_STORE_URL (apps.apple.com/ke/app/caramel/id6741873881): compatibility lists iPhone "Requires iOS 16.4 or later", iPad, Mac "Requires macOS 13.0 or later" (and Apple Vision). Version numbers deliberately not quoted so the answer does not go stale.

The FAQPage JSON-LD is generated from the same array, so the three entries ship in it verbatim; tests/unit/faq-section.test.tsx (Q/A text must appear verbatim and exactly once in the visible DOM; no rating markup) stays green — the new answers deliberately do not repeat the "over 100,000 coupon codes" / "more than 4,000 online stores" phrases that test matches by regex.

Not done, with reason: H1/H2 wording on every page is unchanged (nothing in the data argued for it and the home H1 carries the cluster); /coupons title unchanged (already leads with the query; a unit test pins it); no "Chrome" in the home title (58 chars is the budget — "app" and the browser list went into the description instead).

Tests updated

  • tests/unit/coupons-store-page.test.ts — pins the new total > 0 title/description (singular "1 active code"), og:title === title, and that the total === 0 page keeps the generic title/description.
  • No test pinned the old home title literally (e2e/seo-a11y.spec.ts only asserts /caramel/i); grep for Trusted Alternative across e2e/, tests/, src/ returns only the two layout.tsx lines this PR changes.

Verification

Run from C:\wt-caramel-copy on 2026-09-12 after pnpm install --frozen-lockfile + db:generate (turbo cache bypassed with --force where turbo caches; a first background gate run was killed by the loaded box and re-run in the foreground):

Gate Result (verbatim)
pnpm lint --force caramel-app:lint: cache bypass, force executingcaramel-extension:lint: ✖ 3 problems (0 errors, 3 warnings) (pre-existing no-console warnings in the extension, not touched here) — Tasks: 2 successful, 2 total — exit 0
pnpm lint:oxlint 4 pre-existing warnings in apps/caramel-extension/dom-utils.js (block-scoped-var / no-underscore-dangle), 0 errors — exit 0
pnpm prettier-check --force caramel-app:prettier-check: All matched files use Prettier code style! + same for caramel-extensionTasks: 2 successful, 2 total / Cached: 0 cached — exit 0
pnpm --filter caramel-app knip no output (clean) — exit 0
pnpm -r run type-check packages/caramel-ui type-check: Done, apps/caramel-app type-check: Done, apps/caramel-extension type-check: Done — exit 0
pnpm --filter caramel-app test (vitest run) Test Files 78 passed (78) / Tests 719 passed (719) — exit 0 (an earlier 3-file run hit one [vitest-pool-runner]: Timeout waiting for worker to respond on the loaded box; each of the three touched files then passed individually: faq-section 5/5, coupons-store-page 6/6, coupons-index-page 2/2)

Rendered lengths (computed, not eyeballed): home title 58, home description 156, pricing title 59, pricing description 156, supported-stores title 50 / description 154, coupons hub description 156.

External facts fetched today with curl: SAFARI_APP_STORE_URL → 200, compatibility block lists iPhone (iOS 16.4+), iPad, Mac (macOS 13.0+), Apple Vision; simplycodes.com → 200 with no source-code / GitHub link (its /about returned a Cloudflare challenge, so nothing from it is used).

What CI covers

  • e2e/seo-regression.spec.ts: per-route <title> > 15 chars and branded, description ≥ 50 chars, exactly one <h1>, canonical/OG/twitter present, titles unique across the public route set (all five titles here are distinct), home raw HTML must contain 4,000+ and must not contain 3,000+ / 139,000, FAQPage + entity JSON-LD in raw HTML, no aggregateRating anywhere. minVisibleChars contracts only gain text here (FAQ +3 entries).
  • e2e/home.spec.ts: FAQ heading + first question visible, FAQPage JSON-LD present, no aggregateRating.
  • tests/unit/faq-section.test.tsx, coupons-store-page.test.ts, coupons-index-page.test.ts as above.

Owner questions

  1. "Trusted" stays in the home title (claim-inventory owner question 9, still open) — say the word and it drops to Caramel: Free Coupon Extension & Honey Alternative (50).
  2. SimplyCodes FAQ: the only claim about them is "does not publish its source code" (absence on their own site today). If you would rather not name a second competitor on the home page, delete that one entry — nothing else depends on it.
  3. /pricing no longer says "alternative to Honey" in its snippet by design (it was cannibalising home). Confirm you are fine with the pricing snippet being purely price-intent.

Artifact

C:\Users\alaed\Documents\Github\caramel-artifact\seo-2026-09-11\query-brief.md (the numbers above), STATE.md, claim-inventory.md.

Not verified here

  • Live SERP effect — needs a deploy plus a GSC re-read; compare /pricing CTR and the coupon extension / Safari query positions against the 2026-09-11 baseline after ~4 weeks.
  • The e2e suite was not run locally (needs the DB-backed Playwright harness); the unit files touched were run individually (see above). CI runs both.

🤖 Generated with Claude Code

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