Choosing a Checkout Method
| Method | Best For | Currency | Auth Required | Human in Loop? |
|---|---|---|---|---|
| Stripe | Consumer web/mobile checkout | USD (fiat) | Yes | Yes — card entry |
| x402 | Agent-native autonomous payments | USDC on Base | No | No — programmatic |
| Embedded Wallet | Automated crypto checkout via Privy | USDC on Base | Yes | No — server-side |
| Coinbase Commerce | Multi-token crypto checkout | Various | Yes | Yes — Coinbase flow |
Order Lifecycle
Create an Order
Orders start asOPEN and can have products added to them. Creating an order with a product in a single call:
Get Open Order
Retrieve the current open order for a user (only one open order at a time):Add Product to Order
Remove Item from Order
Order Status Flow
| Status | Description |
|---|---|
OPEN | Order created, items being added |
PAYMENT_PENDING | Checkout initiated, awaiting payment confirmation |
PAID | Payment confirmed (via webhook or on-chain verification) |
PAYMENT_FAILED | Payment attempt failed |
PROCESSING | Being prepared for shipping |
SHIPPED | Shipping label created, in transit |
DELIVERED | Delivered to customer |
Stripe Checkout
The most common flow for consumer-facing applications. Creates a Stripe PaymentIntent and returns aclientSecret for completing payment on the frontend.
| Field | Type | Default | Description |
|---|---|---|---|
points | integer | 0 | Points to apply as discount |
How It Works
Create PaymentIntent
POST /checkout creates a Stripe PaymentIntent for the order total (minus any points discount). If a PaymentIntent already exists and points haven’t changed, the existing one is reused. If points changed, the old intent is cancelled and a new one is created.Complete Payment
Use the
clientSecret on the frontend with Stripe.js or Stripe Elements to collect payment. The user enters their card and confirms.Webhook Confirmation
Stripe sends
payment_intent.succeeded to /webhooks/stripe/payment-intent/succeeded. Podium updates the order to PAID, decrements inventory, and publishes an OrderConfirmationEvent.x402 Checkout (USDC)
Machine-native payment for autonomous agents. No authentication required — the agent pays with USDC on Base via the x402 protocol. See x402 Payments for the full protocol spec.How It Works
Request Requirements
Agent calls the pay endpoint without an
X-PAYMENT header. The server returns 402 Payment Required with the order amount in USDC, the payTo address, and the network (Base).Sign and Send Payment
Agent constructs a USDC transfer, signs it, and re-calls the endpoint with the
X-PAYMENT header containing the base64-encoded payment proof.x402 checkout requires the organization to have
x402PayToAddress configured in their settings. The payment amount is converted from the order’s cent-based total to USDC (6 decimal places).Embedded Wallet Checkout
For automated crypto checkout using Privy server-managed wallets. The transaction is executed server-side — no user interaction required during payment.| Field | Type | Required | Description |
|---|---|---|---|
txHash | string | Yes | On-chain transaction hash |
amount | string | Yes | Payment amount |
email | string | Yes | Notification email |
shippingAddress | object? | No | Shipping address (nullable) |
walletAddress | string | Yes | Ethereum address of the paying wallet |
chain | enum | Yes | BASE |
asset | enum | Yes | USDC |
How It Works
- Your backend initiates a USDC transfer from the user’s Privy embedded wallet
- After the transaction confirms on-chain, call this endpoint with the
txHash - Podium verifies the wallet, creates a
CryptoPaymentIntent(statusCONFIRMED), updates the order toPAID, and decrements inventory - An
OrderConfirmationEventis published if an email is provided
Coinbase Commerce Checkout
Multi-token crypto checkout via Coinbase Commerce:Discounts and Points
Apply Points Discount
Apply Discount Code
Finalize Points
After successful payment, commit the point spend:Revert Points
On payment failure, return held points to the user:Shipping
Podium integrates with Shippo for shipping rate calculation and label generation.Get Shipping Quote
Returns available shipping rates and updates the Stripe PaymentIntent amount to include shipping:Generate Shipping Label
Guest Checkout
Anonymous buyers can place orders without creating a Podium account.Create Guest Order
Guest Stripe Checkout
clientSecret — same flow as authenticated checkout but without user context.
Guest Coinbase Checkout
Record Payment Failure
If payment fails on the client side (before webhook), notify the server:Order Model
| Field | Type | Description |
|---|---|---|
id | string | CUID2 identifier |
status | enum | Order status (see flow above) |
shippingStatus | enum | PENDING, LABEL_CREATED, IN_TRANSIT, DELIVERED |
points | integer | Points applied as discount |
shippingFee | integer | Shipping cost in cents |
shippingInfo | object? | Shippo tracking data |
items | array | Order items with product snapshots |
createdAt | datetime | Creation timestamp |
updatedAt | datetime | Last update timestamp |
Endpoint Summary
| Method | Path | Description |
|---|---|---|
GET | /user/{id}/order | Get open order |
POST | /user/{id}/order | Create order with product |
GET | /user/{id}/orders | List user orders |
GET | /user/{id}/order/{orderId} | Get order by ID |
POST | /user/{id}/order/{orderId}/product/{productId} | Add product to order |
DELETE | /user/{id}/order/{orderId}/item/{orderItemId} | Remove item |
POST | /user/{id}/order/{orderId}/checkout | Stripe checkout |
PATCH | /user/{id}/order/{orderId}/checkout/embedded-wallet | Embedded wallet checkout |
PATCH | /user/{id}/order/{orderId}/checkout/coinbase | Coinbase checkout |
POST | /user/{id}/order/{orderId}/discount | Apply discount code |
POST | /user/{id}/order/{orderId}/points | Apply points |
PUT | /user/{id}/order/{orderId}/points/finalize | Finalize points |
POST | /user/{id}/order/{orderId}/points/revert | Revert points |
POST | /user/{id}/order/{orderId}/payment-failed | Record payment failure |
POST | /x402/orders/{id}/pay | x402 USDC payment |
POST | /order/{id}/shipping/quote | Shipping quote |
GET | /order/{id} | Get order (generic) |
POST | /guest/order | Create guest order |
POST | /guest/order/{id}/checkout | Guest Stripe checkout |
PATCH | /guest/order/{id}/checkout/coinbase | Guest Coinbase checkout |
POST | /guest/order/{id}/payment-failed | Guest payment failure |

