Payment Methods at a Glance
| Method | Flow | Settlement | When to Use |
|---|---|---|---|
| Stripe | PaymentIntent → card → webhook confirms | Fiat (USD) | Consumer web/mobile apps |
| x402 | HTTP 402 → signed USDC transfer → on-chain verify | USDC on Base | Agent-to-agent, autonomous |
| Embedded Wallet | Server-side USDC transfer → txHash submitted | USDC on Base | Automated checkout via Privy |
| Coinbase | Coinbase Commerce charge → webhook confirms | Multi-token | Crypto-native consumers |
Stripe Payments
Payment Intent Flow
Creating a PaymentIntent
amount reflects the order total minus any points discount, plus shipping fees. If a PaymentIntent already exists for this order and the points amount hasn’t changed, the existing intent is returned. If points changed, the old intent is cancelled and replaced.
Frontend Integration
Use theclientSecret with Stripe.js or Stripe Elements:
Shipping + Payment Amount Updates
When a shipping quote is requested, the shipping fee is added to the order and the Stripe PaymentIntent amount is updated automatically:Stripe Webhooks
Podium listens for these Stripe webhook events:| Endpoint | Stripe Event | What Happens |
|---|---|---|
/webhooks/stripe/payment-intent/succeeded | payment_intent.succeeded | Order → PAID, stock decremented, confirmation email sent |
/webhooks/stripe/payment-intent/processing | payment_intent.processing | Order → PAYMENT_PENDING |
/webhooks/stripe/payment-intent/payment-failed | payment_intent.payment_failed | Order → PAYMENT_FAILED |
/webhooks/stripe/transfer/created | transfer.created | Creator payout recorded |
/webhooks/stripe/account/updated | account.updated | Connect account status updated |
Stripe Connect (Creator Payouts)
Creators receive their share of each sale through Stripe Connect. The platform retains an application fee (STRIPE_PLATFORM_APPLICATION_FEE_BPS) on each transaction.
Onboarding a Creator
Payout Flow
Transfer to Creator
Stripe creates a transfer to the creator’s Connect account. The
transfer.created webhook records this in Podium as a CreatorPayout.x402 Payments (USDC on Base)
Machine-native payments using the HTTP 402 protocol. Agents pay with USDC — no authentication, no card entry, no human interaction. See x402 Protocol Deep Dive for the full specification.Payment Flow
Payment Requirements Response (402)
When called without anX-PAYMENT header:
| Field | Description |
|---|---|
payTo | The organization’s x402 receiving address |
maxAmountRequired | Amount in USDC atomic units (6 decimals, so 25000000 = $25.00) |
asset | USDC contract address on Base |
network | base |
X402Payment Model
| Field | Type | Description |
|---|---|---|
id | integer | Auto-increment ID |
orderId | string | Linked order (unique) |
txHash | string? | On-chain transaction hash (unique) |
network | string | Network (e.g., base) |
asset | string | Token contract address |
amount | string | USDC amount (string for precision) |
payTo | string | Receiving address |
status | enum | PENDING → VERIFIED → SETTLED or FAILED |
settlementData | object? | Facilitator settlement metadata |
Embedded Wallet Checkout
For automated crypto checkout using Privy server-managed wallets:How It Works
- Your backend uses the Privy SDK to initiate a USDC transfer from the user’s embedded wallet
- Wait for on-chain confirmation
- Submit the
txHashto this endpoint - Podium creates a
CryptoPaymentIntent(statusCONFIRMED), moves order toPAID, decrements stock OrderConfirmationEventfires if email is provided
Request Schema
| 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 for digital goods) |
walletAddress | string | Yes | Ethereum address (validated) |
chain | enum | Yes | BASE |
asset | enum | Yes | USDC |
Coinbase Commerce
Multi-token crypto checkout via Coinbase Commerce:CoinbasePayment record (status PENDING), updates order to PAID, decrements stock, and sends confirmation.
Payment Models
| Model | Purpose | Status Values |
|---|---|---|
StripePaymentIntent | Links Stripe intents to orders | Stripe-managed (requires_payment_method, succeeded, etc.) |
X402Payment | x402 protocol payment records | PENDING → VERIFIED → SETTLED / FAILED |
CryptoPaymentIntent | Embedded wallet payments | PENDING → CONFIRMED |
CoinbasePayment | Coinbase Commerce records | PENDING → COMPLETED |
StripeAccount | Creator Stripe Connect accounts | Stripe-managed |
StripeCustomer | User Stripe customer mappings | — |
CreatorPayout | Transfer records for creator payouts | Created on transfer.created webhook |
Endpoint Summary
| Method | Path | Description |
|---|---|---|
POST | /user/{id}/order/{orderId}/checkout | Stripe checkout (returns clientSecret) |
PATCH | /user/{id}/order/{orderId}/checkout/embedded-wallet | Embedded wallet checkout |
PATCH | /user/{id}/order/{orderId}/checkout/coinbase | Coinbase checkout |
POST | /x402/orders/{id}/pay | x402 USDC payment |
POST | /guest/order/{id}/checkout | Guest Stripe checkout |
PATCH | /guest/order/{id}/checkout/coinbase | Guest Coinbase checkout |
POST | /creator/id/{creatorId}/stripe/account | Create Stripe Connect account |
POST | /webhooks/stripe/payment-intent/succeeded | Payment success webhook |
POST | /webhooks/stripe/payment-intent/processing | Payment processing webhook |
POST | /webhooks/stripe/payment-intent/payment-failed | Payment failure webhook |
POST | /webhooks/stripe/transfer/created | Creator payout webhook |
POST | /webhooks/stripe/account/updated | Connect account webhook |

