Skip to main content

PayTo โ€” NPP-Based Pull Payments

PayTo is Australia's next-generation pull payment system, launched by NPP Australia (NPPA) in 2023. It replaces the legacy BECS Direct Debit Request (DDR) system with a real-time, customer-controlled mandate framework built on top of the New Payments Platform (NPP).


Why PayTo Was Created

BECS DDR (legacy direct debit) had fundamental problems:

  • No mandate registry โ€” unauthorised debits were possible
  • D+1 processing โ€” not real-time
  • Customers had no visibility or control
  • Long dispute windows (up to 7 years)
  • No structured data for reconciliation

PayTo solves all of these with a mandate-first, real-time, transparent architecture.


Key Participants

ParticipantRole
PayerThe customer whose account will be debited
Payee / Initiating PartyThe business/biller initiating the pull
Payer's Bank (Receiving Bank)Validates mandate, processes debit
Payee's Bank (Initiating Bank)Submits payment initiation on behalf of payee
NPPA / MMSOperates the Mandate Management Service
NPPReal-time payment rail carrying the funds

Mandate Management Service (MMS)

The MMS is the central registry for all PayTo mandates in Australia. Every active PayTo mandate is stored and validated here.

Mandate Attributes

Mandate:
โ”œโ”€โ”€ mandateId (UUID โ€” NPPA assigned)
โ”œโ”€โ”€ payerPayId or BSB/Account (how payer is identified)
โ”œโ”€โ”€ payeeId / creditorId
โ”œโ”€โ”€ description (shown to customer)
โ”œโ”€โ”€ purpose (e.g. LOAN, UTILITY, SUBSCRIPTION)
โ”œโ”€โ”€ maximumAmount (optional per-transaction cap)
โ”œโ”€โ”€ frequency: ADHOC | DAILY | WEEKLY | FORTNIGHTLY | MONTHLY | ANNUAL
โ”œโ”€โ”€ startDate
โ”œโ”€โ”€ endDate (null = indefinite)
โ”œโ”€โ”€ firstPaymentDate (optional)
โ”œโ”€โ”€ lastPaymentDate (optional)
โ””โ”€โ”€ status: CREATED | ACTIVE | PAUSED | CANCELLED | SUSPENDED | EXPIRED

Mandate Lifecycle

Payee initiates mandate via PayTo API
โ”‚
โ–ผ
MMS creates mandate in CREATED state
โ”‚
โ–ผ
Payer's bank notifies customer (push notification / internet banking)
โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”
โ”‚ โ”‚
Approved Rejected โ”€โ”€โ–บ Mandate REJECTED (terminal)
โ”‚
โ–ผ
Mandate ACTIVE
โ”‚
โ”œโ”€โ”€ Payee initiates payments against mandate
โ”‚
โ”œโ”€โ”€ Payer can PAUSE (temporarily stop debits)
โ”‚
โ”œโ”€โ”€ Payer can CANCEL (permanently revoke)
โ”‚
โ”œโ”€โ”€ Payer can AMEND (change caps, end date)
โ”‚
โ””โ”€โ”€ Mandate EXPIRED (end date reached)

Payment Initiation Flow

Once a mandate is ACTIVE, the payee initiates individual payments:

Payee / Initiating Bank
โ”‚ Submit PayTo payment instruction (NPP pacs.008 with mandate reference)
โ–ผ
NPP Gateway
โ”‚ Route to Payer's Bank
โ–ผ
Payer's Bank
โ”œโ”€โ”€ Real-time MMS mandate lookup
โ”œโ”€โ”€ Validate: mandate ACTIVE? Amount โ‰ค max? Frequency within limits?
โ”œโ”€โ”€ Run fraud/sanctions checks
โ”œโ”€โ”€ Check balance
โ””โ”€โ”€ Debit payer account
โ”‚
โ–ผ
NPP Fast Settlement Service (FSS / RBA)
โ”‚ RTGS settlement โ€” sub-second
โ–ผ
Payee's Bank
โ”‚ Credit payee account
โ–ผ
Payee notified (camt.054)

PayID Integration

PayTo mandates can reference payers via PayID instead of BSB/account:

PayID TypeExample
Mobile number0412 345 678
Email address[email protected]
ABN12 345 678 901
Organisation IDAssigned by bank

Using PayID makes mandates portable โ€” if the customer changes their bank account, they can reroute the PayID, and all existing PayTo mandates continue working.


Agreement Types

PayTo supports structured agreement types to describe the mandate purpose:

Purpose CodeDescription
LOANLoan repayment
UTILITYUtilities (electricity, gas, water)
SUBSCRIPTIONRecurring subscription service
INSURANCEInsurance premiums
MORTGAGEMortgage repayment
RENTALRent collection
GOVERNMENTGovernment payment
OTHERGeneral purpose

PayTo vs BECS DDR

FeatureBECS DDRPayTo
Mandate registryโŒ Noneโœ… Centralised MMS
Mandate validationโŒ No real-time checkโœ… Real-time per payment
Processing speedโŒ D+1โœ… Sub-second
SettlementDNSRTGS
Customer visibilityโŒ Not visibleโœ… Full in banking app
Customer controlโŒ Dispute onlyโœ… Approve/pause/cancel
Data richnessLimitedISO 20022 structured
PayID supportโŒโœ…
Dispute windowUp to 7 yearsStandard payment return

Engineering Integration

Initiating Party (Payee/Biller) Integration

// Step 1: Create mandate
PayToMandateRequest mandateReq = PayToMandateRequest.builder()
.payerPayId("0412345678")
.payerPayIdType(PayIdType.MOBILE)
.description("Monthly subscription - Premier Plan")
.purpose(AgreementPurpose.SUBSCRIPTION)
.frequency(PaymentFrequency.MONTHLY)
.maximumAmount(new Money(BigDecimal.valueOf(99.99), Currency.AUD))
.startDate(LocalDate.now())
.build();

MandateResponse response = payToClient.createMandate(mandateReq);
String mandateId = response.getMandateId(); // store for future payments

// Step 2: Poll or receive webhook for mandate status
mandateId โ†’ CREATED โ†’ (payer approves) โ†’ ACTIVE

// Step 3: Initiate payment against active mandate
PayToPaymentRequest paymentReq = PayToPaymentRequest.builder()
.mandateId(mandateId)
.amount(new Money(BigDecimal.valueOf(99.99), Currency.AUD))
.endToEndId(IdempotencyKeyGenerator.generate())
.description("January 2025 subscription")
.build();

PaymentResult result = payToClient.initiatePayment(paymentReq);

Webhook Handling (Mandate Status Changes)

@PostMapping("/payto/webhook")
public ResponseEntity<Void> handleMandateEvent(@RequestBody MandateEvent event) {
switch (event.getEventType()) {
case MANDATE_APPROVED:
mandateService.activate(event.getMandateId());
schedulerService.scheduleFirstPayment(event.getMandateId());
break;
case MANDATE_CANCELLED:
mandateService.cancel(event.getMandateId());
subscriptionService.suspend(event.getMandateId());
break;
case MANDATE_PAUSED:
schedulerService.suspendSchedule(event.getMandateId());
break;
case PAYMENT_RETURNED:
paymentService.handleReturn(event.getPaymentId(), event.getReturnCode());
break;
}
return ResponseEntity.ok().build();
}

Rejection and Return Reason Codes

PayTo uses ISO 20022 reason codes (unlike BECS DDR's proprietary codes):

CodeReason
AC01Invalid account number
AC04Closed account
AM04Insufficient funds
AG01Transaction forbidden (mandate not active)
MS02Not specified reason by customer
MD01No mandate โ€” mandate not found or not active
MD06Refund request by end customer

Migration Path from BECS DDR

For banks migrating biller customers from BECS DDR to PayTo:

Phase 1: New mandates go through PayTo only
Phase 2: Existing BECS DDR mandates migrated to MMS (bank-facilitated)
Phase 3: BECS DDR submissions disabled for PayTo-eligible payments
Phase 4: BECS DDR decommissioned

Key migration challenge: bulk migration of existing mandates requires contacting each customer to re-authorise via PayTo flow (cannot auto-migrate DDR forms to MMS without fresh consent).


Interview Questions

Q: What is the key architectural difference between PayTo and BECS DDR?

PayTo is mandate-first with a centralised real-time registry (MMS), validated at every payment. BECS DDR is trust-based โ€” no real-time registry exists, so any party that knows your BSB/account can submit a debit. PayTo also settles via RTGS (sub-second) vs BECS DDR's DNS (D+1).

Q: Can a PayTo payment proceed if the mandate is paused?

No. Before processing any PayTo payment, the payer's bank validates the mandate status in real-time against the MMS. A PAUSED or CANCELLED mandate will result in an immediate rejection with MD01 reason code.

Business Value

PayTo gives billers real-time collection certainty (no D+1 wait), lower dishonour rates (mandate validated upfront), and reduced fraud via consumer-controlled consent โ€” while giving customers unprecedented visibility and control over who can debit their account.