Skip to content

[Task] Update site CTAs at App Store launch #124

Closed

Description

@leogdion

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:

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 beta
  • src/content/articles/haptic-timer-app.md — FAQ + body TestFlight links
  • src/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
  • #167 merged (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
  • /compare Price cell updated
  • docs/content-guide.md + docs/positioning.md updated
  • 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

Remaining human actions

  1. Wait for App Store approval (listing downloadable).
  2. Merge At App Store launch: fill APP_STORE_URL and flip PRIMARY_CTA to "appstore" #167 flip (or include it in the same PR).
  3. Drop in official App Store badge artwork.
  4. Confirm live Pro pricing in App Store Connect; paste into /compare (and schema if needed).
  5. Run article prose find/replace for TestFlight beta claims + remove hard-coded TestFlight URLs.
  6. Update content-guide / positioning “do not claim” rules.
  7. Deploy and click through https://atleast.app CTAs on phone + desktop.

Activity

  1. added this to the 260907 milestone on Sep 7, 2026
  2. leogdion commented on Sep 7, 2026

    @leogdion
    MemberAuthor

    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.ts is the single source of truth for every CTA on the site:

    export const APP_STORE_URL = "";                    // fill at launch
    export const PRIMARY_CTA: "testflight" | "appstore" = "testflight";

    Three call sites read it and render either the TestFlight or the App Store variant:

    Component TestFlight mode App Store mode
    AppStoreBadge.astro (homepage hero, footer, /use-cases, /guides) TestFlight glyph + "Join the beta on TestFlight" public/app-store-badge.svg
    Nav.astro "Join Beta" button → TESTFLIGHT_URL "Download" button → APP_STORE_URL
    ArticleCta.astro (twice in every guide article) "Join the beta on TestFlight" App Store badge

    The data-testflight-link and data-tf-location attributes are preserved in both modes, so the Plausible TestFlight: Click event keeps firing with its variant and location props through the transition. Verified by building the site with PRIMARY_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

    1. Set APP_STORE_URL to the real listing URL and flip PRIMARY_CTA to 'appstore' — a two-line change in src/config.ts.
    2. Copy pass on the pages that still say "beta" in prose rather than in a CTA: the homepage, /use-cases, /support, and /press. Grep for beta, TestFlight, and "free" before shipping.
    3. Check the App Store badge asset. public/app-store-badge.svg is 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.
    4. Price and availability claims. Milestone 260907 articles were written under a "no App Store availability, ratings, or post-launch price" rule (see 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.
    5. Spot-check one guide article in the built output to confirm both CTAs render the App Store badge and still carry data-tf-location="article-<slug>".
    6. Plausible event naming. The event is still called TestFlight: Click. Renaming it would break historical continuity in the dashboard, so it was deliberately left alone — rename only if you want the split.
    7. Structured data. src/pages/index.astro has a SoftwareApplication schema with offers.price: "0". Revisit if the App Store price differs.
  3. leogdion commented on Sep 26, 2026

    @leogdion
    MemberAuthor

    Done in #190 (ready to merge; merging waits only on the App Store listing going live Sep 27).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions