Skip to main content
Podium supports four payment methods. This page covers how each one works, the webhook events that drive them, and how creators get paid through Stripe Connect.

Payment Methods at a Glance

MethodFlowSettlementWhen to Use
StripePaymentIntent → card → webhook confirmsFiat (USD)Consumer web/mobile apps
x402HTTP 402 → signed USDC transfer → on-chain verifyUSDC on BaseAgent-to-agent, autonomous
Embedded WalletServer-side USDC transfer → txHash submittedUSDC on BaseAutomated checkout via Privy
CoinbaseCoinbase Commerce charge → webhook confirmsMulti-tokenCrypto-native consumers

Stripe Payments

Payment Intent Flow

Creating a PaymentIntent

curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/checkout \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "points": 0 }'
Response:
{
  "intentId": "pi_3abc123",
  "clientSecret": "pi_3abc123_secret_xyz",
  "status": "requires_payment_method",
  "amount": 2500
}
The 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 the clientSecret with Stripe.js or Stripe Elements:
import { loadStripe } from "@stripe/stripe-js";

const stripe = await loadStripe("pk_live_...");

const { error } = await stripe.confirmCardPayment(clientSecret, {
  payment_method: {
    card: cardElement,
    billing_details: { name: "Jane Doe" },
  },
});

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:
# This updates both the order shippingFee AND the Stripe PaymentIntent amount
curl -X POST https://api.podium.build/api/v1/order/{orderId}/shipping/quote \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "firstName": "Jane", "lastName": "Doe", "address": { ... } }'

Stripe Webhooks

Podium listens for these Stripe webhook events:
EndpointStripe EventWhat Happens
/webhooks/stripe/payment-intent/succeededpayment_intent.succeededOrder → PAID, stock decremented, confirmation email sent
/webhooks/stripe/payment-intent/processingpayment_intent.processingOrder → PAYMENT_PENDING
/webhooks/stripe/payment-intent/payment-failedpayment_intent.payment_failedOrder → PAYMENT_FAILED
/webhooks/stripe/transfer/createdtransfer.createdCreator payout recorded
/webhooks/stripe/account/updatedaccount.updatedConnect account status updated
All webhook endpoints verify the Stripe signature before processing.

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

curl -X POST https://api.podium.build/api/v1/creator/id/{creatorId}/stripe/account \
  -H "Authorization: Bearer YOUR_API_KEY"
Creates a Stripe Connect account for the creator. Returns an account link URL for the creator to complete onboarding (identity verification, bank details).

Payout Flow

1

Payment Received

When a customer’s payment succeeds, Stripe holds the funds.
2

Application Fee Deducted

The platform fee (configurable in BPS) is automatically deducted.
3

Transfer to Creator

Stripe creates a transfer to the creator’s Connect account. The transfer.created webhook records this in Podium as a CreatorPayout.
4

Creator Payout

Funds are deposited to the creator’s bank account on Stripe’s standard payout schedule.

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

curl -X POST https://api.podium.build/api/v1/x402/orders/{orderId}/pay

Payment Requirements Response (402)

When called without an X-PAYMENT header:
{
  "x402Version": 1,
  "schemes": ["exact"],
  "network": "base",
  "payTo": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD1e",
  "maxAmountRequired": "25000000",
  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "resource": "https://api.podium.build/api/v1/x402/orders/clx9order001/pay"
}
FieldDescription
payToThe organization’s x402 receiving address
maxAmountRequiredAmount in USDC atomic units (6 decimals, so 25000000 = $25.00)
assetUSDC contract address on Base
networkbase

X402Payment Model

FieldTypeDescription
idintegerAuto-increment ID
orderIdstringLinked order (unique)
txHashstring?On-chain transaction hash (unique)
networkstringNetwork (e.g., base)
assetstringToken contract address
amountstringUSDC amount (string for precision)
payTostringReceiving address
statusenumPENDINGVERIFIEDSETTLED or FAILED
settlementDataobject?Facilitator settlement metadata

Embedded Wallet Checkout

For automated crypto checkout using Privy server-managed wallets:
curl -X PATCH https://api.podium.build/api/v1/user/{userId}/order/{orderId}/checkout/embedded-wallet \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "txHash": "0xabc123...",
    "amount": "25.00",
    "email": "user@example.com",
    "shippingAddress": null,
    "walletAddress": "0x1234567890abcdef...",
    "chain": "BASE",
    "asset": "USDC"
  }'

How It Works

  1. Your backend uses the Privy SDK to initiate a USDC transfer from the user’s embedded wallet
  2. Wait for on-chain confirmation
  3. Submit the txHash to this endpoint
  4. Podium creates a CryptoPaymentIntent (status CONFIRMED), moves order to PAID, decrements stock
  5. OrderConfirmationEvent fires if email is provided

Request Schema

FieldTypeRequiredDescription
txHashstringYesOn-chain transaction hash
amountstringYesPayment amount
emailstringYesNotification email
shippingAddressobject?NoShipping address (nullable for digital goods)
walletAddressstringYesEthereum address (validated)
chainenumYesBASE
assetenumYesUSDC

Coinbase Commerce

Multi-token crypto checkout via Coinbase Commerce:
curl -X PATCH https://api.podium.build/api/v1/user/{userId}/order/{orderId}/checkout/coinbase \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "callsId": "coinbase_charge_abc123",
    "amount": "25.00",
    "customer": {
      "email": "user@example.com",
      "physicalAddress": {
        "address1": "123 Main St",
        "address2": null,
        "city": "San Francisco",
        "state": "CA",
        "postalCode": "94102",
        "countryCode": "US",
        "name": {
          "firstName": "Jane",
          "familyName": "Doe"
        }
      }
    }
  }'
Creates a CoinbasePayment record (status PENDING), updates order to PAID, decrements stock, and sends confirmation.

Payment Models

ModelPurposeStatus Values
StripePaymentIntentLinks Stripe intents to ordersStripe-managed (requires_payment_method, succeeded, etc.)
X402Paymentx402 protocol payment recordsPENDINGVERIFIEDSETTLED / FAILED
CryptoPaymentIntentEmbedded wallet paymentsPENDINGCONFIRMED
CoinbasePaymentCoinbase Commerce recordsPENDINGCOMPLETED
StripeAccountCreator Stripe Connect accountsStripe-managed
StripeCustomerUser Stripe customer mappings
CreatorPayoutTransfer records for creator payoutsCreated on transfer.created webhook

Endpoint Summary

MethodPathDescription
POST/user/{id}/order/{orderId}/checkoutStripe checkout (returns clientSecret)
PATCH/user/{id}/order/{orderId}/checkout/embedded-walletEmbedded wallet checkout
PATCH/user/{id}/order/{orderId}/checkout/coinbaseCoinbase checkout
POST/x402/orders/{id}/payx402 USDC payment
POST/guest/order/{id}/checkoutGuest Stripe checkout
PATCH/guest/order/{id}/checkout/coinbaseGuest Coinbase checkout
POST/creator/id/{creatorId}/stripe/accountCreate Stripe Connect account
POST/webhooks/stripe/payment-intent/succeededPayment success webhook
POST/webhooks/stripe/payment-intent/processingPayment processing webhook
POST/webhooks/stripe/payment-intent/payment-failedPayment failure webhook
POST/webhooks/stripe/transfer/createdCreator payout webhook
POST/webhooks/stripe/account/updatedConnect account webhook