Stripe vs Braintree: the Ultimate Guide
If you’re developing an app that needs to accept payments, you’ll likely consider Stripe and Braintree as payment providers.
They’re a new breed of
full-stack payment companies that are friendly to both businesses and developers. They take care of the nitty gritty like merchant accounts and PCI compliance, and are fairly straightforward to integrate.
An unscientific review hints that Stripe is more popular among developers, with 99 StackOverflow questions in the past month, versus Braintree’s 34. Authorize.net, an older provider, had only 10, illustrating the shift toward new payment companies.
This article compares Stripe and Braintree in depth, to help developers and businesses make an informed decision. I’ve used both providers in production.
PayPal acquired Braintree in 2013. Since then, Braintree has made it easier than ever to accept PayPal in a modern web application.
If you use Braintree to accept credit cards, there's no additional work required to accept PayPal. It's just another payment method, like Visa or MasterCard. Braintree handles all of the nuances, whether for one-time transactions or subscription payments.
Is accepting PayPal important to your business? If so, there’s a strong case for Braintree.
Stripe currently has no PayPal integration.
Winner: Braintree. It provides the smoothest PayPal integration available for most sites.
Braintree’s “drop-in” PayPal and credit card form
Payment Forms, Front-end
Stripe and Braintree offer pre-built payment forms that you can bring onto your site:
Stripe Checkout: A
pop-upcredit card form
Braintree Drop-in UI: A credit card form embedded into the page
Braintree Drop-in UI is my personal preference. It appears in-line, blending in with your UI. It can also include a PayPal button, allowing the customer to log in to PayPal without leaving your site.
In addition to pre-built forms, both Stripe and Braintree allow you to create your own.
Braintree requires your server to retrieve a one-time client token from Braintree's API before displaying a payment form, whether using its Drop-in UI or hosted fields (its custom form solution). Stripe doesn't require your server to retrieve a one-time token before the client renders the payment form, saving a step and likely cutting load time by 1–2 seconds.
Winner: Tie. Braintree provides a better universal payment UI but requires an additional server request that can delay loading by 1–2 seconds.
I sent the following question to both Stripe and Braintree early on a Monday:
Hello, what's the best way to get a human-readable reason why a credit card was declined? Can I get this when creating a subscription as well as when a card is declined during an existing subscription?
Braintree responded in 6 hours. Stripe responded in about a day and a half. Both answers addressed the question, but Braintree was much faster in responding.
This is consistent with my previous experience with both companies. Braintree has responded to my requests within 6 hours on weekdays and 24 hours on weekends.
Braintree’s primary support is through email (email@example.com) and phone. Stripe’s is through a web form with no phone support available.
Both companies are engaged on GitHub. Their libraries are open sourced there, and they respond directly on the issue pages for each. (Examples: Stripe, Braintree.)
Both companies are engaged on Twitter, their feeds showing that they respond directly to developers in a short period of time. (Examples: Stripe, Braintree.)
Braintree is engaged on StackOverflow, a popular Q&A forum for developers. Of four Braintree questions on September 19, Braintree responded to two directly. Stripe questions on StackOverflow generally don’t get an official response.
Stripe has an IRC channel, a wonderful excuse to re-download your favorite client. You may or may not reach someone on the team.
Winner: Braintree. Both provide good support, but Braintree’s is faster and more available.
Both Stripe and Braintree support discounts for subscriptions. Customers might receive $5 off their first month’s subscription fee, for instance.
Discounts work roughly the same for each service. An admin creates a discount in the dashboard, and API calls from your app can apply that discount.
There are differences that will impact how you implement discounts, however, and these reveal that Stripe is stronger in this area.
- Braintree doesn't support percentage discounts (e.g. 25% off); Stripe does. In Braintree, if you have a 25% discount that applies to your monthly, quarterly, and annual plans, you need to create a separate discount for each plan, each for a different amount. With Stripe, you can create one 25% off coupon that applies to all three plans.
- Braintree doesn't support expiration dates for coupons; Stripe does.
Thus, with Braintree, you’ll do a bit more work if your plans have different billing cycles (e.g. monthly and quarterly) or your discounts are available only for a limited time.
Winner: Stripe. Its discounts offer more functionality, including percentage-off and expiration dates.
Upgrades and Proration
Both Stripe and Braintree smoothly handle upgrades between plans that share the same billing cycle. For instance, if someone needs to upgrade from your monthly Silver plan to your monthly Gold plan, a simple API call to either service does the trick.
Braintree cannot, however, process upgrades from plans with different billing cycles—say, a monthly plan to a quarterly plan. You’d need to roll your own upgrade logic (reach out to me for tips). Stripe, on the other hand, handles these complex upgrades and applies prorated pricing.
Winner: Stripe. Unlike Braintree, it handles proration across different billing cycles.
Both Stripe and Braintree provide libraries for various programming languages. Generally, they’re open sourced, documented, and supported.
I’ve integrated both services' Ruby libraries. They’re perfectly adequate, allowing you to create and update subscriptions, perform one-time transactions, and receive webhooks.
Winner: Tie. Strong developer libraries are core to both Stripe and Braintree.
You’ll need to master the API of the service you choose, and to do that you’ll lean heavily on documentation.
Stripe’s documentation is more precise than Braintree’s. I haven’t seen a phrase in Stripe’s documentation that is ambiguous or open to interpretation. Braintree’s, on the other hand, can be a little more vague.
For instance, Braintree can notify your app (through a webhook) when it has tried and failed to charge a customer for a subscription. Part of what it passes is the
failure_count, which it defined as
the number of times the gateway has retried a charge on a past due subscription.
Note the word
retried. Does the
failure_count include the first failure or just the retries afterward?
I emailed and tweeted Braintree this question and got opposite answers. The Twitter answer turned out to be correct.
Braintree has already fixed their docs, changing
tried. I commend Braintree’s response and hope they further tighten and clarify their documentation.
That being said, both services have well-structured documentation, organized by programming language—allowing developers to get specific guidance for their toolsets. Having implemented both services from scratch, though, Stripe’s docs have me scratching my head a little less.
Winner: Stripe. Its documentation wins on depth and clarity.
Expired Credit Cards
Both Stripe and Braintree have arrangements with credit card companies to automatically update credit cards that are about to expire. In many cases, customers obtaining a replacement card don't need to update their credit card information. This likely reduces churn and helps your business.
With Braintree, you have to request this feature, a quick and free process. With Stripe, it’s automatic.
Winner: Tie. Both services auto-update expired cards. Remember to request the feature from Braintree.
Stripe and Braintree allow for trial periods on subscriptions, but only Stripe allows a customer to trial without a credit card.
Stripe trial periods don't require a payment method. If the trial period ends and the customer hasn't provided payment information, Stripe registers a delinquent payment. You can use webhooks to kindly ask the customer to enter billing information. After your (customizable) retry limit is exceeded, Stripe cancels the customer’s account.
Braintree, on the other hand, requires payment information even for a trial account. So, if you want to offer a free trial with no credit card and you’re using Braintree, you’ll have to write more code than you would with Stripe.
Winner: Stripe. It doesn’t require a payment method for trial periods, and Braintree does.
Your payment processor will need to let your app know about certain events. For instance, if an account is cancelled due to delinquent payments, you may need to adjust the user’s access in your app so they no longer have access to premium areas.
Both Stripe and Braintree have webhooks that tell your app about certain events. They’re pretty similar for most uses.
Stripe distinguishes itself with robust webhook status and logs, available from its dashboard. You can see which webhooks have failed, for instance. Braintree doesn't offer this; only their support staff can check the webhook logs.
Winner: Stripe. It shows webhook status and logs in its dashboard, unlike Braintree.
In the unfortunate event a customer cancels their account, you may want them to retain access for the remainder of the current billing period. (They paid for it, after all!)
With Stripe, you can cancel an account effective at the end of the billing period. At the end of the period, Stripe sends a
subscription_deleted webhook to your app, at which point your app knows to cut off the user’s access.
With Braintree, all cancellations are effective immediately. There is nothing to notify your app of the end of the current period. So, your app has to remember to cut off the user’s access at the end of the period, and until then there’s an odd discrepancy where the user’s Braintree subscription is
cancelled but they still have access.
Overall, I believe Stripe’s cancellation logic makes more sense. If you use Braintree and would like cancellations to take effect at the end of the billing period, you'll need to do some additional coding. Feel free to reach out to me for tips.
Winner: Stripe. Its cancellation flow makes more sense for most sites.
If you're using a service like Stripe or Braintree, commerce is likely critical to your site. You'll want to test each service yourself, and then implement automated tests to ensure they continue to work in the future.
Stripe and Braintree both offer test environments, with their own dashboards and test API keys that you can place into your app. This allows you to click around your app in development to create fake subscriptions and charges, and review those in the dashboard.
You can sign up for Braintree’s and Stripe’s test environments without providing any banking information. At that point, you can use the service in development. Before using the service in production, you’ll need to submit your personal and banking information for approval. Both services approve within a few days, generally.
Both Stripe and Braintree are amenable to automatic testing. Braintree has more testing features built into its library than Stripe does—like fake webhooks and payment nonces (which can generate various payment errors). Stripe offers the ability to send fake webhooks from its dashboard to your app on dev. You’ll likely need to supplement Stripe’s library with tools like stripe-ruby-mock, where Braintree’s library can likely support good testing on its own.
Winner: Tie. Both services offer sandboxes with a low barrier to entry, and helpers for automated tests.
As an account owner with Stripe or Braintree, you’ll have access to a dashboard where you can view customers, subscriptions, and payments. Both services offer the ability to manage this information, provide refunds, and change account settings.
Winner: Tie. Both services offer common admin tasks in a user-friendly dashboard.
Your decision will depend upon how important each feature is to you.
Braintree offers PayPal integration and more responsive support. If PayPal is core to your business case, Braintree will make integrating it a lot easier and will likely be your pick. If you anticipate having a lot of questions not covered in documentation, Braintree’s support may win you over.
Stripe has superior documentation, trial periods, discounts, webhooks, and upgrades. You don’t have to
work around Stripe like you sometimes have to do with Braintree. If your app has no-credit-card free trials or upgrades to different billing cycles, you may select Stripe to save some development time. If you're an experienced developer and PayPal isn’t in the business case, you may lean toward Stripe.
From here, check out the quick start guides for Stripe and Braintree. Sign up for their sandboxes, install their libraries on your app in dev, and get a feel for their different approaches. Take comfort that both companies are on the cutting edge of payments, but note their differences.