FinchContext
Run with

Build Single Touch Payroll (STP) Phase 2 Pay Event

Skill: Convert a pay run into the STP Phase 2 pay event reported to the ATO

Region: Australia Category: Payroll — Single Touch Payroll (STP) reporting Does: Takes an ordinary pay run and produces the Single Touch Payroll Phase 2 pay event (the payevnt / payeventemp message) lodged with the ATO through the Standard Business Reporting (SBR2) channel, carrying employer details, per-payee year-to-date gross, PAYG withholding and super, with gross disaggregated into the STP2 income components. System: ATO Single Touch Payroll (STP) Phase 2 via SBR2

The STP pay event reports cumulative year-to-date amounts, not just this period's figures — the latest accepted YTD set replaces the previous one. It must be lodged on or before the day employees are paid. Validate against the current ATO STP Phase 2 business implementation guide before sending.


When this applies


Input data required

Input STP / payroll term
Employer ABN or WPN; branch number Payer ABN (BMS payer identifier) / Withholding Payer Number
BMS identifier (your payroll software's ID) BMS ID
Pay/Update indicator, run date, pay period start/end Pay event header
Payee TFN (or exemption code), payroll ID, name, DOB, address Payee identification
Employment basis, income type, country code, tax treatment code STP2 payee attributes
YTD gross disaggregated (see mapping), allowances, deductions Income components
YTD PAYG amount withheld Payee withholding
YTD employer super (SG) liability and reportable employer super (RESC) Super entitlement

Each payee carries a TFN (or a valid TFN exemption code, e.g. 000000000 where not provided) and the payer-assigned payroll ID. The BMS ID ties the YTD figures to the payroll system that generated them; changing BMS ID requires care to avoid duplicating YTD.


Message structure (payevnt / payeventemp)

The pay event is one payer-level message (payevnt) containing one or more employee records (payeventemp):

PAYEVNT (payer level)
├── Australian Business Number / WPN, Branch
├── BMS Identifier
├── Pay/Update Date, Run Date-Time
├── Submission Id, Period totals (PAYEVNT signed amounts)
└── PAYEVNTEMP (one per payee)
    ├── Payee TFN (or exemption), Payroll ID, Name, DOB, Address
    ├── Employment Basis (F/P/C/L/D), Income Type, Country Code
    ├── Tax Treatment Code (6-char, e.g. RTXXXX)
    ├── Income Stream Collection
    │   ├── Gross (disaggregated — see below)
    │   ├── PAYG Amount Withheld (YTD)
    │   ├── Allowances (by type code: CD, TD, KN, LD, MD, QN, TR, OD ...)
    │   ├── Deductions (Union/Professional Assoc; Child Support G/D)
    │   ├── Lump Sum (A/B/D/E/W), ETP collection
    │   └── Super Entitlements (SG liability; RESC; OSO)
    └── ...

Disaggregation of gross (STP2): Phase 2 splits what Phase 1 reported as a single "gross" into separately reported components. Report YTD amounts for: Gross (residual), Paid Leave, Allowances (itemised by type), Overtime, Bonuses and Commissions, Directors' Fees, Salary Sacrifice (S — superannuation, O — other employee benefits), Lump Sum payments and ETP separately. Amounts are signed and cumulative for the financial year.


Calculation rules


Worked example (one payee, financial year to date)

{
  "PAYEVNT": {
    "Australian.BusinessNumber.Identifier": "53004085616",
    "Organisation.PayrollHeadcount.Number": 1,
    "Software.Information.BusinessManagementSystemIdentifier": "BMS-ACME-001",
    "PayEvent.RunDateTime.Generation.Datetime": "2025-08-15T18:05:00",
    "Payer.PayPeriod.StartDate": "2025-08-01",
    "Payer.PayPeriod.EndDate": "2025-08-15",
    "Payer.MessageTimestamp.Generation.Datetime": "2025-08-15T18:05:00",
    "Payer.TotalPaymentAmount": 4200.00,
    "Payer.IncomeTaxAndSuperablePeriod.PayAsYouGoWithholding.TaxAmount": 980.00,
    "PAYEVNTEMP": [
      {
        "Payee.TaxFileNumber.Identifier": "123456782",
        "Payee.PayrollIdentifier": "EMP-0042",
        "Payee.Person.FamilyName.Text": "Nguyen",
        "Payee.Person.GivenName.Text": "Priya",
        "Payee.Birth.Date": "1990-04-12",
        "Payee.EmploymentBasis.Code": "F",
        "Income.Stream.Type.Code": "SAW",
        "Payee.Income.TaxTreatment.Code": "RTXXXX",
        "Income": {
          "Gross.Payments.Amount": 38000.00,
          "PaidLeave": [{ "Type.Code": "O", "Payments.Amount": 1800.00 }],
          "Overtime.Payments.Amount": 1200.00,
          "BonusesAndCommissions.Payments.Amount": 0.00,
          "Allowances": [
            { "Type.Code": "CD", "Payments.Amount": 600.00 },
            { "Type.Code": "TD", "Payments.Amount": 320.00 }
          ],
          "SalarySacrifice": [{ "Type.Code": "S", "Payments.Amount": 2000.00 }],
          "PayAsYouGoWithholding.Tax.Withheld.Amount": 8600.00
        },
        "Super": [
          { "Entitlement.Type.Code": "SGC", "Payments.Amount": 4600.00 },
          { "Entitlement.Type.Code": "RESC", "Payments.Amount": 2000.00 }
        ]
      }
    ]
  }
}

This is the logical payload; the SBR2 channel transports it as the payevnt/payeventemp XBRL/XML message. Code values (income type SAW, allowance types CD/TD, salary sacrifice S, super SGC/RESC, tax treatment code) follow the ATO STP Phase 2 lists.


Validation checklist


Last updated: 2026-06-04 — confirm the active schema version, field codes, and ATO/portal requirements against the current Australian Taxation Office specifications before use.