Repository navigation
[Task] Update site CTAs at App Store launch #124
Description
When AtLeast ships to the App Store (planned end of September 2026): swap the TestFlight CTAs on the homepage and use-cases page for App Store links, and add App Store CTAs to every article published from the content plan.
Prep for this landed in #133 — the switch is in place, but this issue stays open until the App Store listing is live. The mechanical flip lives in #167; this issue covers the surrounding CTA/copy polish that the flag alone does not fix.
What is now in place
src/config.ts is the single source of truth for every CTA on the site. Three call sites read PRIMARY_CTA and render either the TestFlight or the App Store variant:
| Component | TestFlight mode | App Store mode |
|---|---|---|
AppStoreBadge.astro (homepage hero, /use-cases, /guides, /compare) |
TestFlight glyph + "Join the beta on TestFlight" | public/app-store-badge.svg |
Nav.astro |
"Join Beta" → TESTFLIGHT_URL |
"Download" → APP_STORE_URL |
ArticleCta.astro (twice in every guide via ArticleLayout) |
"Join the beta on TestFlight" | App Store badge |
data-testflight-link / data-tf-location are preserved in both modes so Plausible TestFlight: Click keeps working. Guide markdown should not hard-code CTAs (docs/content-guide.md).
Also in the release-day site flip
Ship together with #167:
- Safari Smart App Banner — Add Safari Smart App Banner on App Store launch #187
- Works with Apple Health badge — Add Works with Apple Health badge to the marketing site #188
- Optional: refresh App Store badge artwork / short link via App Store Marketing Tools if
/app-store-badge.svgis stale
Launch prep kit
Status: Ready (pending live App Store URL)
Depends on #167 flipping PRIMARY_CTA once the listing is downloadable. Component CTAs need no per-page edits; the work here is badge + prose + compare/docs.
Required fields / form inputs
Primary flip (owned by #167 — do not duplicate): src/config.ts
export const APP_STORE_URL =
"https://apps.apple.com/us/app/atleast-silent-timer/id6759622997";
export const PRIMARY_CTA: "testflight" | "appstore" = "appstore";This issue — files to edit after (or with) the flip:
| Path | Change |
|---|---|
public/app-store-badge.svg |
Replace hand-rolled placeholder with Apple’s official “Download on the App Store” badge (Marketing Resources / App Store Marketing Guidelines). Current file is a 120×40 black SVG with system text — not official artwork. |
src/pages/compare.astro |
Price row for AtLeast: change 'Free TestFlight beta' → paste-ready from live pricing (e.g. align with App Store Connect / any PRICING constant if present on branch). |
src/pages/index.astro |
SoftwareApplication schema offers.price: '0' — revisit if paid Pro is marketed as the offer; free download with IAP may stay "0". |
src/content/articles/*.md (18 files) |
Replace “free TestFlight beta today” / hard-coded testflight.apple.com/join/WUR3Wf47 links in prose (CTA blocks already auto-flip). |
docs/content-guide.md |
Relax “Do not claim → No App Store availability…”; allow App Store availability + price once live. |
docs/positioning.md |
“currently a free TestFlight beta” → App Store availability line. |
src/pages/privacy.astro |
Optional: event name TestFlight: Click is still accurate for analytics continuity — leave unless product wants rename (see #124 comment history). |
Homepage / /use-cases / /support / /press: no residual “beta” / “TestFlight” prose in page bodies as of branch 167-app-store-url (CTAs are component-driven). Grep again before ship: rg -n 'TestFlight|beta|testflight\\.apple' src docs.
Draft text
Article closing / requirements lines — replace variants of:
…and it is a free TestFlight beta today.
with (pick one voice and apply consistently):
…and it is free to download on the App Store.
or, if Pro pricing should stay out of article bodies:
…Available on the App Store for Apple Watch Series 6 or later (watchOS 26.0+).
Hard-coded TestFlight links in body (must change — not covered by PRIMARY_CTA):
src/content/articles/vibrate-only-timer.md— “join the free TestFlight beta…”src/content/articles/mindfulness-timer-apple-watch.md— free TestFlight betasrc/content/articles/haptic-timer-app.md— FAQ + body TestFlight linkssrc/content/articles/apple-watch-timer-without-sound.md— free TestFlight beta
Prefer pointing readers at the page CTA / App Store URL rather than embedding TestFlight.
/compare AtLeast Price cell (draft — confirm against App Store Connect on ship day):
'Free; Pro $0.99/mo, $9.99/yr (7-day trial), or $49.99 once'(Adjust if Connect differs; keep identical to listing.)
Nav / badge / ArticleCta labels: already correct when PRIMARY_CTA === "appstore" — no draft needed.
Asset checklist
- Official App Store badge SVG/PNG from Apple (replace
public/app-store-badge.svg; keep alt text “Download AtLeast on the App Store”) - Confirm badge clear-space / minimum size vs Apple guidelines
-
#167merged (PRIMARY_CTA = "appstore") so homepage, use-cases, guides, compare, nav, and article CTAs all point at the store URL - Article prose pass (18 guides) + FAQ answers that mention TestFlight
-
/comparePrice cell updated -
docs/content-guide.md+docs/positioning.mdupdated - Spot-check built pages:
/,/use-cases, one guide (both mid + end CTAs),/compare -
make build+make check:links(TestFlight URLs removed from markdown should not 404; App Store URL should be allowed/reachable) - Optional Lighthouse pass after At App Store launch: fill APP_STORE_URL and flip PRIMARY_CTA to "appstore" #167 flip
Timing / rules
- Prepare PR now: badge swap + article/docs/compare copy can be drafted on a branch against
mainwith CTAs still on TestFlight — merge only after listing is live (or same release-day PR as At App Store launch: fill APP_STORE_URL and flip PRIMARY_CTA to "appstore" #167). - Merge on release day with At App Store launch: fill APP_STORE_URL and flip PRIMARY_CTA to "appstore" #167: ideal single ship so users never see App Store buttons next to “free TestFlight beta” prose.
- Do not add per-article CTA markdown —
ArticleLayoutalready injectsArticleCtatwice. - Shipaton / Devpost need the live store URL; site flip is release-day critical path alongside At App Store launch: fill APP_STORE_URL and flip PRIMARY_CTA to "appstore" #167.
Remaining human actions
- Wait for App Store approval (listing downloadable).
- Merge At App Store launch: fill APP_STORE_URL and flip PRIMARY_CTA to "appstore" #167 flip (or include it in the same PR).
- Drop in official App Store badge artwork.
- Confirm live Pro pricing in App Store Connect; paste into
/compare(and schema if needed). - Run article prose find/replace for TestFlight beta claims + remove hard-coded TestFlight URLs.
- Update content-guide / positioning “do not claim” rules.
- Deploy and click through https://atleast.app CTAs on phone + desktop.
Activity
Infra: content collection, article layout, guides hub, CTA switch
leogdion commentedon Sep 7, 2026
Prep for this landed in #133 — the switch is in place, but this issue stays open until the App Store listing is live.
What is now in place
src/config.tsis the single source of truth for every CTA on the site:Three call sites read it and render either the TestFlight or the App Store variant:
AppStoreBadge.astro(homepage hero, footer,/use-cases,/guides)public/app-store-badge.svgNav.astroTESTFLIGHT_URLAPP_STORE_URLArticleCta.astro(twice in every guide article)The
data-testflight-linkanddata-tf-locationattributes are preserved in both modes, so the PlausibleTestFlight: Clickevent keeps firing with itsvariantandlocationprops through the transition. Verified by building the site withPRIMARY_CTA = 'appstore': every CTA switched, and the tracking attributes were still present.Because every guide article routes its CTA through
ArticleCta, articles need no edits at launch — they pick up the change automatically.What remains at launch
APP_STORE_URLto the real listing URL and flipPRIMARY_CTAto'appstore'— a two-line change insrc/config.ts./use-cases,/support, and/press. Grep forbeta,TestFlight, and "free" before shipping.public/app-store-badge.svgis currently a hand-rolled placeholder, not Apple's official artwork. Replace it with the official badge from Apple's marketing resources and confirm it meets Apple's sizing and clear-space guidelines.docs/content-guide.md→ "Do not claim"). Once the app is live, that rule can be relaxed — update the guide, and decide whether articles should mention price.data-tf-location="article-<slug>".TestFlight: Click. Renaming it would break historical continuity in the dashboard, so it was deliberately left alone — rename only if you want the split.src/pages/index.astrohas aSoftwareApplicationschema withoffers.price: "0". Revisit if the App Store price differs.Infra: content collection, article layout, guides hub, CTA switch (#133)
leogdion commentedon Sep 26, 2026
Done in #190 (ready to merge; merging waits only on the App Store listing going live Sep 27).
App Store release: flip CTAs, Smart App Banner, Health badge, launch …