Direct Debit
Not available in the US yet. Bacs Direct Debit is for UK businesses taking pounds. A US
account’s application is refused (direct_debit_ineligible, reason: region). Bank debits for
US businesses (ACH) come later. Until then, take cards: Payments,
Subscriptions.
In Europe, Direct Debit is SEPA Direct Debit (sepa_debit), in euros, from a payer’s bank
account anywhere in the SEPA area. Everything below applies the same way, except:
| SEPA Direct Debit | |
|---|---|
| Applying | The same application and review. A European business is never refused for region |
| The payer | Gives an IBAN in the secure payment form and accepts the mandate, shown in their language |
| Price | 0.25% + 35c a debit, capped at €3. An indemnity claim costs the €15 dispute fee (pricing) |
| Timing | A debit is processing for several banking days, then succeeded or failed |
| Claims | A payer can claim a debit back for any reason within eight weeks of it. The claim arrives as a dispute that can’t be contested |
payment_method_details | type: "sepa_debit", with sepa_debit.country (the IBAN’s) and last4, never the IBAN |
The examples below are in pounds. In Europe, amounts are in cents and currency is "eur".
Bacs Direct Debit takes a payment straight from a customer’s UK bank account. Use it for memberships, subscriptions and invoices, where cards expire and fail. It is for UK businesses taking pounds, and off until you apply and we approve it. A payer can claim a debit back at any time and those losses are ours too, so a person reviews every application and sets limits.
The payer signs the mandate in the secure payment form, and is sent the Bacs emails (the confirmation, and notice before each debit) for you. We never see or store a payer’s full account number.
- Apply
POST /v1/direct_debit/application - Reviewedusually within a working day
- Approvedwith limits
- On
direct_debit.activated
Apply from the dashboard (Settings → Direct Debit → Apply), the API, the Tuppence app, or the Tuppence Assistant, which drafts the application for you to check. Most businesses hear back within a working day.
curl -sS https://api.tuppence.ai/v1/direct_debit/application \ -H "Authorization: Bearer $TUPPENCE_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "reason": "Members pay monthly gym fees; cards expire and payments fail every month.", "use": ["subscriptions"], "expected_monthly_volume": 400000, "typical_amount": 4500, "largest_amount": 12000, "customers": "consumers", "how_customers_sign_up": "Members sign up at the front desk on a tablet" }'const application = await tuppence.directDebit.apply({ reason: "Members pay monthly gym fees; cards expire and payments fail every month.", use: ["subscriptions"], expected_monthly_volume: 400000, typical_amount: 4500, largest_amount: 12000, customers: "consumers", how_customers_sign_up: "Members sign up at the front desk on a tablet",});application = tuppence.direct_debit.apply( reason="Members pay monthly gym fees; cards expire and payments fail every month.", use=["subscriptions"], expected_monthly_volume=400000, typical_amount=4500, largest_amount=12000, customers="consumers", how_customers_sign_up="Members sign up at the front desk on a tablet",)| Field | |
|---|---|
reason | Why you want Direct Debit, at least 30 characters |
use | Any of subscriptions, invoices, one_off, instalments |
expected_monthly_volume, typical_amount, largest_amount | In pence: roughly a month’s collections, a typical debit, the largest |
customers | consumers, businesses or both |
how_customers_sign_up | Optional: how a customer comes to set up the Direct Debit |
Applying needs account:write (an owner or admin); reading needs account:read. Only one
application can be open at a time (a second returns direct_debit_application_open). When you
can’t apply, direct_debit_ineligible gives the reason and a fix_url:
reason | Means |
|---|---|
region | Direct Debit is for UK businesses taking pounds |
not_verified | Finish verifying your business. Live Direct Debit needs a live account |
held | Your account is on hold |
open_application | We’re already reviewing one |
declined_recently | You can reapply 30 days after a decline |
A Connect platform can apply for a connected account with
Tuppence-Account: acct_…. It’s reviewed as that business’s own application, names the platform
(connect_platform), and only Tuppence decides it.
What reviewers look for
Section titled “What reviewers look for”We read the application alongside your history with us: how long you’ve traded, card volume, dispute and refund rates, verification, open risk flags, what you sell, your website, and earlier applications. A clear reason, a sign-up your customers will recognise, and debits in line with what you take today all help. Some kinds of business can’t be approved.
| Outcome | What next |
|---|---|
| Approved, with limits | Direct Debit switches on automatically, usually within minutes |
| More information asked for | Answer with POST /v1/direct_debit/application/respond ({ "note": "…" }) or in the dashboard |
| Declined, with a note | decision_note says why; reapply_after says when you can apply again |
POST /v1/direct_debit/application/withdraw withdraws an open application.
0.25% + 14p a debit, capped at £3, from the same price list the fee engine charges (pricing). A subscription renewal by debit adds +0.30%, within the same cap. A failed debit costs nothing. No monthly fee, and nothing to apply.
| Debit | Our fee | You keep | |---|---|---| | A £10 debit | 17p | £9.83 | | A £50 debit | 27p | £49.73 | | A £100 debit | 39p | £99.61 | | A £1,000 debit | £2.64 | £997.36 | | A £1,144 debit | £3 | £1,141 | | A £10,000 debit (the most one debit can be) | £3 | £9,997 | | A £50 subscription renewal by debit | 42p | £49.58 |
GET /v1/direct_debit also returns the price (price: bps, fixed_minor, cap_minor). Each
payment’s fee_breakdown shows it was priced as bacs_debit.
When the money arrives
Section titled “When the money arrives”The money is in your balance 3 working days after the debit; a first debit on a new mandate
adds about 2 days. Until then nothing is paid to you, no fee is taken, and the debit can still fail.
payment.processing carries processing.expected_debit_date
(money that arrives later). Anything that completes on
payment, such as an invoice or a subscription period, waits for succeeded.
Limits
Section titled “Limits”Each approval sets two limits: the most one debit can be, and the most your debits can add up
to over a rolling 30 days (debits processing or succeeded). GET /v1/direct_debit shows
limits and usage (with remaining).
A debit over either limit is refused before anything is charged with direct_debit_limit_exceeded,
which includes period (debit or 30_days), limit, remaining and increase_url (Ask for
higher limits). Ask in the dashboard or with POST /v1/direct_debit/limit_increase
({ "monthly": 5000000, "reason": "…" }). It’s reviewed like an application.
Indemnity claims
Section titled “Indemnity claims”Under the Direct Debit Guarantee a payer can claim a debit back from their bank at any time. The bank refunds them at once, and the claim can’t be contested.
| It arrives as | A dispute with payment_method_type: "bacs_debit", contestable: false, already lost. We email you |
| It costs | The amount, plus the dispute fee, £15, from your balance. Our fee on the debit isn’t returned |
| Evidence | Saving or submitting evidence returns dispute_not_contestable. Contact your customer if it’s a mistake |
| Repeated claims | Direct Debit pauses while we review (direct_debit.paused). No new debits until then; the dashboard says why |
Refunds
Section titled “Refunds”| Status | pending for a few working days. refund.updated when it succeeds, refund.failed if it fails |
| Needs | The debit’s money available in your balance. Refunding a debit that has only just succeeded can fail at once. Retry once the money is available |
While processing | The refund waits for the debit to succeed |
| Claims | A refund doesn’t end the payer’s right to an indemnity claim, so a debit can be lost twice. Talk to your customer before refunding one they might also claim |
Mandates and saving for later
Section titled “Mandates and saving for later”Pay with save_card: "off_session" and the payer’s bank account and mandate are saved once the
first debit is processing. POST /v1/payments/charge_saved debits it again later, with nobody
there. If the payer or their bank cancels the mandate, you get payment_method.mandate_cancelled
and charges are refused with payment_method_unusable
(saved bank accounts). You can’t yet set up a
mandate without charging: the first payment sets it up.
Where it’s offered
Section titled “Where it’s offered”| Offered automatically | Never offered (refused with payment_method_unavailable) |
|---|---|
| Your pay page, payment links, invoices, subscriptions | Booking deposits, the till, credit top-ups, because the money takes days to arrive |
Live Direct Debit opens later. Until then a live-mode debit is refused with
payment_method_unavailable, even for an approved business. Test mode works now.
Testing
Section titled “Testing”A test-mode application is reviewed like a live one, so you can try the whole flow. Once approved, use the test bank details in the payment form (sort code 10-88-00), or confirm from your server with the matching test payment method:
| Account number | What happens | payment_method |
|---|---|---|
00012345 | Succeeds | pm_bacsDebit_success |
22222227 | Fails with insufficient_funds; the mandate stays active | pm_bacsDebit_insufficientFunds |
33333335 | Fails with debit_not_authorized; the mandate is cancelled | pm_bacsDebit_debitNotAuthorized |
55555559 | Succeeds, then the payer makes an indemnity claim | pm_bacsDebit_dispute |
34343434 | Fails: the account’s weekly Direct Debit limit is reached | pm_bacsDebit_exceedsWeeklyLimit |
To settle a test debit, advance the clock past the working days with
POST /v1/test_helpers/clock/advance (testing).
The API and webhooks
Section titled “The API and webhooks”| Endpoint | Node / Python | |
|---|---|---|
GET /v1/direct_debit | directDebit.retrieve() / direct_debit.retrieve() | Where you are: status, the application, limits, usage, price, and message and fix_url when something stops you |
POST /v1/direct_debit/application | .apply(…) | Apply |
POST /v1/direct_debit/application/respond | .respond(…) | Answer what we asked |
POST /v1/direct_debit/application/withdraw | .withdraw() | Withdraw an open application |
POST /v1/direct_debit/limit_increase | .requestLimitIncrease(…) / .request_limit_increase(…) | Ask for higher limits |
status is not_applied, ineligible, pending, info_requested, declined,
pending_capability, needs_action, on, paused or revoked. needs_action means approved,
but a few more details about your business are needed first: requirements lists them and
fix_url is where to give them. Over MCP, get_direct_debit reads the status and
apply_for_direct_debit applies.
| Events | |
|---|---|
direct_debit_application.submitted, .info_requested, .approved, .declined, .revoked, .withdrawn, .limits_changed | The application |
direct_debit.activated, .paused, .resumed | Direct Debit switched on, paused or resumed |
payment.processing, payment.succeeded, payment.failed | Each debit |
refund.updated, refund.failed | A debit’s refund |
payment_method.mandate_cancelled | A saved mandate cancelled |
Errors (all of them): direct_debit_ineligible,
direct_debit_application_open, direct_debit_not_enabled, direct_debit_paused,
direct_debit_limit_exceeded, payment_method_unusable, dispute_not_contestable.
- Take a payment: payments that arrive later.
- Subscriptions paid by Direct Debit.