{"id":2350,"date":"2017-09-08T07:17:00","date_gmt":"2017-09-08T13:17:00","guid":{"rendered":"http:\/\/www.mooreds.com\/wordpress\/?p=2350"},"modified":"2021-10-30T08:54:50","modified_gmt":"2021-10-30T14:54:50","slug":"things-i-wish-i-knew-about-stripe","status":"publish","type":"post","link":"https:\/\/www.mooreds.com\/wordpress\/archives\/2350","title":{"rendered":"Things I wish I knew about Stripe"},"content":{"rendered":"<figure id=\"attachment_2351\" aria-describedby=\"caption-attachment-2351\" style=\"width: 300px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2351 size-medium\" src=\"http:\/\/www.mooreds.com\/wordpress\/wp-content\/uploads\/2017\/01\/dovetail-1984030_640-300x200.jpg\" alt=\"Caterpillar\" width=\"300\" height=\"200\" srcset=\"http:\/\/edit.mooreds.com\/wordpress\/wp-content\/uploads\/2017\/01\/dovetail-1984030_640-300x200.jpg 300w, http:\/\/edit.mooreds.com\/wordpress\/wp-content\/uploads\/2017\/01\/dovetail-1984030_640.jpg 640w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption id=\"caption-attachment-2351\" class=\"wp-caption-text\">Striped, but not charging your credit card<\/figcaption><\/figure>\n<p>So, at <a href=\"http:\/\/www.thefoodcorridor.com\/\">The Food Corridor<\/a>, we&#8217;ve been using Stripe happily since we launched in June of 2016. \u00a0As a developer, I&#8217;d used Stripe before in a couple of different ways, but this has definitely been my most sustained use of the payment service. \u00a0(If you don&#8217;t know what Stripe is, it is an API that makes charging customers as easy as an API call. \u00a0<a href=\"https:\/\/stripe.com\/\">More here<\/a>.)<\/p>\n<p>I wanted to outline some of the things I&#8217;ve learned from months of using Stripe.<\/p>\n<ul>\n<li>Stripe supports pulling money directly from bank accounts, via <a href=\"https:\/\/stripe.com\/docs\/ach\">ACH<\/a>, but it really isn&#8217;t the same ACH as your bank lets you do. \u00a0This is because Stripe isn&#8217;t a bank. \u00a0The biggest thing to be aware of here is that Stripe ACH takes 7 days to arrive in your\u00a0bank account. \u00a0Another issue is that you have to do verification. \u00a0They have two ways of doing verification&#8211;micro deposits and <a href=\"https:\/\/plaid.com\/docs\/link\/stripe\/\">Plaid<\/a>. \u00a0Plaid is instant, but only supports major banks, which was a non starter for us (updated 9\/8: <a href=\"https:\/\/blog.plaid.com\/1000-identity\/\">Plaid supports around 1000 banks now<\/a>). \u00a0The code for micro deposits is straightforward, but be prepared for some customer support issues. \u00a0Stripe deposits two amounts and withdraws just one amount, which was confusing for some of our users. \u00a0It also takes a couple of days, so if your users are hot to spend money, Stripe ACH may not be a fit. \u00a0The win? \u00a0Definitely cheaper. \u00a0(And I didn&#8217;t find any other service that would support both credit card and ACH transactions that was developer friendly.)<\/li>\n<li>Don&#8217;t forget to set up your webhooks out of the gate. \u00a0Stripe mentions this, but I glossed over it in the early days, and missed some events that were important. \u00a0(The most relevant is that ACH is asynchronous, so when an ACH transfer fails, it is reported via webhook.\u00a0 If bank account verification doesn&#8217;t work, you&#8217;ll get a different kind of webhook.\u00a0 Review the docs and set up webhooks for <a href=\"https:\/\/stripe.com\/docs\/ach#ach-specific-webhook-notifications\">all the ACH events<\/a>.) \u00a0If you don&#8217;t have time for a full featured webhook processing implementation, <a href=\"https:\/\/zapier.com\/zapbook\/webhook\/email\/\">Zapier can just send the webhook data to your email<\/a>. This can be a great stopgap solution.\u00a0 Or you can use <a href=\"https:\/\/github.com\/integrallis\/stripe_event\">stripe_event<\/a>.<\/li>\n<li>Per support, if a webhook post fails (because your app is down, for example), they are retried once an hour for 72 hours.<\/li>\n<li>Speaking of stopgap solutions, the Stripe Dashboard is fantastic for manual processes. \u00a0Just because you can automate everything via an API, doesn&#8217;t mean you should. \u00a0There can be some complicated edge cases with payment processing, especially around refunds, but they can easily be handled with a google doc of instructions and the Stripe Dashboard. \u00a0I have found only one use case that the API can handle that the dashboard cannot (a partial refund of an ACH transaction).<\/li>\n<li>I have found Stripe support to be excellent, quick and knowledgeable.<\/li>\n<li>Occasionally customer charges will be declined because of bank fraud triggers. \u00a0Expect to occasionally ask your customers to call their bank. \u00a0(I think this has happend about once every third month).<\/li>\n<li>Disputes are a total pain, because the process is opaque and slow (expect a resolution in about two months and know you are not in possession of the payment during that time).<\/li>\n<li>Make sure to capture the payment id anytime you charge a card or run ACH. \u00a0It will make future automation a lot easier.<\/li>\n<li>Monthly plans are complicated, so if you can lean on Stripe for management, even if you are doing manual plan management (applying coupons, adding, or removing users from plans via the dashboard), do that.<\/li>\n<li>The first payment you charge\u00a0<a href=\"https:\/\/support.stripe.com\/questions\/bank-account-and-payouts#your-first-payout\">takes 7 days to move from stripe to your\u200b bank account<\/a>. \u00a0This is for fraud protection. \u00a0Payments thereafter typically take 2 days (but it depends on your country and industry).<\/li>\n<\/ul>\n<p>And here are some special tips if you are using <a href=\"https:\/\/stripe.com\/connect\">Stripe Connect<\/a> (their marketplace product).<\/p>\n<ul>\n<li><a href=\"https:\/\/stripe.com\/docs\/connect\/\">Read the docs<\/a>!<\/li>\n<li>Remember that first payment timeline? \u00a0It applies to every one of the connected accounts. \u00a0Think about charging your own credit card as soon as you connect an account to help with customer cash flow.<\/li>\n<li>Consider whether you want to use managed vs standalone accounts. \u00a0Managed accounts are a lot more work but allow you to have a seamless UX that you control. \u00a0Standalone accounts, which we use, are far quicker to setup. \u00a0I think this depends on the number of sellers you have in your marketplace.<\/li>\n<li>You also want to think about whether to place the charges on the platform account or on the connected accounts. \u00a0A major factor there is who bears the Stripe fees, the platform or the sellers. \u00a0We charged on the platform account because we wanted all our data in one place. \u00a0If you are selling plans, you can&#8217;t charge on the platform and use Stripe plans.<\/li>\n<li>If you are charging on the platform account, and are using standalone accounts (where the sellers have to set up a stripe account) your sellers won&#8217;t see charge descriptions unless you manually copy the description over. \u00a0The code looks like:<\/li>\n<\/ul>\n<p><code># this will let the sellers know what invoice the charge was for<br \/>\ntransfer_id = charge.transfer<br \/>\ntransfer = Stripe::Transfer.retrieve(transfer_id, expand: ['destination_<br \/>\npayment'])<br \/>\npayment_id = transfer.destination_payment<br \/>\npayment = Stripe::Charge.retrieve(payment_id, {stripe_account: destinati<br \/>\non_account_id})<br \/>\npayment.description = description<br \/>\npayment.save<\/code><\/p>\n<p>Happy charging!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So, at The Food Corridor, we&#8217;ve been using Stripe happily since we launched in June of 2016. \u00a0As a developer, I&#8217;d used Stripe before in a couple of different ways, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62,65,82,81,37,33],"tags":[],"class_list":["post-2350","post","type-post","status-publish","format-standard","hentry","category-apis","category-bpa","category-stripe","category-the-food-corridor","category-tips","category-useful-tools"],"_links":{"self":[{"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/posts\/2350","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/comments?post=2350"}],"version-history":[{"count":13,"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/posts\/2350\/revisions"}],"predecessor-version":[{"id":2475,"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/posts\/2350\/revisions\/2475"}],"wp:attachment":[{"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/media?parent=2350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/categories?post=2350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mooreds.com\/wordpress\/wp-json\/wp\/v2\/tags?post=2350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}