From eda4b55d99f711589190079c7339a70c5d94e03d Mon Sep 17 00:00:00 2001 From: temycodes Date: Fri, 29 May 2026 18:00:34 +0100 Subject: [PATCH] feat: add /pricing page, fix footer link, update sitemap --- apps/www/src/app/pricing/page.tsx | 311 ++++++++++++++++++++++++++ apps/www/src/app/sitemap.ts | 6 + apps/www/src/components/v2/Footer.tsx | 2 +- 3 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 apps/www/src/app/pricing/page.tsx diff --git a/apps/www/src/app/pricing/page.tsx b/apps/www/src/app/pricing/page.tsx new file mode 100644 index 0000000..64dc827 --- /dev/null +++ b/apps/www/src/app/pricing/page.tsx @@ -0,0 +1,311 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { PageShell } from "@/components/site/PageShell"; +import { PageEnter } from "@/components/site/PageEnter"; +import { PageMast } from "@/components/v2/PageMast"; + +export const metadata: Metadata = { + title: "Pricing — Useroutr", + description: + "One per-transaction fee, the same on every rail. Network costs pass through at cost — we never mark up the underlying chain or fiat rail.", + alternates: { canonical: "/pricing" }, +}; + +const checklist = [ + "All payment methods (card, bank, crypto, mobile money)", + "Hosted checkout + pay-by-link + invoices", + "Global payouts to 174 countries", + "Managed Stellar settlement wallet", + "Webhooks + SDKs + sandbox", + "Standard support (email, 1 business day)", +]; + +const rails: { method: string; cost: string }[] = [ + { method: "Card payments (Stripe)", cost: "network fee pass-through, no markup" }, + { method: "Bank transfers (ACH, SEPA)", cost: "network fee pass-through, no markup" }, + { method: "Crypto payments (CCTP V2)", cost: "Circle protocol fee pass-through" }, + { method: "Mobile money (M-Pesa, MTN)", cost: "rail fee pass-through" }, + { method: "Payouts", cost: "included in 0.5%" }, + { method: "FX conversion", cost: "mid-market rate + 30 bps" }, + { method: "Sandbox", cost: "free, unlimited" }, + { method: "Webhook retries", cost: "included, exhaustion after 10 attempts" }, +]; + +const volumeTiers = [ + { threshold: "> $50k / mo", rate: "0.35%" }, + { threshold: "> $500k / mo", rate: "0.30%" }, + { threshold: "> $5M / mo", rate: "Let\u2019s talk", cta: true }, +]; + +const neverCharge = [ + "Setup fees", + "Monthly minimums", + "Hidden FX spreads", + "\u201CExpress settlement\u201D premiums", + "Disputes you win", + "Sandbox usage", +]; + +export default function PricingPage() { + return ( + + + {/* Hero */} + + Plain pricing.{" "} + + No revenue share. + + + } + description="What you'd hope a payment processor would do. One per-transaction fee, the same on every rail. Network costs pass through at cost — we never mark up the underlying chain or fiat rail." + /> + + {/* Starter tier card */} +
+
+
+
+ + The one plan + + +
+ Starter +
+ +
+ + 0.5% + + + per transaction + +
+ +

+ ↓ drops to 0.35% above $50,000 / month +

+ +
    + {checklist.map((item) => ( +
  • + + ✓ + + {item} +
  • + ))} +
+ +
+ + Start building → + +
+
+
+
+
+ + {/* Add-on table */} +
+
+
+

+ What you pay{" "} + per rail. +

+ +
+ + + + + + + + + {rails.map((r) => ( + + + + + ))} + +
+ Method + + Cost +
+ {r.method} + + {r.cost} +
+
+
+
+
+ + {/* Volume pricing strip */} +
+
+
+

+ Grows{" "} + with you. +

+ +
+ {volumeTiers.map((tier) => ( +
+ + {tier.threshold} + + + {tier.rate} + + {tier.cta && ( + + Contact sales → + + )} +
+ ))} +
+
+
+
+ + {/* What we don't charge for */} +
+
+
+

+ What we{" "} + + don’t + {" "} + charge for. +

+ +
+ {neverCharge.map((item) => ( +
+ + ✕ + + + {item} + +
+ ))} +
+
+
+
+ + {/* Enterprise card */} +
+
+
+
+
+ Enterprise +
+ +

+ Custom pricing for teams over $5M / month. +

+ +

+ Dedicated support, custom SLAs, multi-entity contracts, + on-prem audit logs export, KYB review of integrators on your + platform. +

+ +
+ + Talk to the team → + +
+
+
+
+
+
+
+ ); +} diff --git a/apps/www/src/app/sitemap.ts b/apps/www/src/app/sitemap.ts index af2c82e..6847ae2 100644 --- a/apps/www/src/app/sitemap.ts +++ b/apps/www/src/app/sitemap.ts @@ -20,6 +20,12 @@ export default function sitemap(): MetadataRoute.Sitemap { changeFrequency: "monthly", priority: 0.9, }, + { + url: `${baseUrl}/pricing`, + lastModified: now, + changeFrequency: "monthly", + priority: 0.9, + }, ...useCases.map((slug) => ({ url: `${baseUrl}/use-cases/${slug}`, lastModified: now, diff --git a/apps/www/src/components/v2/Footer.tsx b/apps/www/src/components/v2/Footer.tsx index db09859..0f12806 100644 --- a/apps/www/src/components/v2/Footer.tsx +++ b/apps/www/src/components/v2/Footer.tsx @@ -16,7 +16,7 @@ const columns: { title: string; links: LinkItem[] }[] = [ { label: "Pay by link", href: "/#product" }, { label: "Invoices", href: "/#product" }, { label: "Global payouts", href: "/#product" }, - { label: "Pricing", href: "/#pricing" }, + { label: "Pricing", href: "/pricing" }, ], }, {