Skip to main content

SUPERSEDED 2026-10-02: the core approach here — separate round CAD Price objects priced to TRACK or sit below spot FX (so a Canadian number differs from the USD number), a visible USD/CAD toggle, and localStorage/geo-IP persistence — is no longer the house pattern. Founder decision 2026-10-02 (decisions/2026-10-02-one-number-pricing.md) replaced it with ONE number for every product, identical in USD and CAD, no toggle. Keep this file for history; do not use it as a model for new pricing. The CAD Price objects this decision commissioned for SermonWise, ITW Premium and PewSearch Premium (the $24.95/$12.95/$6.45 pairs) are pending a founder-approved archive — see the one-number-pricing decision and data/pricing.yaml.

PARTIAL SUPERSEDE 2026-05-02: the FuneralWiseAI setup amounts proposed here ($949 USD / $1,295 CAD) were revised to $745 USD / $995 CAD in decisions/2026-05-02-vertical-setup-pricing-revision.md. Recurring monthly amounts ($199/$249) are unchanged. (This note predates the 2026-10-02 supersession above and is kept for history.)

CAD pricing — round prices per currency (2026-04-27)

Context​

Cold-email outreach is being prepared for two markets: churches (via churchwiseai.com) and funeral homes (via funeralwiseai.com). Funeral cold-email targeting will include Canadian funeral homes from the start. ChurchWiseAI also has Canadian customers (PewSearch's directory contains ~24K Canadian churches).

Pricing is currently USD-only. Three options were considered:

  1. Single USD price, Stripe Adaptive Pricing. Stripe auto-converts to local currency at checkout using current FX. Customers see messy non-round numbers (e.g., $1,213.44 CAD). Ops simplicity but bad UX.
  2. Round CAD price tracking spot FX. Independent CAD Price object per product (e.g., $1,295 CAD setup). Defensible at any FX, neutral positioning, FX cushion.
  3. Round CAD price below spot FX. Independent CAD Price object priced as a small Canadian concession (e.g., $1,249 CAD setup). "Goodwill positioning" but loses margin if CAD weakens.

Decision​

Use separate round CAD Price objects per Stripe Product. Default to "tracks spot FX with small upward buffer" for FX cushion, optionally drop slightly below spot FX as a Canadian-market concession on individual SKUs.

Adopted price grid​

ProductUSDCADNote
FuneralWiseAI setup (one-time)$949$1,295At-FX (~1.36). Buffer for CAD volatility.
FuneralWiseAI monthly$199$249Round CAD, slight margin protection.
ChurchWiseAI Starter$14.95$19.95
ChurchWiseAI Pro$29.95$39.95
ChurchWiseAI Suite$59.95$79.95
PewSearch Premium$6.95$9.95
SermonWise$19.95$24.95

USD setup for FuneralWiseAI moves $999 → $949 in the same change (sub-$1K psychology + makes the CAD pairing clean). All other USD prices unchanged.

Display logic​

  • USD/CAD toggle on every pricing page (/pricing, /funeralwiseai/pricing, /social/pricing, /sermons/pricing).
  • Default by Vercel request.geo.country === 'CA'.
  • User toggle persists in localStorage.
  • For outreach prospects, currency is also persisted on the outreach_contacts row so the cold-email demo page renders in the prospect's currency.

Tax​

  • Stay below CAD $30,000/year revenue from Canadian customers — "small supplier" exemption. No GST/HST registration required.
  • Re-evaluate at $30K CAD/year. At that point, register with CRA, enable Stripe Tax for CA, and add tax-inclusive vs tax-exclusive logic per province.

Why​

  • Standard SaaS pattern. Apple, Spotify, Adobe all use round per-region prices, not literal FX conversion. Customers expect this.
  • Operational simplicity. No daily FX monitoring. No ratcheting price changes. Stripe Price objects are static and explicit.
  • Defensible positioning. Round CAD numbers are easy to communicate in cold email and on the pricing page. "Adaptive" auto-FX prices look amateurish.
  • FX volatility is real. CAD has moved between 1.34 and 1.42 vs USD over the past 12 months. Locking USD-equivalent to a Canadian customer would burn margin in a downturn.

Implementation status — BLOCKED​

This decision is approved but not yet shipped. Implementation is blocked on the in-flight Stripe refactor work owned by another agent in C:\dev\churchwiseai-web (working tree has uncommitted changes to src/lib/pricing.ts and recent commits referenced the Stripe tierForPriceId resolver and Premium Listing price changes).

Implementation queue (post-Stripe-refactor):

  1. Add cad price block per tier in knowledge/data/pricing.yaml (canonical source).
  2. pnpm derive from C:\dev\knowledge to propagate to src/lib/pricing.ts, PRICING.md, product_knowledge.
  3. Stripe live mode: create CAD Price objects against existing Products. Founder-confirmed before each stripe products write. Add new priceIdCad fields to src/lib/pricing.ts.
  4. Currency toggle component on the four pricing pages above. Default by Vercel geo.
  5. Currency wiring in /api/stripe/church-checkout and /api/stripe/checkout-embedded. Server-side picks the right Price ID by currency.
  6. Schema: ALTER TABLE outreach_contacts ADD COLUMN currency TEXT DEFAULT 'USD'.

Re-evaluation triggers​

  • CRA $30K/year threshold reached → register for GST/HST + enable Stripe Tax.
  • CAD spot FX moves outside [1.30, 1.45] for >30 days → revisit specific CAD numbers.
  • Material customer feedback that any specific price feels off-market.

References​

  • Plan: C:\Users\johnm\.claude\plans\here-s-the-scoop-i-wild-swing.md (Phase B / D4)
  • Pricing source of truth: knowledge/data/pricing.yaml
  • Active workstream: stripe-upgrade-guard-2026-04-24 and fa-082-multi-item-stripe-2026-04-24