From 92ef615dc394332833cc355f8b4122ba1b39b47d Mon Sep 17 00:00:00 2001 From: Collins Ikechukwu Date: Sun, 12 Jul 2026 08:23:15 +0100 Subject: [PATCH 1/6] feat(www): rebuild marketing site around payouts-first positioning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Strip the marketing site from ~28 routes to a minimalist Home + Pricing (plus terms/privacy utility), and rewrite all copy to the new payouts-first, Stellar-settled positioning. - Home: 7-section flow — Hero, ProblemStrip, HowItWorks, Features ("what you get"), Developers (single TS payout snippet), Trust, FinalCTA - Replace hero visual with a self-contained NGN payout-status board - Nav reduced to How it works / Pricing / Docs / Become a design partner - Pricing: published rate card + mid-market promise + FAQ - Stage-honest throughout (design-partner CTAs, delivery-time targets) - Remove old product/blog/use-cases/etc. routes, orphaned components, and dead libs; update metadata, StructuredData, and sitemap Co-Authored-By: Claude Opus 4.8 --- .claude/launch.json | 15 +- .../src/app/(marketing)/integrations/page.tsx | 167 ----- apps/www/src/app/about/page.tsx | 279 ------- apps/www/src/app/blog/[slug]/page.tsx | 146 ---- apps/www/src/app/blog/page.tsx | 113 --- apps/www/src/app/blog/rss.xml/route.ts | 41 -- apps/www/src/app/changelog/page.tsx | 235 ------ apps/www/src/app/changelog/rss/route.ts | 33 - apps/www/src/app/compliance/page.tsx | 156 ---- apps/www/src/app/contact/page.tsx | 82 --- apps/www/src/app/cookies/page.tsx | 69 -- apps/www/src/app/customers/[slug]/page.tsx | 121 --- apps/www/src/app/customers/page.tsx | 219 ------ apps/www/src/app/dpa/page.tsx | 138 ---- apps/www/src/app/integrations/page.tsx | 107 --- apps/www/src/app/layout.tsx | 32 +- apps/www/src/app/page.tsx | 16 +- apps/www/src/app/press/[slug]/page.tsx | 117 --- apps/www/src/app/press/page.tsx | 305 -------- apps/www/src/app/pricing/page.tsx | 346 +++------ apps/www/src/app/products/[slug]/page.tsx | 142 ---- .../src/app/products/hosted-checkout/page.tsx | 82 --- apps/www/src/app/products/invoicing/page.tsx | 92 --- apps/www/src/app/products/page.tsx | 90 --- .../www/src/app/products/pay-by-link/page.tsx | 88 --- apps/www/src/app/security/page.tsx | 201 ----- .../www/src/app/security/researchers/page.tsx | 64 -- .../security/responsible-disclosure/page.tsx | 99 --- apps/www/src/app/sitemap.ts | 71 +- apps/www/src/app/sla/page.tsx | 66 -- apps/www/src/app/use-cases/[slug]/page.tsx | 418 ----------- apps/www/src/app/use-cases/page.tsx | 222 ------ apps/www/src/components/StructuredData.tsx | 6 +- .../components/stories/GatewayAssembler.tsx | 209 ------ .../components/stories/ProductStoryLayout.tsx | 81 -- .../www/src/components/v2/AnnouncementBar.tsx | 58 -- apps/www/src/components/v2/DemoWidget.tsx | 694 +++--------------- apps/www/src/components/v2/Developers.tsx | 241 ++---- apps/www/src/components/v2/Features.tsx | 267 +++---- apps/www/src/components/v2/FinalCTA.tsx | 30 +- apps/www/src/components/v2/Footer.tsx | 51 +- apps/www/src/components/v2/Hero.tsx | 51 +- apps/www/src/components/v2/HowItWorks.tsx | 86 +++ apps/www/src/components/v2/Navbar.tsx | 24 +- apps/www/src/components/v2/ProblemStrip.tsx | 34 + apps/www/src/components/v2/Solutions.tsx | 415 ----------- apps/www/src/components/v2/Testimonials.tsx | 121 --- apps/www/src/components/v2/Trust.tsx | 106 +++ apps/www/src/components/v2/TrustStrip.tsx | 170 ----- apps/www/src/lib/blog-posts.ts | 103 --- apps/www/src/lib/demo.ts | 200 ----- apps/www/src/lib/product-pages.ts | 92 --- 52 files changed, 740 insertions(+), 6671 deletions(-) delete mode 100644 apps/www/src/app/(marketing)/integrations/page.tsx delete mode 100644 apps/www/src/app/about/page.tsx delete mode 100644 apps/www/src/app/blog/[slug]/page.tsx delete mode 100644 apps/www/src/app/blog/page.tsx delete mode 100644 apps/www/src/app/blog/rss.xml/route.ts delete mode 100644 apps/www/src/app/changelog/page.tsx delete mode 100644 apps/www/src/app/changelog/rss/route.ts delete mode 100644 apps/www/src/app/compliance/page.tsx delete mode 100644 apps/www/src/app/contact/page.tsx delete mode 100644 apps/www/src/app/cookies/page.tsx delete mode 100644 apps/www/src/app/customers/[slug]/page.tsx delete mode 100644 apps/www/src/app/customers/page.tsx delete mode 100644 apps/www/src/app/dpa/page.tsx delete mode 100644 apps/www/src/app/integrations/page.tsx delete mode 100644 apps/www/src/app/press/[slug]/page.tsx delete mode 100644 apps/www/src/app/press/page.tsx delete mode 100644 apps/www/src/app/products/[slug]/page.tsx delete mode 100644 apps/www/src/app/products/hosted-checkout/page.tsx delete mode 100644 apps/www/src/app/products/invoicing/page.tsx delete mode 100644 apps/www/src/app/products/page.tsx delete mode 100644 apps/www/src/app/products/pay-by-link/page.tsx delete mode 100644 apps/www/src/app/security/page.tsx delete mode 100644 apps/www/src/app/security/researchers/page.tsx delete mode 100644 apps/www/src/app/security/responsible-disclosure/page.tsx delete mode 100644 apps/www/src/app/sla/page.tsx delete mode 100644 apps/www/src/app/use-cases/[slug]/page.tsx delete mode 100644 apps/www/src/app/use-cases/page.tsx delete mode 100644 apps/www/src/components/stories/GatewayAssembler.tsx delete mode 100644 apps/www/src/components/stories/ProductStoryLayout.tsx delete mode 100644 apps/www/src/components/v2/AnnouncementBar.tsx create mode 100644 apps/www/src/components/v2/HowItWorks.tsx create mode 100644 apps/www/src/components/v2/ProblemStrip.tsx delete mode 100644 apps/www/src/components/v2/Solutions.tsx delete mode 100644 apps/www/src/components/v2/Testimonials.tsx create mode 100644 apps/www/src/components/v2/Trust.tsx delete mode 100644 apps/www/src/components/v2/TrustStrip.tsx delete mode 100644 apps/www/src/lib/blog-posts.ts delete mode 100644 apps/www/src/lib/demo.ts delete mode 100644 apps/www/src/lib/product-pages.ts diff --git a/.claude/launch.json b/.claude/launch.json index 25527d1..e2cafcb 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -2,17 +2,10 @@ "version": "0.0.1", "configurations": [ { - "name": "www-dev", - "runtimeExecutable": "/Users/0xdevcollins/.nvm/versions/node/v24.12.0/bin/npm", - "runtimeArgs": ["run", "dev", "--workspace=www"], - "port": 3000 - }, - { - "name": "dashboard-dev", - "runtimeExecutable": "/Users/0xdevcollins/.nvm/versions/node/v24.12.0/bin/npm", - "runtimeArgs": ["run", "dev", "--workspace=dashboard"], - "port": 3001 + "name": "www", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev", "--workspace=www", "--", "-p", "3005"], + "port": 3005 } ] } - diff --git a/apps/www/src/app/(marketing)/integrations/page.tsx b/apps/www/src/app/(marketing)/integrations/page.tsx deleted file mode 100644 index 60a413b..0000000 --- a/apps/www/src/app/(marketing)/integrations/page.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import fs from "fs"; -import path from "path"; -import { fileURLToPath } from "url"; -import type { Metadata } from "next"; -import Image from "next/image"; -import Link from "next/link"; -import { ArrowUpRight } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; -import { INTEGRATIONS, type Integration } from "@/lib/integrations"; - -const publicIntegrationsDir = path.join( - path.dirname(fileURLToPath(import.meta.url)), - "../../../../public/integrations", -); - -const availableLogos = new Set( - fs.existsSync(publicIntegrationsDir) - ? fs.readdirSync(publicIntegrationsDir).filter((fileName) => fileName.endsWith(".svg")) - : [], -); - -const statusStyles: Record = { - live: "bg-emerald-100 text-emerald-900", - "coming-soon": "bg-amber-100 text-amber-900", - "on-request": "bg-slate-100 text-slate-900", -}; - -const statusLabel: Record = { - live: "Live", - "coming-soon": "Coming soon", - "on-request": "On request", -}; - -function getInitials(name: string) { - return name - .replace(/[^A-Za-z0-9]/g, "") - .slice(0, 2) - .toUpperCase(); -} - -function hasLogo(slug: string) { - return availableLogos.has(`${slug}.svg`); -} - -const categoryGroups = INTEGRATIONS.reduce>((groups, integration) => { - (groups[integration.category] ??= []).push(integration); - return groups; -}, {}); - -const categories = Object.entries(categoryGroups); - -export const metadata: Metadata = { - title: "Integrations | Useroutr", - description: - "Connect Useroutr to your accounting, treasury, billing, support, and dev tools.", -}; - -export default async function IntegrationsPage() { - return ( - - - - -
-
-
- {categories.map(([category, items]) => ( -
-

- {category} -

-
- {items.map((integration) => ( -
-
-
- {hasLogo(integration.logoSlug) ? ( - {`${integration.name} - ) : ( -
- {getInitials(integration.name)} -
- )} -
-
-
-

- {integration.name} -

- - {statusLabel[integration.status]} - -
-

- {integration.description || "More details coming soon."} -

-
-
-
- ))} -
-
- ))} - -
-
-

Don't see yours?

-

- Request an integration from the Useroutr team, and we’ll follow up with next steps. -

-
- - Request an integration - - -
-
- -
-

Build your own

-

- Use Useroutr's API docs to connect your internal systems or build a custom integration. -

-
- - Read the API docs - - -
-
-
-
-
-
-
-
- ); -} diff --git a/apps/www/src/app/about/page.tsx b/apps/www/src/app/about/page.tsx deleted file mode 100644 index 9fe29b0..0000000 --- a/apps/www/src/app/about/page.tsx +++ /dev/null @@ -1,279 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { ArrowUpRight } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; - -export const metadata: Metadata = { - title: "About — Useroutr", - description: - "Useroutr is building cross-chain stablecoin payment infrastructure. Our story, our team, and what we believe.", - alternates: { canonical: "/about" }, -}; - -const principles = [ - { - title: "Managed by default, self-custody by choice", - body: "Settlement happens on-chain. We provision a managed Stellar wallet for every merchant at signup so they can take payments from day one, with an upgrade path to passkey or bring-your-own self-custody whenever they're ready. The funds never sit on our balance sheet.", - }, - { - title: "Stripe-level developer experience", - body: "Typed SDKs, sensible defaults, real error messages, and docs that read like a tutorial. Integration time is a product feature.", - }, - { - title: "Boring infrastructure, exciting outcomes", - body: "Payments should be invisible. We obsess over the boring parts — reconciliation, retries, idempotency, edge cases — so your team can focus on the business.", - }, - { - title: "Honest pricing", - body: "One transparent rate. Network fees passed through at cost. No setup, no minimums, no surprises in the contract.", - }, -]; - -const team = [ - { - name: "Mira Adeoye", - role: "Co-founder, CEO", - bio: "Previously led international payouts at Plaid. Built the first ACH-to-stablecoin bridge for a top-5 fintech.", - initials: "MA", - tone: "bg-[#e8eafb] text-ink", - }, - { - name: "Lukas Vogel", - role: "Co-founder, CTO", - bio: "Former staff engineer at Stripe Treasury. Wrote the original double-entry ledger that powers most of crypto-fiat conversion today.", - initials: "LV", - tone: "bg-[#fbeadc] text-ink", - }, - { - name: "Priya Ravichandran", - role: "Head of Compliance", - bio: "Built BSA/AML programs at Coinbase and Square. CAMS, formerly with the U.S. Treasury's Office of Foreign Assets Control.", - initials: "PR", - tone: "bg-[#e3f5e8] text-ink", - }, - { - name: "Daniel Otieno", - role: "Head of Engineering", - bio: "Built payment rails for M-Pesa across East Africa. Believes deeply in the boring parts of finance.", - initials: "DO", - tone: "bg-[#f0e3fb] text-ink", - }, -]; - -/** - * Each investor renders as either a wordmark image (when `lockup` is set) - * or styled text (fallback). Drop a new SVG into /public/brand-mark/ and - * point `lockup` at it to upgrade an entry from text to a real logo. - */ -const investors: { name: string; lockup?: string }[] = [ - { name: "Bessemer Venture Partners" }, - { - name: "Stellar Development Foundation", - lockup: "/brand-mark/stellar-foundation.svg", - }, - { name: "Coinbase Ventures" }, - { name: "Multicoin Capital" }, - { name: "South Park Commons" }, -]; - -export default function AboutPage() { - return ( - - - - We’re building the{" "} - last payment - processor your business will ever need. - - } - description="One API for accepting and settling payments across every chain and every fiat rail. Settlement on-chain, audited, and built by people who have shipped payment infrastructure at the largest fintechs in the world." - /> - - {/* Story */} -
-
-
-
- The story -
-
-
-

- We started Useroutr after watching the same problem repeat - itself at every fintech we worked at: payments break across - borders, custody concentrates risk, and every “simple - payment” ends up stitched together from four vendors and - a spreadsheet. -

-

- The web3 payments wave promised to fix it. Cross-border - settlement in seconds, fees measured in pennies, programmable - money. But every product we tried held our funds, owned our - customers, or required us to become money transmitters - ourselves. The unit economics never worked. -

-

- Useroutr is what we wished we’d had. One API that takes - payments in any currency, on any chain, and settles to wherever - your business actually keeps money — without ever holding it - in between.{" "} - - No custody. No surprises. No four-vendor stack. - -

-
-
-
- - {/* Principles */} -
-
-
-

- What we{" "} - believe. -

-
-
- {principles.map((p, i) => ( -
- - [{String(i + 1).padStart(2, "0")}] - -

- {p.title} -

-

- {p.body} -

-
- ))} -
-
-
- - {/* Team */} -
-
-
-

- Built by people who have{" "} - shipped{" "} - this before. -

-

- The founding team has shipped payment products at Stripe, - Plaid, Coinbase, Square, and M-Pesa. -

-
- -
- {team.map((m) => ( -
- - {m.initials} - -
-
- {m.name} -
-
- {m.role} -
-

- {m.bio} -

-
-
- ))} -
- -
- - We’re hiring - - -
-
-
- - {/* Investors */} -
-
-
-
- Backed by -
-
- {investors.map((inv) => - inv.lockup ? ( - /* eslint-disable-next-line @next/next/no-img-element */ - {inv.name} - ) : ( - - {inv.name} - - ), - )} -
-
-
-
-
-
- ); -} diff --git a/apps/www/src/app/blog/[slug]/page.tsx b/apps/www/src/app/blog/[slug]/page.tsx deleted file mode 100644 index 3e54c6f..0000000 --- a/apps/www/src/app/blog/[slug]/page.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { notFound } from "next/navigation"; -import { ArrowLeft } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { getAllPosts, getPost } from "@/lib/blog"; - -const categoryStyles: Record = { - Engineering: "bg-[#e8eafb] text-[#3b3da6]", - Industry: "bg-[#e6f4ec] text-[#1f6c43]", - "Case studies": "bg-[#fbeadc] text-[#a05418]", - "Inside Useroutr": "bg-[#f0e3fb] text-[#6b21a8]", -}; - -export function generateStaticParams() { - return getAllPosts().map((p) => ({ slug: p.slug })); -} - -export async function generateMetadata({ - params, -}: { - params: Promise<{ slug: string }>; -}): Promise { - const { slug } = await params; - const post = getPost(slug); - if (!post) return { title: "Blog — Useroutr" }; - return { - title: `${post.title} — Useroutr`, - description: post.excerpt, - alternates: { canonical: `/blog/${slug}` }, - }; -} - -export default async function BlogPostPage({ - params, -}: { - params: Promise<{ slug: string }>; -}) { - const { slug } = await params; - const post = getPost(slug); - if (!post) notFound(); - - // Dynamically import the compiled MDX file - let MDXContent: React.ComponentType; - try { - const mod = await import(`../../../../content/blog/${slug}.mdx`); - MDXContent = mod.default; - } catch { - notFound(); - } - - return ( - - - {/* Breadcrumb ribbon */} -
-
- - ↘ blog / {post.category.toLowerCase()} - - - - All posts - -
-
- - {/* Article header */} -
-
-
-
- - {post.category} - - - {post.readTime} read - -
- -

- {post.title} -

- -

- {post.excerpt} -

- -
- {post.author} - · - - {new Date(post.date).toLocaleDateString("en-US", { - month: "long", - day: "numeric", - year: "numeric", - })} - -
-
-
-
- - {/* Article body */} -
-
-
- -
-
-
- - {/* Footer nav */} -
-
-
- - - Back to all posts - -
-
-
-
-
- ); -} diff --git a/apps/www/src/app/blog/page.tsx b/apps/www/src/app/blog/page.tsx deleted file mode 100644 index a4fa8bd..0000000 --- a/apps/www/src/app/blog/page.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { ArrowRight, Rss } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; -import { getAllPosts } from "@/lib/blog"; - -export const metadata: Metadata = { - title: "Blog — Useroutr", - description: - "Notes on payment infrastructure, stablecoin rails, and the businesses building on them.", - alternates: { canonical: "/blog" }, -}; - -const categoryStyles: Record = { - Engineering: "bg-[#e8eafb] text-[#3b3da6]", - Industry: "bg-[#e6f4ec] text-[#1f6c43]", - "Case studies": "bg-[#fbeadc] text-[#a05418]", - "Inside Useroutr": "bg-[#f0e3fb] text-[#6b21a8]", -}; - -export default function BlogPage() { - const posts = getAllPosts(); - - return ( - - - - What we’re{" "} - thinking about - . - - } - description="Notes on payment infrastructure, stablecoin rails, and the businesses building on them. Long-form pieces on the architecture choices behind Useroutr, what we learn from customer integrations, and where stablecoin payments are actually heading. Mostly written by people on the engineering team." - > - - - RSS feed - - - -
-
-
-
- {posts.map((post) => ( - -
- - {post.category} - - - {post.readTime} - -
- -

- {post.title} -

- -

- {post.excerpt} -

- -
-
-
{post.author}
-
- {new Date(post.date).toLocaleDateString("en-US", { - month: "short", - day: "numeric", - year: "numeric", - })} -
-
- -
- - ))} -
-
-
-
-
-
- ); -} diff --git a/apps/www/src/app/blog/rss.xml/route.ts b/apps/www/src/app/blog/rss.xml/route.ts deleted file mode 100644 index beccbfb..0000000 --- a/apps/www/src/app/blog/rss.xml/route.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { getAllPosts } from "@/lib/blog"; - -const BASE_URL = "https://useroutr.com"; - -export async function GET() { - const posts = getAllPosts(); - - const items = posts - .map( - (post) => ` - - <![CDATA[${post.title}]]> - ${BASE_URL}/blog/${post.slug} - ${BASE_URL}/blog/${post.slug} - - ${post.author} - ${post.category} - ${new Date(post.date).toUTCString()} - `, - ) - .join(""); - - const xml = ` - - - Useroutr Blog - ${BASE_URL}/blog - Notes on payment infrastructure, stablecoin rails, and the businesses building on them. - en-us - - ${items} - -`; - - return new Response(xml, { - headers: { - "Content-Type": "application/xml; charset=utf-8", - "Cache-Control": "public, max-age=3600", - }, - }); -} diff --git a/apps/www/src/app/changelog/page.tsx b/apps/www/src/app/changelog/page.tsx deleted file mode 100644 index c269680..0000000 --- a/apps/www/src/app/changelog/page.tsx +++ /dev/null @@ -1,235 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { ArrowUpRight, Rss } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; - -export const metadata: Metadata = { - title: "Changelog — Useroutr", - description: - "What we've shipped on the Useroutr platform. New features, fixes, and breaking changes, in reverse chronological order.", - alternates: { canonical: "/changelog" }, -}; - -type EntryTag = "feature" | "fix" | "breaking" | "infra"; - -interface Entry { - version: string; - date: string; - title: string; - tags: EntryTag[]; - body: string; - bullets?: string[]; -} - -const entries: Entry[] = [ - { - version: "v1.18", - date: "May 14, 2026", - title: "Multi-currency settlement reports", - tags: ["feature"], - body: "Settlement reports can now be downloaded with FX-rate snapshots and side-by-side native + reporting currency for every line. Useful for finance teams that close in USD but settle in EURC, XLM, or GBPC.", - bullets: [ - "CSV and JSON exports gain `reporting_currency` and `fx_rate_at_settlement` fields.", - "New dashboard filter: native vs. reporting view.", - "Backfill available on request for settlements since Jan 2026.", - ], - }, - { - version: "v1.17", - date: "May 2, 2026", - title: "Webhook signing v2 (HMAC-SHA256)", - tags: ["feature", "breaking"], - body: "Webhook signatures move to HMAC-SHA256 with timestamp inclusion. The previous v1 signature header is deprecated and will be removed on August 1, 2026.", - bullets: [ - "New header: `Useroutr-Signature: t=,v2=`.", - "Updated verification examples in Node, Python, and Go.", - "Old `Useroutr-Signature-v1` still sent in parallel until cutover.", - ], - }, - { - version: "v1.16", - date: "April 21, 2026", - title: "Pay-by-Link templates", - tags: ["feature"], - body: "Save common payment-link configurations as templates — perfect for recurring invoices, deposit collection, or product purchases that share the same currency mix and expiry.", - }, - { - version: "v1.15", - date: "April 9, 2026", - title: "Visa Direct payouts now GA", - tags: ["feature"], - body: "Push payouts to any Visa or Mastercard debit card in 80 countries. Funds typically arrive in under 30 minutes. Available in the dashboard and via the `/v1/payouts` endpoint.", - }, - { - version: "v1.14", - date: "March 27, 2026", - title: "Faster cold-start on hosted checkout", - tags: ["infra"], - body: "Hosted checkout pages now ship a smaller JS bundle and resolve the merchant’s preferred payment methods server-side. First Contentful Paint is down ~38% on slow connections.", - }, - { - version: "v1.13", - date: "March 11, 2026", - title: "Idempotency keys are now required for write operations", - tags: ["breaking"], - body: "POST/PUT/DELETE requests must include an `Idempotency-Key` header. Requests without one will be rejected with a 400. This change makes retries safe by default and prevents the duplicate-payment class of bugs we keep seeing in customer integrations.", - bullets: [ - "Grace period until June 1, 2026 — requests without keys return 200 with a deprecation header.", - "All official SDKs (v1.13+) generate keys automatically.", - "Recommended: persist your key on the request side until you see a terminal status.", - ], - }, - { - version: "v1.12", - date: "February 28, 2026", - title: "EURC support on Stellar", - tags: ["feature"], - body: "Accept and settle in EURC across Stellar. Add to the `accept` array on any payment, or set as the default settlement currency in your dashboard.", - }, - { - version: "v1.11", - date: "February 14, 2026", - title: "Fix: webhook retry storm after partner outage", - tags: ["fix"], - body: "A bug in our webhook retry scheduler caused a brief storm of duplicate deliveries for ~6 minutes during a partner outage on Feb 12. Root cause and full postmortem published on the status page.", - }, -]; - -const tagStyles: Record = { - feature: "bg-[#e6f4ec] text-[#1f6c43]", - fix: "bg-[#fbeadc] text-[#a05418]", - breaking: "bg-[#f8e2e0] text-[#b13226]", - infra: "bg-[#e8eafb] text-[#3b3da6]", -}; - -const tagLabels: Record = { - feature: "Feature", - fix: "Fix", - breaking: "Breaking", - infra: "Infra", -}; - -export default function ChangelogPage() { - return ( - - - - What we’ve{" "} - shipped. - - } - description="New features, bug fixes, and breaking changes on the Useroutr platform — in reverse chronological order." - > -
- - - RSS feed - - - API reference - - -
-
- -
-
-
-
    - {entries.map((e) => ( -
  1. - {/* Left meta column */} -
    -
    - {e.date} -
    -
    - {e.version} -
    -
    - - {/* Body */} -
    -
    - {e.tags.map((t) => ( - - {tagLabels[t]} - - ))} -
    -

    - {e.title} -

    -

    - {e.body} -

    - {e.bullets && ( -
      - {e.bullets.map((b, i) => ( -
    • {b}
    • - ))} -
    - )} -
    -
  2. - ))} -
- -
- - Older entries archived in the{" "} - - GitHub log - - -
-
-
-
-
-
- ); -} diff --git a/apps/www/src/app/changelog/rss/route.ts b/apps/www/src/app/changelog/rss/route.ts deleted file mode 100644 index b8ae8db..0000000 --- a/apps/www/src/app/changelog/rss/route.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { BLOG_POSTS } from "@/lib/blog-posts"; - -export async function GET() { - const siteUrl = "https://useroutr.com"; - const latest = BLOG_POSTS.slice(0, 10); - - const rss = ` - - - Useroutr Updates - Latest updates from Useroutr. - ${siteUrl}/changelog - ${latest - .map( - (post) => ` - ${post.title} - ${siteUrl}${post.canonicalPath} - ${siteUrl}${post.canonicalPath} - ${new Date(post.publishedAt).toUTCString()} - - `, - ) - .join("\n")} - -`; - - return new Response(rss, { - headers: { - "Content-Type": "application/rss+xml; charset=utf-8", - "Cache-Control": "public, max-age=3600, stale-while-revalidate=86400", - }, - }); -} diff --git a/apps/www/src/app/compliance/page.tsx b/apps/www/src/app/compliance/page.tsx deleted file mode 100644 index 84edd7f..0000000 --- a/apps/www/src/app/compliance/page.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import type { Metadata } from "next"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { LegalShell, type LegalSection } from "@/components/v2/LegalShell"; - -export const metadata: Metadata = { - title: "Compliance — Useroutr", - description: - "Licensing, KYC/KYB, sanctions screening, AML monitoring, travel-rule support, and reporting at Useroutr.", - alternates: { canonical: "/compliance" }, -}; - -const sections: LegalSection[] = [ - { - id: "licensing", - heading: "Licensing & registrations", - body: ( - <> -

- Useroutr Labs, Inc. is registered with the U.S. Financial Crimes - Enforcement Network (FinCEN) as a Money Services Business - (MSB 31000-258XX). State money-transmitter licensure is in - progress; we partner with regulated banking and money-services - partners where required by local law. -

-

- We maintain similar partnerships and registrations in the EU/EEA, UK, - Nigeria, Kenya, and other jurisdictions where the Services are - offered. A current list is available on request. -

- - ), - }, - { - id: "kyc-kyb", - heading: "KYC & KYB", - body: ( - <> -

- Every business that uses Useroutr completes a Know-Your-Business - (KYB) review covering legal entity, ownership structure, beneficial - owners, and intended use case. Higher-risk verticals (regulated - finance, marketplaces handling consumer funds, etc.) get enhanced - due diligence. -

-

- For consumer-facing flows, we provide a KYC SDK and hosted flow that - satisfies CIP requirements in the U.S. and equivalent rules - elsewhere — passport, government ID, selfie liveness, and address - verification — backed by tier-1 identity providers. -

- - ), - }, - { - id: "sanctions", - heading: "Sanctions screening", - body: ( -

- We screen all account holders, beneficial owners, and counterparties - against OFAC, EU, UK HMT, UN, and other applicable sanctions lists, at - onboarding and continuously thereafter. Transactions involving - sanctioned parties or jurisdictions are blocked at the protocol level. -

- ), - }, - { - id: "aml", - heading: "AML & transaction monitoring", - body: ( - <> -

- Our anti-money-laundering program is overseen by a designated AML - officer and reviewed annually by an independent third party. We - maintain transaction-monitoring rules that flag unusual velocity, - structuring, high-risk geographies, and counterparties associated - with on-chain illicit activity. -

-

- Suspicious activity reports (SARs) are filed with FinCEN and - equivalent foreign authorities when applicable. We do not notify - customers of SAR filings. -

- - ), - }, - { - id: "travel-rule", - heading: "Travel rule", - body: ( -

- For virtual-asset transfers subject to the FATF travel rule, Useroutr - exchanges required originator and beneficiary information with - counterparty VASPs using a standardized protocol (Sumsub TRP, - Notabene, or equivalent). Customers do not need to manage this - themselves. -

- ), - }, - { - id: "jurisdictions", - heading: "Jurisdictions served", - body: ( - <> -

- The Services are currently available to businesses incorporated in - the United States, Canada, the EU/EEA, the United Kingdom, Nigeria, - Kenya, South Africa, Singapore, the UAE, Mexico, and a growing list - of additional jurisdictions. Payouts reach more than 170 countries. -

-

- We do not currently support businesses or end-users in Cuba, Iran, - North Korea, Syria, the Crimea/Donetsk/Luhansk regions of Ukraine, - or other comprehensively sanctioned territories. -

- - ), - }, - { - id: "reporting", - heading: "Reporting & inquiries", - body: ( -

- Law-enforcement and regulatory inquiries should be directed to{" "} - - legal@useroutr.com - - . We respond to legally valid requests promptly and only disclose what - is required by the request. -

- ), - }, -]; - -export default function CompliancePage() { - return ( - - - - Compliance, in{" "} - plain terms. - - } - intro="Licensing, KYC and KYB, sanctions screening, AML monitoring, travel-rule support, and how we handle legal inquiries." - lastUpdated="May 1, 2026" - sections={sections} - /> - - - ); -} diff --git a/apps/www/src/app/contact/page.tsx b/apps/www/src/app/contact/page.tsx deleted file mode 100644 index 3fbb9ec..0000000 --- a/apps/www/src/app/contact/page.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { Metadata } from "next"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; - -export const metadata: Metadata = { - title: "Contact — Useroutr", - description: - "Talk to sales, partnerships, security, legal, or support at Useroutr.", - alternates: { canonical: "/contact" }, -}; - -const contacts = [ - { - team: "Sales", - email: "sales@useroutr.com", - note: "Pricing, rollout plans, and commercial terms.", - }, - { - team: "Partnerships", - email: "partnerships@useroutr.com", - note: "Distribution, ecosystem, and strategic partner programs.", - }, - { - team: "Support", - email: "support@useroutr.com", - note: "Integration questions and production troubleshooting.", - }, - { - team: "Security", - email: "security@useroutr.com", - note: "Vulnerability reports and disclosure coordination.", - }, - { - team: "Legal", - email: "legal@useroutr.com", - note: "DPA requests, procurement, and contract questions.", - }, -] as const; - -export default function ContactPage() { - return ( - - - - Reach the right team in one step. - - } - description="Whether you are evaluating Useroutr, integrating in production, or completing procurement, we route your message to the owner quickly." - /> - -
-
-
- {contacts.map((entry) => ( - - ))} -
-
-
-
-
- ); -} diff --git a/apps/www/src/app/cookies/page.tsx b/apps/www/src/app/cookies/page.tsx deleted file mode 100644 index e124844..0000000 --- a/apps/www/src/app/cookies/page.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import type { Metadata } from "next"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { LegalShell, type LegalSection } from "@/components/v2/LegalShell"; - -export const metadata: Metadata = { - title: "Cookie Policy — Useroutr", - description: - "How Useroutr uses cookies and tracking technologies, and how you can manage them.", - alternates: { canonical: "/cookies" }, -}; - -const sections: LegalSection[] = [ - { - id: "necessary-cookies", - heading: "Necessary cookies", - body: ( -

- We use necessary cookies for authentication, session state, CSRF protection, and language preference. These cookies are always on and cannot be disabled because the dashboard will not work without them. -

- ), - }, - { - id: "analytics-cookies", - heading: "Analytics cookies", - body: ( -

- We use a limited analytics cookie set for page views, session tracking, and event measurement. These cookies are enabled unless you opt out. We use this data to find broken flows, dead links, and to improve the product. -

- ), - }, - { - id: "third-party-trackers", - heading: "No third-party trackers", - body: ( -

- We do not use third-party advertising or tracking pixels. No Facebook Pixel, no Google Ads remarketing, no TikTok, and no LinkedIn Insight Tag are loaded on useroutr.com. -

- ), - }, - { - id: "opt-out", - heading: "Opt-out", - body: ( -

- You can opt out at any time from the dashboard footer settings, by enabling Do-Not-Track in your browser, or by blocking third-party cookies in your browser. We honor Do-Not-Track requests and we do not use tracking cookies to build profiles or serve ads. -

- ), - }, -]; - -export default function CookiePolicyPage() { - return ( - - - - How we use cookies - - } - intro="We use cookies sparingly. Almost everything on useroutr.com works without them; we only set the ones we need to keep you signed in and to measure whether the site is actually working." - lastUpdated="May 29, 2026" - sections={sections} - /> - - - ); -} diff --git a/apps/www/src/app/customers/[slug]/page.tsx b/apps/www/src/app/customers/[slug]/page.tsx deleted file mode 100644 index 166338c..0000000 --- a/apps/www/src/app/customers/[slug]/page.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { notFound } from "next/navigation"; -import { ArrowLeft } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; - -const stories = { - "helix-labs": { - company: "Helix Labs", - metric: "$2.4M annual fees saved", - summary: - "Helix Labs consolidated card, crypto, and payout processing into one reconciliation model.", - body: [ - "Before Useroutr, Helix Labs reconciled four vendors and two internal ledgers. Finance spent days stitching payout outcomes and FX spread into one close package.", - "After migrating checkout and disbursements to Useroutr, Helix moved to one transaction timeline and one settlement export. Engineering removed custom retry logic from three services.", - "The measured outcome was lower payment ops cost and faster month-end close, with annualized vendor-fee savings of approximately $2.4M.", - ], - }, - brushwood: { - company: "Brushwood", - metric: "97% lower payout costs", - summary: - "Brushwood replaced expensive wires with stablecoin-funded global payout rails.", - body: [ - "Brushwood pays creators across Africa and Southeast Asia. Wire fees and failure retries were eroding margin on every payout cycle.", - "Using Useroutr bulk payouts, Brushwood moved high-volume corridors to lower-cost rails and gained per-recipient retry controls.", - "Fee savings reached 97% on key corridors while maintaining predictable payout reliability.", - ], - }, - pelago: { - company: "Pelago Markets", - metric: "DSO dropped to 14 days", - summary: - "Pelago shortened cash conversion cycles by moving invoice collection to on-chain settlement.", - body: [ - "Pelago relied on SWIFT-heavy receivables for international customers, creating long settlement delays and limited payment visibility.", - "With Useroutr invoice checkout, customers paid through stablecoin rails while treasury settled into preferred accounts and currencies.", - "The result was a DSO improvement from 41 days to 14 days and materially better forecasting confidence.", - ], - }, -} as const; - -type StorySlug = keyof typeof stories; - -export function generateStaticParams() { - return Object.keys(stories).map((slug) => ({ slug })); -} - -export async function generateMetadata({ - params, -}: { - params: Promise<{ slug: string }>; -}): Promise { - const { slug } = await params; - const story = stories[slug as StorySlug]; - if (!story) return { title: "Customer Story — Useroutr" }; - - return { - title: `${story.company} — Customer Story — Useroutr`, - description: story.summary, - alternates: { canonical: `/customers/${slug}` }, - }; -} - -export default async function CustomerStoryPage({ - params, -}: { - params: Promise<{ slug: string }>; -}) { - const { slug } = await params; - const story = stories[slug as StorySlug]; - if (!story) { - notFound(); - } - - return ( - - -
-
-
- - - Back to customers - - -

- {story.company} -

- -

{story.summary}

- -
-
- Key outcome -
-
- {story.metric} -
-
- -
- {story.body.map((paragraph) => ( -

{paragraph}

- ))} -
-
-
-
-
-
- ); -} diff --git a/apps/www/src/app/customers/page.tsx b/apps/www/src/app/customers/page.tsx deleted file mode 100644 index 5ca12d5..0000000 --- a/apps/www/src/app/customers/page.tsx +++ /dev/null @@ -1,219 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { ArrowRight, ArrowUpRight } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; - -export const metadata: Metadata = { - title: "Customers — Useroutr", - description: - "Marketplaces, fintechs, and global businesses building on Useroutr's cross-chain stablecoin payment infrastructure.", - alternates: { canonical: "/customers" }, -}; - -const logos = [ - "Helix Labs", - "Brushwood", - "Ardent Capital", - "Lagosgrid", - "Northsea Studio", - "Pelago Markets", - "Atlas Pay", - "Quanta", -]; - -const stories = [ - { - slug: "helix-labs", - company: "Helix Labs", - industry: "B2B marketplace", - headline: "Replaced four vendors with one ledger.", - metric: "$2.4M", - metricLabel: "Annual fees saved", - body: "Helix Labs was running cards on Stripe, USDC on Circle, off-ramp on a third vendor, and bank payouts on a fourth. Reconciling across four ledgers cost their finance team three days a month.", - tone: "bg-[#e8eafb]", - initials: "HL", - }, - { - slug: "brushwood", - company: "Brushwood", - industry: "Creator marketplace", - headline: "$25/wire → basically free.", - metric: "97%", - metricLabel: "Lower payout costs", - body: "Brushwood pays 1,200 contractors across Nigeria, Kenya, and the Philippines every month. Wire fees were eating their unit economics. Useroutr's stablecoin payouts landed in seconds at less than a cent of network fee per transaction.", - tone: "bg-[#fbeadc]", - initials: "BW", - }, - { - slug: "pelago", - company: "Pelago Markets", - industry: "Cross-border treasury", - headline: "Same-day settlement on cross-border AR.", - metric: "14 days", - metricLabel: "DSO, down from 41", - body: "Pelago's customers in Europe and Latin America were paying invoices via SWIFT — 3 to 5 days to land, plus 1.2% in fees. Useroutr's USDC-on-Stellar checkout cut DSO from 41 days to 14 and dropped fee cost by 95%.", - tone: "bg-[#e3f5e8]", - initials: "PM", - }, -]; - -export default function CustomersPage() { - return ( - - - - Built with the teams who feel{" "} - payment pain{" "} - every day. - - } - description="Marketplaces, fintechs, treasury teams, and cross-border businesses use Useroutr to take and settle payments without managing four vendors." - /> - - {/* Customer logos */} -
-
-
- {logos.map((l) => ( -
- - {l} - -
- ))} -
-
-
- - {/* Case studies */} -
-
-
-

- Case studies - . -

-
- -
- {stories.map((s) => ( - - {/* Visual mark */} -
- - {s.initials} - -
-
- {s.company} -
-
- {s.industry} -
-
-
- - {/* Body */} -
-

- {s.headline} -

-

- {s.body} -

-
- - {/* Metric */} -
-
- {s.metric} -
-
- {s.metricLabel} -
-
- - {/* Arrow */} - - - - - - - ))} -
-
-
- - {/* CTA */} -
-
-
-

- Want your team in this lineup? -

-

- We’re onboarding a small number of design-partner teams - each month. We’d love to hear what you’re building. -

-
- - - Talk to us - - - - - See use cases - - -
-
-
-
-
-
- ); -} diff --git a/apps/www/src/app/dpa/page.tsx b/apps/www/src/app/dpa/page.tsx deleted file mode 100644 index 2301545..0000000 --- a/apps/www/src/app/dpa/page.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import type { Metadata } from "next"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { LegalShell, type LegalSection } from "@/components/v2/LegalShell"; - -export const metadata: Metadata = { - title: "Data Processing Agreement — Useroutr", - description: - "Useroutr's Data Processing Agreement for payment processing on behalf of customers, including subprocessors, transfers, and security measures.", - alternates: { canonical: "/dpa" }, -}; - -const sections: LegalSection[] = [ - { - id: "roles", - heading: "Roles", - body: ( -

- When you use Useroutr to process payments on behalf of your customers, you are the controller and Useroutr is the processor under GDPR Article 28 and UK GDPR Article 28. We only process personal data on your instructions. -

- ), - }, - { - id: "categories-of-data", - heading: "Categories of data", - body: ( -
    -
  • Payer name and email address, and IP address when interacting with the checkout or dashboard.
  • -
  • Payment amount, currency, timestamps, and transaction metadata you supply.
  • -
  • KYB documents and identity information you provide to support onboarding.
  • -
- ), - }, - { - id: "sub-processors", - heading: "Sub-processors", - body: ( - <> -

We rely on a small set of subprocessors to run the service:

-
    -
  • Stripe (US, Standard Contractual Clauses)
  • -
  • Circle (US, Standard Contractual Clauses)
  • -
  • AWS infrastructure in eu-west-1 and us-east-1
  • -
  • PostgreSQL on Supabase or on your AWS environment
  • -
  • BullMQ job processing on AWS ElastiCache
  • -
  • Resend transactional email (US, Standard Contractual Clauses)
  • -
  • Better Stack monitoring and alerting (EU)
  • -
- - ), - }, - { - id: "international-transfers", - heading: "International transfers", - body: ( -

- Standard Contractual Clauses are in place for US-based subprocessors. EU customers can request a data residency option for their production environment on request, subject to additional cost. -

- ), - }, - { - id: "security-measures", - heading: "Security measures", - body: ( -
    -
  • TLS 1.3 for data in transit.
  • -
  • AES-256-GCM encryption at rest for sensitive fields.
  • -
  • Keys managed by AWS KMS and rotated according to our key management policy.
  • -
  • Audit logs retained for 90 days standard, with 1 year retention available on Enterprise plans.
  • -
- ), - }, - { - id: "data-retention", - heading: "Data retention", - body: ( - <> -

Payment data is retained for 7 years to meet regulatory and accounting requirements.

-

- Personal data (PII) can be deleted on request within 30 days, except where retention is required by law, such as anti-money-laundering or accounting obligations. -

- - ), - }, - { - id: "sub-processor-notification", - heading: "Sub-processor notification", - body: ( -

- We will notify your billing contact by email at least 30 days before adding or materially changing a sub-processor. We also post updates to status.useroutr.com. -

- ), - }, - { - id: "audit-rights", - heading: "Audit rights", - body: ( -

- An annual SOC 2 Type II report is available on request under NDA. Direct audits are available only on Enterprise plans with a mutual NDA and 30 days’ notice. -

- ), - }, - { - id: "signing", - heading: "Signing", - body: ( -

- This DPA is auto-incorporated into Useroutr Terms. A standalone signed copy is available for procurement on request at{' '} - - legal@useroutr.com - - . -

- ), - }, -]; - -export default function DpaPage() { - return ( - - - - Data Processing Agreement - - } - intro="When you use Useroutr to process payments on behalf of your customers, you're the controller and we're the processor under GDPR Article 28 (and UK GDPR Article 28)." - lastUpdated="May 29, 2026" - sections={sections} - /> - - - ); -} diff --git a/apps/www/src/app/integrations/page.tsx b/apps/www/src/app/integrations/page.tsx deleted file mode 100644 index ab8da6a..0000000 --- a/apps/www/src/app/integrations/page.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { ArrowUpRight } from "lucide-react"; -import { PageShell } from "@/components/site/PageShell"; -import { PageEnter } from "@/components/site/PageEnter"; -import { PageMast } from "@/components/v2/PageMast"; -import { BrandLogo } from "@/components/v2/BrandLogo"; - -export const metadata: Metadata = { - title: "Integrations — Useroutr", - description: - "Connect Useroutr to accounting, ERP, communication, and automation tools your team already uses.", - alternates: { canonical: "/integrations" }, -}; - -const integrationGroups = [ - { - title: "Accounting and ERP", - items: ["quickbooks", "xero", "netsuite"], - }, - { - title: "Automation and workflows", - items: ["zapier", "notion", "webhooks"], - }, - { - title: "Ops and communication", - items: ["slack", "github"], - }, - { - title: "Payments and rails", - items: ["stripe", "moneygram", "stellar"], - }, -] as const; - -export default function IntegrationsPage() { - return ( - - - - Works with the stack you already run. - - } - description="Connect operations, accounting, and notifications without building one-off glue code. Use native integrations where available and webhooks for everything else." - /> - -
-
- {integrationGroups.map((group) => ( -
-

- {group.title} -

-
- {group.items.map((id) => ( -
- - - {id.replace("-", " ")} - -
- ))} -
-
- ))} -
-
- -
-
-

- Need a custom integration? -

-

- Every payment and payout transition emits a typed webhook payload. Most teams ship custom integrations in less than a week. -

-
- - Read webhook docs - - - - Talk to integrations team - -
-
-
-
-
- ); -} diff --git a/apps/www/src/app/layout.tsx b/apps/www/src/app/layout.tsx index f45647b..8d93b1c 100644 --- a/apps/www/src/app/layout.tsx +++ b/apps/www/src/app/layout.tsx @@ -50,18 +50,18 @@ const jetMono = JetBrains_Mono({ }); export const metadata: Metadata = { - title: "Useroutr — Pay anything. Settle everywhere.", + title: + "Useroutr — Payouts to bank accounts & mobile money, settled on Stellar", description: - "Cross-chain stablecoin payment infrastructure built on Stellar. One SDK, one API, one dashboard for accepting payments and settling them where you want — managed wallets out of the box, self-custody when you want.", + "The payout platform for businesses paying Africa. Accept USDC from any major chain and deliver to bank accounts and mobile money in Nigeria — settled on Stellar, at a fraction of legacy cost.", keywords: [ - "stablecoin payment processor", - "stellar payment gateway", - "crypto payment infrastructure", - "cross-chain payment API", - "USDC payment processing", - "MoneyGram API", - "stellar soroban payments", - "global payouts API", + "cross-border payouts", + "stablecoin payouts", + "Nigeria payout API", + "mobile money API", + "USDC to NGN", + "stellar payments", + "bulk disbursement API", "Useroutr", ], authors: [{ name: "Useroutr" }], @@ -71,9 +71,10 @@ export const metadata: Metadata = { metadataBase: new URL("https://useroutr.com"), alternates: { canonical: "/" }, openGraph: { - title: "Useroutr — Pay anything. Settle everywhere.", + title: + "Useroutr — Payouts to bank accounts & mobile money, settled on Stellar", description: - "Cross-chain stablecoin payment infrastructure built on Stellar. Settlement on-chain, managed wallets out of the box.", + "Accept USDC from any major chain and deliver to bank accounts and mobile money in Nigeria — settled on Stellar.", url: "https://useroutr.com", siteName: "Useroutr", images: [ @@ -81,7 +82,7 @@ export const metadata: Metadata = { url: "/og-image.jpg", width: 1200, height: 630, - alt: "Useroutr — cross-chain stablecoin payments", + alt: "Useroutr — cross-border payouts settled on Stellar", }, ], locale: "en_US", @@ -89,9 +90,10 @@ export const metadata: Metadata = { }, twitter: { card: "summary_large_image", - title: "Useroutr — Pay anything. Settle everywhere.", + title: + "Useroutr — Payouts to bank accounts & mobile money, settled on Stellar", description: - "Cross-chain stablecoin payment infrastructure built on Stellar.", + "The payout platform for businesses paying Africa. Settled on Stellar.", creator: "@useroutr", images: ["/twitter-image.jpg"], }, diff --git a/apps/www/src/app/page.tsx b/apps/www/src/app/page.tsx index 17a4a9d..f3d912c 100644 --- a/apps/www/src/app/page.tsx +++ b/apps/www/src/app/page.tsx @@ -1,15 +1,13 @@ "use client"; import { useState } from "react"; -import { AnnouncementBar } from "@/components/v2/AnnouncementBar"; import { Navbar } from "@/components/v2/Navbar"; import { Hero } from "@/components/v2/Hero"; -import { TrustStrip } from "@/components/v2/TrustStrip"; +import { ProblemStrip } from "@/components/v2/ProblemStrip"; +import { HowItWorks } from "@/components/v2/HowItWorks"; import { Features } from "@/components/v2/Features"; -import { Pricing } from "@/components/v2/Pricing"; -import { Solutions } from "@/components/v2/Solutions"; import { Developers } from "@/components/v2/Developers"; -import { Testimonials } from "@/components/v2/Testimonials"; +import { Trust } from "@/components/v2/Trust"; import { FinalCTA } from "@/components/v2/FinalCTA"; import { Footer } from "@/components/v2/Footer"; import { WaitlistModal } from "@/components/site/WaitlistModal"; @@ -20,16 +18,14 @@ export default function Home() { return ( <> -
- + + - - - +