Skip to content

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
ApplyingThe same application and review. A European business is never refused for region
The payerGives an IBAN in the secure payment form and accepts the mandate, shown in their language
Price0.25% + 35c a debit, capped at €3. An indemnity claim costs the €15 dispute fee (pricing)
TimingA debit is processing for several banking days, then succeeded or failed
ClaimsA 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_detailstype: "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.

  1. ApplyPOST /v1/direct_debit/application
  2. Reviewedusually within a working day
  3. Approvedwith limits
  4. Ondirect_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.

Terminal window
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"
}'
Field
reasonWhy you want Direct Debit, at least 30 characters
useAny of subscriptions, invoices, one_off, instalments
expected_monthly_volume, typical_amount, largest_amountIn pence: roughly a month’s collections, a typical debit, the largest
customersconsumers, businesses or both
how_customers_sign_upOptional: 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:

reasonMeans
regionDirect Debit is for UK businesses taking pounds
not_verifiedFinish verifying your business. Live Direct Debit needs a live account
heldYour account is on hold
open_applicationWe’re already reviewing one
declined_recentlyYou 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.

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.

OutcomeWhat next
Approved, with limitsDirect Debit switches on automatically, usually within minutes
More information asked forAnswer with POST /v1/direct_debit/application/respond ({ "note": "…" }) or in the dashboard
Declined, with a notedecision_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.

PayerTuppenceYour serversigns mandate, confirmsBacs emailspayment.processing~3 working dayspayment.succeeded / .failed

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.

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.

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 asA dispute with payment_method_type: "bacs_debit", contestable: false, already lost. We email you
It costsThe amount, plus the dispute fee, £15, from your balance. Our fee on the debit isn’t returned
EvidenceSaving or submitting evidence returns dispute_not_contestable. Contact your customer if it’s a mistake
Repeated claimsDirect Debit pauses while we review (direct_debit.paused). No new debits until then; the dashboard says why
Statuspending for a few working days. refund.updated when it succeeds, refund.failed if it fails
NeedsThe 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 processingThe refund waits for the debit to succeed
ClaimsA 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

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.

Offered automaticallyNever offered (refused with payment_method_unavailable)
Your pay page, payment links, invoices, subscriptionsBooking 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.

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 numberWhat happenspayment_method
00012345Succeedspm_bacsDebit_success
22222227Fails with insufficient_funds; the mandate stays activepm_bacsDebit_insufficientFunds
33333335Fails with debit_not_authorized; the mandate is cancelledpm_bacsDebit_debitNotAuthorized
55555559Succeeds, then the payer makes an indemnity claimpm_bacsDebit_dispute
34343434Fails: the account’s weekly Direct Debit limit is reachedpm_bacsDebit_exceedsWeeklyLimit

To settle a test debit, advance the clock past the working days with POST /v1/test_helpers/clock/advance (testing).

EndpointNode / Python
GET /v1/direct_debitdirectDebit.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_changedThe application
direct_debit.activated, .paused, .resumedDirect Debit switched on, paused or resumed
payment.processing, payment.succeeded, payment.failedEach debit
refund.updated, refund.failedA debit’s refund
payment_method.mandate_cancelledA 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.

Docs assistant

Open as a page
Loading the assistant…