We dropped DodoPayments for Stripe
We launched on DodoPayments in October. We switched to Stripe in February. Here's the why and the lesson.
Why DodoPayments first: their crypto-payment support was the cleanest at the time. We expected a meaningful share of customers to pay in USDC. Their dashboard is reasonable, fees are competitive.
What didn't work: our actual customers paid in fiat. Of the first 40 paying tenants, two used USDC; the rest were on cards. So the headline reason for picking Dodo didn't materialize. Meanwhile, the things our customers cared about — billing portal UX, dispute handling, invoice tooling — were better on Stripe.
The migration: straightforward because we had platform-level metadata abstractions from day one. Customer rows in our DB carry a billingCustomerId that's opaque to the rest of the app. Webhooks dispatch on a provider field, not hardcoded routes. The migration was: add Stripe as a second provider, gradually migrate tenants on renewal, retire Dodo.
The cost: three weeks of engineering, a handful of customer support emails, and an awkward email to our existing customers explaining their next invoice would come from a different sender.
The lesson: billing provider is a real switching cost. Don't couple too tightly until you're sure. Our metadata-routing abstraction made the change cheap; if we'd coded directly to Dodo's SDK we'd have spent a quarter on this.