Stripe Connect is the infrastructure behind every working marketplace on Earth. Lyft uses it to split driver payouts from passenger fares. Shopify uses it to fund sellers. Substack uses it to pay writers. The core pattern: vendors sign up, link a bank account, customers pay, platform takes a cut, vendors get paid on schedule. Velocity X ships Stripe Connect for instructor-led learning (course fees split between platform and creator), gig services (booking + platform margin), and regional booking networks. The real win: you're not a money transmitter, Stripe is. You collect payment via platform account, apply a fee percentage, and transfer the remainder to vendor accounts — that's not a per-seat SaaS bill anymore, that's a revenue share. Here's the architecture: Connected accounts (Standard or Express), platform fee math, three real use cases, AU tax compliance, and why this matters for scale.
What Stripe Connect Actually Does
Stripe Connect sits between your platform and vendor bank accounts. Customer pays $100 for a course. The payment goes to your Stripe account (the "platform account"). You calculate: $15 platform fee (15%), $85 goes to the instructor. Stripe transfers $85 to the instructor's connected account on your schedule (daily, weekly, or manual). The instructor sees a deposit from "Stripe" → "Your Platform Name." They never touch your money. Stripe handles the currency conversion, AML checks, and tax reporting. You handle onboarding UX, vendor approval, and fee logic.
Three account types: Standard (Stripe hosts the signup flow, you iframe it), Express (lightweight, Stripe redirects to onboarding, you get a token back), and Custom (you build the entire form and send data to Stripe). Standard is the default for simplicity. Express is faster for fast-moving platforms. Custom is rare and complex.
The payment flow: customer → your website → Stripe payment intent → your account → fee deduction → vendor connected account → vendor bank. Stripe handles PCI compliance, fraud, chargebacks, and regulatory reporting. You handle product logic, vendor approval, and the fee split. This is why marketplaces scale — you're not processing each vendor's payment separately, you're processing one payment and distributing it.
Standard vs Express Accounts
Standard accounts are for vendors who are willing to complete Stripe's full onboarding: legal entity verification, UBO (ultimate beneficial owner) checks, bank details, tax ID. Takes 5–15 minutes. Stripe verifies identity, and the account is "fully verified" — higher payouts limits, fewer restrictions. Best for US/AU professionals: accountants, consultants, course creators.
Express accounts skip some verification steps. Vendors complete a faster signup (2 minutes), and Stripe collects missing info later if they hit payout limits. Lower friction for two-sided marketplaces where vendors are occasional sellers. But Express accounts have lower transaction limits until fully verified — if a course creator makes $10k in one month, they'll be restricted until they verify. Trade off speed for limitations.
For Velocity X learning platforms, Standard is the default. Instructors are professionals who expect to be verified and aren't spooked by compliance. For gig platforms (TaskRabbit-style), Express is faster because taskers come and go. Choose Standard unless you're building for high-velocity, low-trust marketplaces.
Platform Fee Math
You define the fee percentage. Typical range: 10–30%. Stripe's own fee (processing + ACH transfer) is 2.9% + 30¢ per transaction. Your platform fee is separate — you decide it.
Customer pays: $100
Stripe processing fee (2.9% + $0.30): $3.20
Remaining: $96.80
If your platform fee is 15%:
Platform fee (15% of $100): $15.00
Vendor payout: $81.80
The flow in code:
const chargeAmount = 10000; // $100 in cents
const applicationFee = Math.round(chargeAmount * 0.15); // $15, platform fee
const vendorPayout = chargeAmount - applicationFee; // $85
// Create payment intent with application fee
const paymentIntent = await stripe.paymentIntents.create({
amount: chargeAmount,
currency: 'usd',
application_fee_amount: applicationFee,
transfer_data: {
destination: vendorConnectedAccount.stripeAccountId
}
});
The `application_fee_amount` is what lands in your platform account. The `transfer_data.destination` tells Stripe to automatically move the remainder to the vendor's connected account after the payment settles. You never touch the vendor's money — it transfers directly from customer to vendor, minus Stripe's cut and your fee.
Three Real Use Cases
Instructor-Led Learning
A platform for course creators: Velocity Coach (hypothetical). Instructors set their course price, students buy, platform takes 25%, instructor gets 75%. Instructor creates an account, you embed Stripe's Standard onboarding iframe, they verify their identity once, and from then on, every course sale auto-transfers to their bank. No invoicing, no manual payouts, no "we'll send you a check in 30 days." They log in, see their payout schedule, and it's done. Scale to 500 instructors and you're not paying per-seat, you're taking 25% of their revenue. That's profitability that compounds with growth.
Gig Services
A regional booking network: TaskRabbit clone, handypeople, pet-sitters, photographers. Customer books a photographer for $200. Platform margin: 20% ($40). Photographer gets $160 to their bank. With Express accounts, onboarding takes 90 seconds. Photographer does one job, earns $160, sees it pending, gets it deposited in 2 business days. No vendor reconciliation, no platform escrow account getting sued. Stripe holds the money until settlement, then distributes it automatically.
Regional Booking Network
Imagine a network of regional cleaning franchises. Each franchise is a vendor. Customers book through a central platform, pay the platform, platform transfers 70% to the franchise daily. Franchise owner has multiple profit centers: cleaning contracts they run directly, plus a commission from franchise-level bookings they take platform traffic for. All payment flows through Stripe. All compliance is Stripe's. Franchise owner sees deposits daily. Scale to 200 franchises across AU, you've got a revenue share business with near-zero payment ops.
AU Tax and PSI Compliance
If you're building in Australia, the ATO treats platform operators differently. If you're facilitating payments between customers and vendors, you're a Payment Service Intermediary (PSI). You're not required to hold the money, but you are required to report it. Stripe Connect keeps you compliant: each transaction is transparent, Stripe issues 1099s (or AU equivalents) to vendors, and your "revenue" is literally the fee you collect — no vendor money touches your bank account.
Key rules: vendors on Stripe must verify their Australian tax file number (TFN). Stripe collects this during onboarding. You must report transactions to the ATO if you're running a marketplace over AUD 75k/year in GMV. Stripe provides statements showing your fee income separately from vendor payouts — that's what you report as revenue. You don't get audited for vendor income you're not actually keeping.
If you're unclear on your tax obligations, consult an accountant before launch. But the pattern is: Stripe handles vendor tax ID verification, you report your platform fees to the ATO, vendors report their own income. Stripe Connect is PSI-safe by design.
Onboarding Flow in Code
Here's a Netlify function that creates a Standard account and returns an onboarding link:
// netlify/functions/create-vendor-account.ts
import { createClient } from '@supabase/supabase-js';
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_SERVICE_KEY!
);
export default async (event: any) => {
const { vendorId, email, businessName } = JSON.parse(event.body);
try {
// Create a Standard connected account
const account = await stripe.accounts.create({
type: 'standard',
country: 'AU',
email: email,
business_profile: {
name: businessName,
url: 'https://yourplatform.com'
}
});
// Generate onboarding link
const link = await stripe.accountLinks.create({
account: account.id,
type: 'account_onboarding',
refresh_url: 'https://yourplatform.com/vendor/onboarding-refresh',
return_url: 'https://yourplatform.com/vendor/onboarding-complete'
});
// Store account ID in your database
await supabase.from('vendors').update({
stripe_account_id: account.id,
onboarding_started_at: new Date().toISOString()
}).eq('id', vendorId);
return {
statusCode: 200,
body: JSON.stringify({
onboarding_url: link.url
})
};
} catch (err: any) {
return {
statusCode: 400,
body: JSON.stringify({ error: err.message })
};
}
};
Vendor clicks the link, completes Stripe's onboarding (identity, tax ID, bank account), and is redirected back to your app. You check their account status with `stripe.accounts.retrieve(stripeAccountId)` — if `charges_enabled: true`, they're ready to receive payouts. If `requirements.past_due` has fields, they need to complete more info. The flow is entirely Stripe's UI — you don't build verification forms.
Handling Payouts and Scheduling
Stripe automatically schedules payouts for every connected account. By default, weekly to their bank account. You can configure this: daily payouts (vendor sees money faster, higher fees), weekly, or manual (you trigger payouts programmatically). For course creators, daily is overkill — weekly is fine. For gig platforms, daily is expected. For high-trust vendors, manual lets you hold back disputed amounts.
// Set payout schedule to daily
await stripe.accounts.update(vendorAccountId, {
settings: {
payouts: {
schedule: {
interval: 'daily'
}
}
}
});
// Retrieve upcoming payouts
const payouts = await stripe.payouts.list({
stripeAccount: vendorAccountId,
limit: 10
});
Vendors can see their payouts in the Stripe dashboard (you provide a link). You can also surface this in your app by querying Stripe's API and showing them pending, completed, and failed payouts. This is the transparency that makes marketplace vendors trust you — they can audit every transaction, every fee, every payout.
Six FAQs
What if a vendor wants to withdraw early?
You can't force payouts faster than Stripe's schedule without Stripe's "Instant Payouts" feature (extra fee, not all countries). Most vendors accept the weekly delay. If you need faster, offer Instant Payouts as a premium feature (charge them the Stripe fee, which is ~1.5%). This is a retention lever for high-value creators.
Can I set different fees per vendor?
Yes. The `application_fee_amount` is calculated per transaction, so you can override it based on vendor tier, course type, or region. Revenue-share vs flat-fee vendors? Calculate fees differently. This is your pricing engine.
What if a customer disputes or chargebacks?
The dispute flows to your platform account first. You can provide evidence to Stripe (course completion proof, transcript, whatever). If you lose, the payment is reversed, and the vendor's payout is reversed. Stripe handles the chargeback fee — you eat it or pass it to the vendor depending on your terms. This is why trust and dispute resolution matter.
How do I prevent vendor-to-vendor transfers?
Stripe Connect is one-way: customer pays platform, platform distributes to vendors. Vendors can't transfer to other vendors directly (that would make you a bank). If you need peer-to-peer, you're building something different — likely requiring an actual MSB license. Keep it simple: one marketplace account, many vendor accounts.
Can vendors use the platform for personal purchases?
Technically yes, but you should forbid it in your terms. If a course creator buys their own course, you're processing their own money to themselves with a fee deducted. That's fraud-looking. Add a check in your payment flow: if customer account == vendor account, block the purchase or waive the fee.
How do I know if a payout failed?
Monitor the Stripe webhook `payout.failed`. When a payout fails (invalid bank account, closed bank, sanctions list), Stripe stops trying and alerts you. You then contact the vendor to update their bank details. Set up a webhook listener for `payout.paid` and `payout.failed` so you can notify vendors in real-time.
The Bottom Line
Stripe Connect is the API for marketplaces that don't want to become banks. You define the fee, Stripe handles compliance, vendors verify themselves once, and every transaction is transparent and auditable. Scale from 10 instructors to 500 without changing the payment infrastructure — fees compound your revenue while vendor payouts scale linearly. The old model: per-seat SaaS charging $50/instructor for 500 instructors = $25k MRR, but you still have to invoice and collect. The Stripe Connect model: take 20% of $500k course revenue = $100k MRR, fully automated. That's why marketplaces are the fastest-growing SaaS segment. Ready to launch a revenue-share product? Check Velocity X implementation partnerships for marketplace architecture. See also: webhook verification patterns for payment event handling.