Quickstart
Start accepting recurring stablecoin payments in just a few minutes.
Prerequisites
Before you begin, you’ll need:
- An Exodus Business account - Contact [email protected] to create your account and complete the onboarding process
- API credentials - Once your account is approved, you’ll find your API keys in your dashboard settings
- Settlement wallet - Configure the wallet address where you’ll receive stablecoin payments
- Webhook secret - Configure your webhook endpoint URL in the dashboard to receive your webhook signing secret
- A server-side environment - Node.js, Python, Ruby, or any language that can make HTTP requests
New to Exodus Business? Our team will guide you through the onboarding process, including KYB verification and account configuration. Reach out to [email protected] to get started.
Never expose your API key in client-side code. Always make API calls from your server.
Create Your First Subscription
Create a subscription to start accepting recurring stablecoin payments:
const response = await fetch('https://checkout.exodus.com/subscriptions', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk_test_xxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 2999, // $29.99 in cents
currency: 'USD',
interval: 'month',
description: 'Pro Plan',
success_url: 'https://yoursite.com/success',
cancel_url: 'https://yoursite.com/cancel',
}),
});
const subscription = await response.json();
// Redirect your customer to subscription.checkout_url
console.log(subscription.checkout_url);Redirect the Customer
Send your customer to the checkout_url returned in the response:
// After receiving the checkout URL from your server
window.location.href = checkoutUrl;The customer will:
- Select their preferred stablecoin (USDC, USDT, etc.)
- Connect their wallet (Exodus, Grateful, MetaMask, Phantom, etc.)
- Authorize recurring payments from their wallet
- Be redirected to your
success_urlonce the subscription is activated
Handle Webhooks
Set up a webhook endpoint to receive subscription events:
import express from 'express';
import crypto from 'crypto';
const app = express();
app.use(express.json());
app.post('/webhooks/payments', (req, res) => {
// Verify the webhook signature
const signature = req.headers['x-signature'];
const expectedSignature = crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(JSON.stringify(req.body))
.digest('hex');
if (signature !== expectedSignature) {
return res.status(401).send('Invalid signature');
}
// Handle the event
const event = req.body;
switch (event.type) {
case 'subscription.created':
console.log('Subscription started:', event.data.object.id);
// Grant access to your service
break;
case 'subscription.past_due':
console.log('Payment failed:', event.data.object.id);
// Notify the customer, pause access, etc.
break;
case 'subscription.cancelled':
console.log('Subscription cancelled:', event.data.object.id);
// Revoke access at the end of the billing period
break;
}
res.status(200).send('OK');
});
app.listen(3000);Test Your Integration
Use test mode to verify your integration works:
- Use your test API key (
sk_test_...) - Create a test subscription
- Complete the subscription flow using a testnet wallet
- Verify your webhook receives the
subscription.createdevent
Test mode transactions use testnet networks, so no real funds are transferred.
Go Live
When you’re ready to accept real payments:
- Switch to live API keys - Replace
sk_test_keys withsk_live_keys from your dashboard - Configure your mainnet settlement wallet - Ensure your production wallet address is set
- Update webhook endpoints - Ensure your production webhook URL is configured
- Verify your integration - Run through the complete payment flow one more time
Important: Always test thoroughly in test mode before processing live transactions.
Next Steps
Now that you’ve created your first subscription:
- Create checkouts for one-time payments
- Configure webhooks for all event types
- Explore the full API Reference for all available endpoints
