Skip to main content
Engineering7 min readFebruary 18, 2026

Stripe Connect for Marketplace Payments: Routiine App Implementation

How I implemented Stripe Connect for the Routiine App marketplace — onboarding providers, splitting payments, handling payouts, and managing the platform fee model.

James Ross Jr.

James Ross Jr.

Strategic Systems Architect & Enterprise Software Developer

Why Stripe Connect

The Routiine App is a marketplace. Customers pay for services, providers deliver those services, and the platform takes a fee. This three-party payment model requires a system that can accept payment from one party, split it between the platform and the provider, and handle payouts to the provider — all while maintaining compliance with payment regulations and tax reporting.

Stripe Connect is designed exactly for this use case. It provides a framework for creating connected accounts for providers, processing payments on their behalf, deducting platform fees, and managing payouts. The alternative would be building this payment infrastructure from scratch, which would involve money transmission licensing, PCI compliance, bank integrations, and tax reporting — work that would consume more engineering time than the entire rest of the application combined.

The previous Stripe integration work on BastionGlass was direct charges — the platform collects payment and owns the customer relationship. Stripe Connect is fundamentally different. The customer pays through the platform, but the money flows to the provider's connected account. The platform's role is facilitator, not merchant.

Provider Onboarding

Before a provider can receive payments through Routiine App, they need a Stripe connected account. The onboarding flow uses Stripe Connect Onboarding, which handles identity verification, bank account collection, and regulatory compliance through Stripe's hosted interface.

When a provider signs up for Routiine App and is approved to offer services, the backend creates a Stripe Connect account using the Express account type. Express accounts give Stripe responsibility for the provider's dashboard, payout management, and compliance — the provider interacts with Stripe directly for those functions rather than through our platform. This significantly reduces our compliance burden and support overhead.

The provider is redirected to Stripe's onboarding flow, which collects their legal name, date of birth, Social Security number (for 1099 tax reporting), and bank account for payouts. When onboarding is complete, Stripe redirects back to the app with a status update. The backend records the connected account ID and marks the provider as payment-ready.

Incomplete onboarding is a common edge case. A provider might start the onboarding flow and abandon it halfway through. Stripe's onboarding handles this gracefully — the provider can return to the same onboarding session later and continue where they left off. The app tracks onboarding status and prompts incomplete providers to finish before they can accept jobs.

Payment Flow

When a customer approves a quote and a provider is assigned, the payment flow begins. The sequence is:

The customer's payment method is charged using a PaymentIntent with the transfer_data parameter specifying the provider's connected account. The platform fee is specified as the application_fee_amount — this is the amount that stays with the platform account. The remainder is automatically transferred to the provider's connected account.

For a $100 chip repair with a 20% platform fee, the PaymentIntent charges $100 to the customer. $20 goes to the platform account. $80 goes to the provider's connected account. This split happens atomically within Stripe — there is no intermediate state where the money is in limbo between accounts.

The payment is authorized when the job is accepted and captured when the job is completed. This authorization-then-capture pattern protects the customer (they are not charged until the work is done) and the provider (the payment is guaranteed before they start working). The same pattern was used in BastionGlass's payment processing, though the specific Stripe API calls differ for Connect versus direct charges.

Payout Management

After payments land in a provider's connected account, Stripe handles payouts to the provider's bank account on a configurable schedule. Express accounts default to daily payouts with a two-day rolling delay — a payment captured today arrives in the provider's bank account in two business days.

The platform does not manage individual payouts. Stripe aggregates payments and issues payouts automatically. The provider can view their payout history and upcoming payouts through the Stripe Express dashboard, which is accessible via a link from the Routiine App.

This delegation to Stripe is deliberate. Managing payouts manually — deciding when to pay providers, handling payout failures, reconciling bank transfers — is operationally complex and regulated. Stripe Express handles all of it, including the edge cases: returned payouts, bank account changes, and negative balance recovery when refunds exceed the provider's account balance.

Refunds and Disputes

Refunds in a marketplace context are more complex than direct refunds because the money has been split between two accounts. When a customer requests a refund, the platform needs to decide how the refund is funded — from the platform's fee, from the provider's share, or from both.

Routiine App's refund policy funds refunds from the provider's share first, with the platform fee refunded proportionally. If the customer received a full refund on a $100 job with a 20% platform fee, the provider's connected account is debited $80 and the platform refunds $20. If the provider's connected account does not have sufficient funds (because their balance has already been paid out), Stripe creates a negative balance that is recovered from future payments.

Disputes — when a customer initiates a chargeback through their bank — are handled similarly but with the additional complexity of the dispute process. Stripe sends a webhook when a dispute is created, and the platform has a window to respond with evidence. The architecture includes job completion photos, GPS-verified location data, and timestamped status updates that serve as evidence in dispute resolution.

Tax Reporting

As a marketplace that pays providers, Routiine App is responsible for issuing 1099 forms to providers who earn over the IRS reporting threshold. Stripe Connect handles this through the connected account infrastructure — Stripe collects the necessary tax information during onboarding and generates 1099 forms automatically for qualifying providers.

The platform's responsibility is ensuring that provider accounts are properly configured and that Stripe has accurate information. We verify this during onboarding and periodically check for accounts with incomplete tax information. Providers with incomplete tax information receive in-app notifications prompting them to update their Stripe account, and we can restrict their ability to accept new jobs until the information is current.

This tax handling is one of the strongest arguments for using Stripe Connect over building payment infrastructure in-house. Tax compliance for marketplace payments is genuinely complex, and getting it wrong has real legal consequences. Delegating this to Stripe, which has teams dedicated to regulatory compliance, is the pragmatic choice for a startup that needs to focus its engineering effort on the product rather than on payment infrastructure.