Shopify
Podium syncs products and orders with Shopify stores via OAuth and webhooks.OAuth Installation
Initiate OAuth
Redirect the merchant to the Shopify install endpoint:This generates a Shopify OAuth authorization URL with the required scopes.
Authorize
Shopify redirects the merchant to grant permissions. Required scopes:
read_products,write_productsread_orders,write_ordersread_inventory
Callback
Shopify redirects to
/api/v1/shopify/callback with an access token. Podium stores the token in a ShopifyStore record linked to the creator.Synced Data Mapping
| Shopify Entity | Podium Model | Sync Direction |
|---|---|---|
| Products | ShopifyProduct → Product | Shopify → Podium |
| Variants | ShopifyVariant → ProductAttributeVariant | Shopify → Podium |
| Options | ShopifyOption | Shopify → Podium |
| Media/Images | ShopifyMedia → ProductMedia | Shopify → Podium |
| Orders | ShopifyOrder | Podium → Shopify |
shopify-order-push event.
Webhook Events
Shopify sends webhooks toPOST /webhooks/shopify with the X-Shopify-Topic header:
| Topic | Handler |
|---|---|
products/create | Create new ShopifyProduct + linked Product |
products/update | Update product data, variants, media |
products/delete | Soft-delete the linked product |
app/uninstalled | Remove store connection, clean up tokens |
Webhook Verification
Troubleshooting
| Issue | Solution |
|---|---|
| Products not syncing | Verify the Shopify app has read_products scope. Trigger manual sync via /shopify/sync/manual |
| Duplicate products | Check if the Shopify product already has a linked ShopifyProduct record |
| Orders not pushing to Shopify | Verify the store connection is active and the app has write_orders scope |
| Webhook failures | Check event logs for failed shopify-products-sync events |
Stripe Connect
Creators receive payouts through Stripe Connect Express accounts.Setup Flow
Complete onboarding
Redirect the creator to the Stripe onboarding URL. They’ll complete identity verification and bank account setup directly with Stripe.
Platform Fee Configuration
Podium takes a platform application fee on every transaction:Payout Flow
- Customer pays → Stripe PaymentIntent succeeds
- Platform fee deducted automatically
CreatorPayoutrecord created withPENDINGstatus- After hold period → status changes to
ELIGIBLE payouts-sweepcron transfers eligible payouts to creator’s Connect accounttransfer.createdwebhook confirms → status updates toTRANSFERRED
Onboarding Reminders
If a creator doesn’t complete Stripe onboarding within 48 hours, thestripe-onboarding-reminder cron sends an email reminder. The reminder tracks:
stripeOnboardingReminderSentAt— when the last reminder was sentstripeOnboardingReminderClaimedUntil— suppresses reminders until this date
Troubleshooting
| Issue | Solution |
|---|---|
| Creator can’t receive payouts | Verify their Stripe account status via GET /creator/id/{id}/stripe/account. If restricted, the creator needs to complete additional verification |
| Payouts stuck in PENDING | Check the payouts-sweep cron job is running. Verify the hold period hasn’t been extended |
| Application fee incorrect | Verify STRIPE_PLATFORM_APPLICATION_FEE_BPS in your environment |
Privy Wallets
Privy provides embedded wallet infrastructure for both server-side automation and client-side user wallets.Environment Variables
Server Wallets (Backend / Agents)
Server wallets are platform-managed — your backend controls signing. Used for automated x402 payments, reward minting, and agent-initiated transfers.Embedded Wallets (Frontend)
Embedded wallets are auto-created for end users on first login, giving them a non-custodial wallet without seed phrase management.User Linking
Privy users are linked to Podium users via thePrivyUser model:
| Privy DID | Podium User |
|---|---|
did:privy:abc123 | clxyz1234567890 |
Funding Embedded Wallets
Users can fund their embedded wallets via:- Apple Pay / Google Pay (through Privy’s fiat on-ramp)
- Coinbase transfer
- Direct USDC transfer from any wallet
- Points-to-USDC conversion (if enabled)
Troubleshooting
| Issue | Solution |
|---|---|
| Wallet not created on login | Verify createOnLogin: 'all-users' in Privy config |
| Transaction failures | Check the Privy dashboard for transaction logs. Verify sufficient gas/USDC balance |
| User can’t link external wallet | Ensure walletConnectors includes the desired provider |
Stream Chat
Podium integrates Stream Chat for real-time messaging between users and creators.Environment Variables
Setup
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
requestorId | string | Yes | CUID of the initiating party |
requestorType | enum | Yes | "User" or "Creator" |
userId | string | No | Target user (for creator-initiated chats) |
Shippo Shipping
Podium uses Shippo for shipping rate calculation and label generation.OAuth Installation
Get Shipping Quotes
Generate Shipping Label
Flat Rate Fallback
Creators can set aflatShippingRate (in cents) on their profile as a default when Shippo quotes aren’t available or desired:
Troubleshooting
| Issue | Solution |
|---|---|
| No shipping quotes | Verify the order has valid shipping addresses and product weights |
| Label generation fails | Check the creator’s Shippo account is connected and has a valid payment method |
| Rates seem high | Review product weight/dimension data — incorrect values inflate shipping costs |
External Documentation Links
| Service | Documentation |
|---|---|
| Shopify API | Admin API, webhooks, OAuth |
| Stripe Connect | Express accounts, payouts, platform fees |
| Privy | Embedded wallets, server wallets, auth |
| Stream Chat | Real-time messaging SDK |
| Shippo | Shipping rates, labels, tracking |

