Skip to main content

Direct Debit — Pull Payment Mechanics

Direct debit is a pull payment — the receiving party (creditor/biller) initiates the collection from the payer's account, with the payer's prior authorisation via a mandate.

Unlike credit transfers where the debtor pushes funds, direct debit authorises a third party to pull funds on a schedule or on-demand.


Direct Debit vs Credit Transfer

Direct Debit (Pull)Credit Transfer (Push)
InitiatorCreditor (biller)Debtor (payer)
AuthorityMandate (pre-authorisation)Real-time instruction
Use caseSubscriptions, bills, loansOne-off payments, salary
Return riskDishonour possible after debitN/A (funds already authorised)
Australian examplesBECS DDR, PayToNPP Osko, BECS DE credit

Australian Direct Debit Schemes

1. BECS DDR (Direct Debit Request) — Legacy

BECS DDR (Bulk Electronic Clearing System — Direct Debit Request) is the legacy Australian direct debit scheme, operating since the 1990s.

AttributeDetail
OperatorAusPayNet
Format120-char fixed-width DE file
TimingD+1 (next business day processing)
SettlementDNS — 3 windows per day
Mandate typePaper or digital DDR form
Dispute windowCustomer can dispute up to 7 years (!!)
StatusStill widely used; being replaced by PayTo

BECS DDR File Record Types​

Record TypeDescription
0File header
1Descriptive record (batch info)
2Detail record (individual transaction)
7Batch control record
9File trailer

BECS DDR Transaction Codes (Field 1 in Detail Record)​

CodeMeaning
13Externally initiated debit
50Externally initiated credit
51Australian Government Security
52Family allowance
53Pay
54Pension
55Allotment
56Dividend

2. PayTo — Modern NPP-Based Direct Debit

PayTo (launched 2023) is the next-generation Australian direct debit scheme built on top of the NPP infrastructure.

AttributeDetail
OperatorNPP Australia (NPPA)
InfrastructureNPP / New Payments Platform
TimingReal-time (sub-second settlement)
SettlementRTGS via RBA FSS
Mandate typeDigital mandate via Mandate Management Service (MMS)
Customer controlPayer can view/manage/revoke mandates via internet banking
StatusActive — growing adoption, intended to replace BECS DDR

Mandate Management

BECS DDR Mandate Lifecycle

Payer completes paper/digital DDR form
│
▼
Creditor holds mandate (no central registry)
│
▼
Creditor submits debit instruction via DE file
│
▼
Payer's bank processes debit (no mandate validation — trust model)
│
▼
If invalid: bank returns dishonour code

⚠️ BECS DDR weakness: There is no real-time mandate validation. A creditor can submit a debit even if the customer never authorised it. The customer must catch this and dispute it.

PayTo Mandate Lifecycle

Creditor creates mandate request via PayTo API
│
▼
Mandate Management Service (MMS) routes to payer's bank
│
▼
Payer reviews and approves mandate in internet banking
│
▼ (or rejects → mandate REJECTED)
Mandate ACTIVE in MMS
│
▼
Creditor submits payment initiation against mandate
│
▼
Payer's bank validates mandate (real-time MMS lookup)
│
▼
If valid → NPP payment processes instantly
If invalid → payment rejected with reason code

PayTo Mandate States​

StateMeaning
CREATEDMandate submitted, awaiting payer action
ACTIVEApproved by payer — payments can be initiated
PAUSEDTemporarily suspended by payer
CANCELLEDPermanently revoked — no further payments
REJECTEDPayer rejected the mandate request
EXPIREDPast end date (if defined)
SUSPENDEDSuspended by creditor or bank

Dishonour & Return Codes (BECS DDR)

When a BECS direct debit cannot be processed, the receiving bank returns a dishonour:

CodeReasonAction
01Refer to customerCustomer must contact their bank
02Refer to customer with cautionPotential fraud concern
03No authority to debitNo valid DDR — contact creditor
04Account closedAccount no longer exists
05Account transferred to another bankUpdate BSB/account
06Account inactiveDormant account
07Invalid BSBBSB does not exist
08Amount not agreedAmount differs from DDR
09Invalid account numberFormat/checksum error
10Customer deceased
11Account not foundBSB/account combination invalid
12Account not eligible for debitsCredit-only account (e.g. savings)
13Non-sufficient funds (NSF)Insufficient balance at time of debit
14Funds withheld (attachment)Account under garnishment order
15Duplicate transactionSame debit submitted twice

Timing — BECS DDR

Day 0 (D): Creditor submits DE file to originating bank (before cut-off)
Day 1 (D+1): File sent to BECS clearing house overnight
Settlement occurs at morning window
Debit posts to payer account
Day 1 (D+1): Creditor receives credit (if on-us) or awaits return
Day 2 (D+2): Potential dishonour file returned (if any)

Dishonour return window: Bank has up to 7 business days to return a dishonour to the creditor's bank.


Engineering Patterns

Mandate Service

// PayTo mandate domain model
@Entity
public class PayToMandate {
private String mandateId; // NPPA-issued UUID
private String payerBsb;
private String payerAccountNumber;
private String creditorId;
private MandateStatus status;
private BigDecimal maximumAmount; // optional limit per transaction
private String frequency; // WEEKLY, FORTNIGHTLY, MONTHLY, ADHOC
private LocalDate startDate;
private LocalDate endDate; // null = indefinite
private Instant lastUpdated;
}

// Validate mandate before initiating PayTo payment
public PaymentResult initiatePayToDebit(String mandateId, BigDecimal amount) {
Mandate mandate = mandateRepository.findById(mandateId)
.orElseThrow(() -> new MandateNotFoundException(mandateId));

if (mandate.getStatus() != MandateStatus.ACTIVE) {
throw new MandateNotActiveException(mandate.getStatus());
}

if (mandate.getMaximumAmount() != null &&
amount.compareTo(mandate.getMaximumAmount()) > 0) {
throw new AmountExceedsMandateLimitException(amount, mandate.getMaximumAmount());
}

return nppGateway.initiatePayment(mandate, amount);
}

Dishonour Handling

// Process returned BECS dishonour file
public void processDishonourFile(BecsReturnFile returnFile) {
for (ReturnRecord record : returnFile.getRecords()) {
String dishonourCode = record.getDishonourCode();
String originalTransactionRef = record.getOriginalRef();

// Mark original debit as dishonoured
paymentRepository.updateStatus(
originalTransactionRef,
PaymentStatus.DISHONOURED
);

// Notify creditor
DishonourReason reason = DishonourReason.fromCode(dishonourCode);
creditorNotificationService.sendDishonourNotice(record, reason);

// Publish domain event for retry/write-off workflow
eventPublisher.publish(new PaymentDishonoured(originalTransactionRef, reason));
}
}

BECS DDR vs PayTo Comparison

FeatureBECS DDRPayTo
InfrastructureLegacy DE batchNPP real-time
Mandate validationNone (trust model)Real-time MMS lookup
Customer visibilityNoneFull visibility in banking app
Customer controlDispute after the factApprove/pause/cancel in app
Processing speedD+1Sub-second
SettlementDNSRTGS
Return codesBECS dishonour codesISO 20022 reason codes
Dispute windowUp to 7 yearsStandard payment dispute
AdoptionUniversalGrowing (2023+)

Interview Questions

Q: Why is BECS DDR considered a trust model and what risk does that create?

BECS DDR has no mandate registry. The creditor holds the paper/digital DDR form privately. When they submit a debit, the payer's bank cannot validate that a mandate exists — it just processes the debit. This creates the risk of unauthorised debits, which customers may not notice. The only protection is the customer's right to dispute — which can happen years later, creating chargeback risk for creditors.

Q: How does PayTo's mandate model solve this problem?

PayTo stores mandates in the centralised NPPA Mandate Management Service (MMS). Before processing any PayTo payment, the payer's bank validates the mandate in real-time. If no active mandate exists, the payment is rejected. This eliminates unauthorised debits while giving customers full visibility and control via their banking app.

Migration Note

Banks are gradually migrating BECS DDR volumes to PayTo, but full migration will take years due to the large number of billers (utilities, insurance, subscriptions) that need to rebuild their payment initiation systems.


📖
Track Page Progress0 / 635 Read
Knowledge Base Completion0%