Ad-hoc pricing

Charge a custom amount without attaching a catalog price. Pass amount, currency, and optionally plan type when creating a Checkout Session. You can also attach a per-session merchant_fee (name + percent and/or fixed cents) without enabling Settings → Fees.

When to use it

Quotes, usage-based invoices, donations, and negotiated deals fit ad-hoc pricing. Prefer catalog prices when the same SKU is reused.

One-time ad-hoc charge

Example request

POST /v1/checkout_sessions
Authorization: Bearer rk_live_...
Content-Type: application/json

{
  "mode": "payment",
  "amount": 12500,
  "currency": "usd",
  "success_url": "https://example.com/thanks",
  "cancel_url": "https://example.com/cancel"
}

Example response

{
  "id": "cs_...",
  "object": "checkout_session",
  "amount": 12500,
  "currency": "usd",
  "status": "open",
  "mode": "live",
  "plan_type": "one_time",
  "url": "https://rollopayments.com/pay/cs_...",
  "expires_at": 1723014400000,
  "livemode": true
}

How to handle it

Redirect to url. Fulfill on payment.succeeded. Fee pass-through and deposit limits still apply. Individual accounts cannot accept $1,000+ per payment.

Ad-hoc with platform fee

Example request

POST /v1/checkout_sessions
Authorization: Bearer rk_live_...
Content-Type: application/json

{
  "mode": "payment",
  "amount": 12500,
  "currency": "usd",
  "success_url": "https://example.com/thanks",
  "merchant_fee": {
    "name": "Handling",
    "percent": 2,
    "amount": 50
  }
}

Example response

{
  "id": "cs_...",
  "object": "checkout_session",
  "amount": 13050,
  "currency": "usd",
  "status": "open",
  "mode": "live",
  "plan_type": "one_time",
  "url": "https://rollopayments.com/pay/cs_...",
  "merchant_fee": { "label": "Handling", "amount": 300 },
  "expires_at": 1723014400000,
  "livemode": true
}

How to handle it

name and label are interchangeable. Settings does not need to be enabled. See Payments & fees and Checkout.

Recurring ad-hoc

Example request

POST /v1/checkout_sessions
Authorization: Bearer rk_live_...
Content-Type: application/json

{
  "mode": "subscription",
  "amount": 9900,
  "currency": "usd",
  "interval": "month",
  "success_url": "https://example.com/welcome",
  "merchant_fee": { "label": "Platform fee", "percent": 3 }
}

Example response

{
  "id": "cs_...",
  "object": "checkout_session",
  "amount": 10347,
  "currency": "usd",
  "status": "open",
  "mode": "live",
  "plan_type": "recurring",
  "url": "https://rollopayments.com/pay/cs_...",
  "merchant_fee": { "label": "Platform fee", "amount": 297 },
  "expires_at": 1723014400000,
  "livemode": true
}

How to handle it

On success Rollo creates a subscription (and an internal price). The merchant_fee sticks on renewals. Provision on subscription.created like any other plan — see Subscriptions.