Agent Wranglers

PAY-60Recommended

Keep a mandate for every bank debit

Before you debit a bank account, show the mandate text, store its acceptance with the time and text version, and email the payer a copy. Notify the payer before each debit.

How to do it

Bank debits such as SEPA Direct Debit and US ACH need the payer's written permission, called a mandate. A provider's checkout page shows the mandate text and stores acceptance for you. A custom form must show it before it confirms the payment. In the US, Regulation E requires a signed or electronically confirmed permission for recurring debits, with a copy to the consumer. When the amount varies, notice of the amount and date must arrive at least 10 days before the debit. Under the SEPA rules, notice before each debit goes out 14 calendar days ahead as standard, or the shorter time your mandate states. Stop debiting once the payer cancels the mandate. A bank can ask for proof months later, so keep it for Answer every dispute before its deadline. Settlement waits as in Wait for payment methods that settle later.

Examples

JavaScript example

const NOTICE_DAYS = { sepa_debit: 14, us_ach_varying: 10 }
const DAY_MS = 24 * 60 * 60 * 1000

const noticeDueAt = (debitAt, scheme) => new Date(debitAt.getTime() - NOTICE_DAYS[scheme] * DAY_MS)

Python example

from datetime import timedelta

NOTICE_DAYS = {"sepa_debit": 14, "us_ach_varying": 10}

def notice_due_at(debit_at, scheme):
    return debit_at - timedelta(days=NOTICE_DAYS[scheme])

How to check

A query finds no saved bank-debit payment method without a stored mandate, acceptance time and text version. A test debit on staging emails the payer a mandate copy. Its notice gives the amount and date, and goes out by the notice time the mandate states.

Sources

For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/payments/payment-events-and-reconciliation/bank-debit-mandate">Agent Wranglers payments playbook</a>. In code you write, add a comment next to it with the same link.