Why
The Footer "Product" column lists four products (Hosted checkout, Pay by link, Invoices, Global payouts) all pointing to `/#product` hash — they should be standalone pages. `/products/gateway` and `/products/payouts` exist on the `feat/phase-1-checkout-cctp-v2-settlement` branch (PR #136). This issue covers the remaining three: `/products` index, `/products/hosted-checkout`, `/products/pay-by-link`, `/products/invoicing`.
Where it's linked from
- Footer "Product" column (4 items)
- Homepage product strip
Design
Reuse `ProductStoryLayout` (black background, italic display headlines, mono labels). Either build full `*Assembler` components like `GatewayAssembler.tsx` and `PayoutsAssembler.tsx`, or use a simpler content-forward layout like the latter.
Copy per page
/products (index)
One engine. Four ways to use it.
The same primitives — accept, route, settle, notify — power every product on Useroutr. Pick the surface that fits your business.
Four cards (each is a link to the product page):
- Hosted checkout — Stripe-style branded checkout. USDC + card + bank, one URL. `/products/hosted-checkout`
- Pay by link — One-link payment requests. No code, no checkout to build. `/products/pay-by-link`
- Invoicing — Send a PDF invoice, get paid in USDC or fiat. `/products/invoicing`
- Global payouts — Bulk disbursements to 174 countries. `/products/payouts`
/products/hosted-checkout
H1: Branded checkout. One URL.
Lead: A drop-in payment page that accepts USDC on five chains, cards via Stripe, bank transfers via ACH or SEPA, and fiat on-ramp through MoneyGram. The customer never leaves your brand.
Features:
- Embed via URL or iframe — no SDK required
- Auto-applies your logo, brand color, company name
- Customer picks payment method; you settle in one asset
- Idempotent re-render: customer can refresh during sign without losing state
- Webhook on every state change
API example:
```http
POST /v1/checkout/sessions
{
"amount": 100.00,
"currency": "USD",
"success_url": "https://yourapp.com/thanks",
"metadata": { "order_id": "ord_123" }
}
→ { "url": "https://checkout.useroutr.com/cs_abc123" }
```
/products/pay-by-link
H1: The link is the integration.
Lead: Generate a payment URL with one API call (or one button in the dashboard). Share it on email, Slack, WhatsApp, an invoice, or a QR code. Customers pay — you get a webhook.
Features:
- Fixed amount, open amount, or pick-from-list
- Single-use or multi-use links
- Custom expiry windows
- Per-link conversion stats (views vs. payments)
- QR code generated automatically
- Works with any payment method the customer picks
API example:
```http
POST /v1/payment-links
{
"amount": 25,
"currency": "USD",
"description": "Coffee subscription · April",
"single_use": false,
"expires_at": "2026-06-01T00:00:00Z"
}
→ {
"id": "lnk_abc123",
"url": "https://pay.useroutr.com/abc12345",
"qr_code_url": "data:image/png;base64,..."
}
```
/products/invoicing
H1: Invoices that get paid. In minutes, not weeks.
Lead: Send a PDF invoice with a payment URL baked in. Customer pays in USDC, card, or bank transfer — you reconcile automatically. Built for B2B teams that hate Stripe-style "click here to enable Treasury."
Features:
- PDF + hosted page generated from the same JSON
- Line items, taxes, discounts, partial payments
- Multi-currency: invoice in EUR, settle in USDC
- Automatic dunning: reminders at +3, +7, +14 days overdue
- Webhook on `invoice.paid`, `invoice.overdue`, `invoice.cancelled`
- CSV export for accountants
API example:
```http
POST /v1/invoices
{
"customer_email": "ap@acme.com",
"customer_name": "Acme Inc.",
"line_items": [
{ "description": "April retainer", "qty": 1, "unit_price": 5000, "amount": 5000 }
],
"currency": "USD",
"due_date": "2026-05-31"
}
→ {
"id": "inv_abc123",
"invoice_number": "INV-2026-042",
"pdf_url": "https://...",
"pay_url": "https://pay.useroutr.com/inv_abc123"
}
```
Acceptance criteria
Why
The Footer "Product" column lists four products (Hosted checkout, Pay by link, Invoices, Global payouts) all pointing to `/#product` hash — they should be standalone pages. `/products/gateway` and `/products/payouts` exist on the `feat/phase-1-checkout-cctp-v2-settlement` branch (PR #136). This issue covers the remaining three: `/products` index, `/products/hosted-checkout`, `/products/pay-by-link`, `/products/invoicing`.
Where it's linked from
Design
Reuse `ProductStoryLayout` (black background, italic display headlines, mono labels). Either build full `*Assembler` components like `GatewayAssembler.tsx` and `PayoutsAssembler.tsx`, or use a simpler content-forward layout like the latter.
Copy per page
/products (index)
Four cards (each is a link to the product page):
/products/hosted-checkout
H1: Branded checkout. One URL.
Lead: A drop-in payment page that accepts USDC on five chains, cards via Stripe, bank transfers via ACH or SEPA, and fiat on-ramp through MoneyGram. The customer never leaves your brand.
Features:
API example:
```http
POST /v1/checkout/sessions
{
"amount": 100.00,
"currency": "USD",
"success_url": "https://yourapp.com/thanks",
"metadata": { "order_id": "ord_123" }
}
→ { "url": "https://checkout.useroutr.com/cs_abc123" }
```
/products/pay-by-link
H1: The link is the integration.
Lead: Generate a payment URL with one API call (or one button in the dashboard). Share it on email, Slack, WhatsApp, an invoice, or a QR code. Customers pay — you get a webhook.
Features:
API example:
```http
POST /v1/payment-links
{
"amount": 25,
"currency": "USD",
"description": "Coffee subscription · April",
"single_use": false,
"expires_at": "2026-06-01T00:00:00Z"
}
→ {
"id": "lnk_abc123",
"url": "https://pay.useroutr.com/abc12345",
"qr_code_url": "data:image/png;base64,..."
}
```
/products/invoicing
H1: Invoices that get paid. In minutes, not weeks.
Lead: Send a PDF invoice with a payment URL baked in. Customer pays in USDC, card, or bank transfer — you reconcile automatically. Built for B2B teams that hate Stripe-style "click here to enable Treasury."
Features:
API example:
```http
POST /v1/invoices
{
"customer_email": "ap@acme.com",
"customer_name": "Acme Inc.",
"line_items": [
{ "description": "April retainer", "qty": 1, "unit_price": 5000, "amount": 5000 }
],
"currency": "USD",
"due_date": "2026-05-31"
}
→ {
"id": "inv_abc123",
"invoice_number": "INV-2026-042",
"pdf_url": "https://...",
"pay_url": "https://pay.useroutr.com/inv_abc123"
}
```
Acceptance criteria