Stripe Bacs Direct Debit UK
You should already have access to Fundraising tools, have the Stripe Gateway setup, know how to create a donation page, and be familiar with your Stripe account settings
What will I learn?
In this article you will learn how to use the Stripe gateway to enable BACS Direct Debits on your donation pages.
Video Walkthrough
You can use the Stripe gateway to enable your supporters to set up monthly BACS Direct Debits associated with UK banks using their account number and sort code. The payments are managed by Engaging Networks, so you can control the recurring donations from within the Lookup Supporters Recurring Donations gadget.
For details on other direct debit payment methods using the Stripe gateway (such as iDEAL and SEPA), please refer to this article.
Supporter journey and notifications when setting up a Direct Debit
The supporter will start on an Engaging Networks page
The supporter will land on an Engaging Networks page to begin with, to enter their personal details and payment information. Account number and sort code are not taken at this stage.
The supporter will be taken to a Stripe page
On submission of the page hosted by Engaging Networks, donors will be redirected to the Stripe Checkout page where they can enter their bank account details and billing address. This information cannot be retrieved from Engaging Networks and must be completed on the Stripe page.
Once completed, Stripe will show an additional confirmation page that will ask the donor to confirm their Direct Debit details, before they are redirected to the final thank you page in Engaging Networks.
Finally the supporter will be shown an Engaging Networks thanks page
The supporter will be taken to an Engaging Networks thank you page, and can also be sent a thank you email.
Email confirmations
For the payment notifications (Advance Notice Letters – ANL) you have two options – either Stripe can handle this or Engaging Networks can (recommended) – see this page for more information
How it works
There are some unique characteristics to Stripe Bacs Direct Debit.
Supporters will enter their account information in Stripe, not Engaging Networks
When the page is submitted, Engaging Networks will create a mandate in Stripe. At this point, a £0 transaction is created in Engaging Networks which is “pending” until it becomes active (“success”). no transaction is submitted, and no charges are made at this point.
On the start date and subsequent dates, Engaging Networks will ask Stripe to take a real payment and if a successful a “success” transaction is created with an amount. The start date that the supporter chooses is not the day that the first payment will be debited. It is usually around 4 days after that day.
Click here to read more about how Stripe manages BACS Direct Debit payments
Click here to find out how data is stored in Engaging Networks
Getting Started
1) You will need a validated Stripe account.
Follow the instructions here to add a Stripe gateway connection to your Engaging Networks account. If you are already using Stripe for card processing, you can use an existing connection.
You will also need to add a number of settings inside the gateway to get the Stripe Bacs integration working on your donation pages.
2) Enable Bacs Direct debit
Your Stripe account will need to have Bacs enabled. To do that:
a) In your Stripe dashboard, go to Settings > Payments > Payment methods.
b) Enable Bacs direct debit
3) Add webhooks and Stripe callback events
You will need to add webhooks to allow Engaging Networks and Stripe to communicate about payments.
a) In Stripe, go to Developers > Webhooks or search for “webhooks”
b) Click “+ add endpoint“
c) Type in the webhook URL (https://ca.engagingnetworks.app/page/stripe/webhook) and click “+ Select events“
d) Add the following Stripe callback events (you can use top search tool to search for relevant event names)
“Charge.dispute.funds_withdrawn”
“Payment_intent.canceled”
“Payment_intent.succeeded”
“Payment_intent.payment_failed”
“Checkout.session.completed”
“Mandate.updated”
“payment_method.automatically_updated”
Set up a Stripe PDD donation page in Engaging Networks
Required fields:
Field | Field type | Description |
---|---|---|
Email Address | Text with Email Validator | Email address identifying the supporter record |
Payment Type | Select or Radio | Must be submitted as bacs_debit |
Donation Amount | Text, Radio with Input or Select with Input with Donation Amount validator | May be entered as a whole number or number with two decimal places. Eg. Twelve dollars may be entered as ’12’ or ‘12.00’. Should not include the currency symbol |
Recurring Payment | Radio with Y and N values | Must equal Y to submit as recurring payment |
Recurring Frequency | Hidden field with default value | Can be MONTHLY, QUARTERLY, SEMI_ANNUAL, or ANNUAL. Only MONTHLY is supported. You can use a hidden field with a value of MONTHLY for this After our May 2023 release, other periods will be supported when using Recurring Start Date in conjunction with Recurring Day |
Recurring Day | Hidden field | The day of the month when the recurring payment is “pushed” by Engaging Networks to Stripe. In reality, the payment will be debited around 4 days after (see diagram above). Note that if using just the Recurring Day, then the first payment will occur in the next period (next month or next year from today’s date). e.g. submitting 20 would mean the first payment is pushed on the 20th of the next month, or year, depending on Frequency. |
Recurring Start Date (optional but recommended) | Select with format of yyyy-mm-dd Use code to populat e- see the “How to use Recurring Day and Start Date” section below for more | This field works in conjunction with Recurring Day. It denotes when the first payment will be pushed, and after that it will use the Recurring Day field to decide on the next push dates. Therefore, if you want the payments to be on the 20th of each month from this month, you would have e.g. 2023-06-20 for this field and 20 for Recurring Day You will probably need to use a Code Block to add possible Start Dates in this field – see the “How to use Recurring Day and Start Date” section below for more information |
Payment Currency | Hidden field | Value of GBP |
First Name | Text | The cardholder’s first name. |
Last Name | Text | The cardholder’s last name. |
Address 1 | Text | The first address line of the cardholder |
City | Text | The address city of the cardholder |
Post Code | Text | The postcode of the |
After direct debit submission
When the mandate is initially submitted, you will see a transaction with status set to pending through the Supporter Lookup view.
After 3 days, this status will update to ‘Success’ once the mandate is cleared.
At this point, the amount will reset to 0, and the Transaction ID will update to reflect the initial mandate.
Each payment processed as part of this mandate will then generate a transaction each month. You will also notice an UPDATE transaction in the Transaction History gadget.
Exporting Data
Take a look at this article for examples of the transactions you will see
The transaction types mentioned above with respective statuses will also be reflected in the exported file.
To export your Stripe Bacs transactions, please follow the instructions through finance reports.
For all Stripe Bacs transactions, select ‘Bank payments recurring transactions.’
Updating the Mandate
Once the mandate is submitted, its details can be edited inside the Engaging Networks dashboard. You will be able to:
Update the amount
Update day of charge
Update frequency
You can also set an end date for the Bacs mandate or skip a number of payments.
How to use Recurring Day and Start Date
These two fields determine when the first payment will be scheduled. You have always need a Recurring Day field on the page but, from our May 2023 release, you can also have a Recurring Start Date on the page too.
What do they do?
The Recurring Day and the Recurring Frequency fields set the schedule, with the first payment starting from the next frequency period. For example, if you set Recurring Day as 20 and Recurring Frequency as MONTHLY, it will make the first payment date as the 20th of next month.
Sometimes this behaviour may be undesirable, because if today is the start of the month, then it may be some weeks before the first payment is taken. To get around this, you can also use the Recurring Start Date field. This will set the first payment date, and from then on it will use the Recurring Day field to determine the subsequent payments.
In this set up, it is recommended that you use a Select for the Recurring Day with some default value. Then you can add a Code Block to the bottom of the page with code in that populates the start date with possible values.
This code can do this for you: https://github.com/EngagingNetworks/page-builder-code-blocks/blob/master/direct-debits-Stripe-start-date-population.html
To use the code:
Ensure there is a Recurring Day and Recurring Start Date field on your page
Make them both Mandatory
Recurring Day should be a text input type, and Recurring Start Date a select input type. You’ll need to add a value to that, so add a date sometime in the future – e.g. label 1 January 2024, value 2024-01-01
Add a Code Block to the bottom of your page
Paste in the code from here
Look at the first portion of the code where it says:
var numberOfOptions = 3; // the number of choices in the select you want to give, each separated by a month, e.g. 2 var daysAhead = 15; // the number of days from today we can start a new DD from, e.g. 10 var forceDayOfMonth = 21; // set to 0 if you are happy with any day of the month, set to 1-28 if you want to force the start date(s) to be on a certain day of the month, e.g. 1
Amend the numbers after the = signs to suit your set up.
numberOfOptions sets how many possible values there are, separated by a month. Use 1 if you only want one option (suitable for annual payments)
daysAhead sets how many days from today that the first possible payment can be
forceDayOfMonth can be used if you want the payments to only be on a certain day of the month. Set this to 0 if you don’t need this functionality
Test the code by previewing the page, and check that the Start Date is populating properly