<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rostery Team</title>
    <description>The latest articles on DEV Community by Rostery Team (@rostery).</description>
    <link>https://dev.to/rostery</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4170736%2F5ddb616e-634c-4a90-b486-2b11440ee017.png</url>
      <title>DEV Community: Rostery Team</title>
      <link>https://dev.to/rostery</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rostery"/>
    <language>en</language>
    <item>
      <title>Modelling the SCHADS Award as Data: Effective Dates, Additive Casual Loading and Test Fixtures for 2026-27</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Wed, 04 Nov 2026 03:20:51 +0000</pubDate>
      <link>https://dev.to/rostery/modelling-the-schads-award-as-data-effective-dates-additive-casual-loading-and-test-fixtures-for-2756</link>
      <guid>https://dev.to/rostery/modelling-the-schads-award-as-data-effective-dates-additive-casual-loading-and-test-fixtures-for-2756</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally based on our article &lt;a href="https://rostery.com.au/blog/automate-schads-award-interpretation-ndis" rel="noopener noreferrer"&gt;How to automate SCHADS award interpretation for NDIS payroll&lt;/a&gt; on rostery.com.au. This version is rewritten for developers, payroll analysts and anyone maintaining the pay rules inside a disability or home care provider's systems. It also corrects two points from the original (casual overtime and the vehicle allowance), covered below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The arithmetic in SCHADS payroll is easy. A rate times hours, a percentage, an allowance. What goes wrong is everything around the arithmetic: which rate was in force, which band a shift falls in, whether the casual loading stacks or multiplies, and whether last year's allowance amount is still sitting in a config file somewhere.&lt;/p&gt;

&lt;p&gt;2026-27 is a good year to look at this, because the Social, Community, Home Care and Disability Services Industry Award (MA000100) changes twice in five months. The Annual Wage Review lifted minimum rates by 4.75% from the first full pay period starting on or after 1 July 2026. Then home care employees doing disability work (Schedule E) get an increase of up to 15% from the first full pay period starting on or after 1 December 2026, under the Fair Work Commission's decision in [2026] FWCFB 232. A rules engine that treats rates as constants will be wrong twice this year.&lt;/p&gt;

&lt;p&gt;This post walks through a small Python model that keeps the rules as dated data, splits shifts into bands, applies the casual loading the right way, and pins it all down with test fixtures you can check against the Fair Work Ombudsman pay guide.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not payroll or legal advice. Figures are from the Fair Work Ombudsman's SCHADS pay guide effective from the first full pay period on or after 1 July 2026, using Social and Community Services (SACS) Level 2, pay point 1 at $36.22 an hour. Check the current award and pay guide before you rely on any number.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three kinds of rule, three kinds of table
&lt;/h2&gt;

&lt;p&gt;Most hand-rolled SCHADS logic mixes three different things in the same formula. Pull them apart first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhbjt13vehp4lcrl1m36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhbjt13vehp4lcrl1m36.png" alt="Flow from a worked shift to pay lines: look up the rate in force for the employee's stream, level and pay point, split the hours into bands, apply the band percentage plus the casual loading, add allowances from a dated list, then output one explained line per band and allowance" width="799" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rates.&lt;/strong&gt; A dollar amount per classification (stream, level, pay point), with the date it took effect. These change at least once a year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multipliers.&lt;/strong&gt; Percentages of the ordinary rate for each band: Saturday 150%, Sunday 200%, public holidays 250%, and for employees engaged as shiftworkers, 12.5% extra for an afternoon shift and 15% for a night shift. These rarely change, but the rules for when they apply are where most bugs live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allowances.&lt;/strong&gt; Flat amounts with a unit: per night, per shift, per kilometre. They are adjusted on their own schedule and they appear as separate lines on a payslip.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the shape of it in code. Money is &lt;code&gt;Decimal&lt;/code&gt;, never &lt;code&gt;float&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ROUND_HALF_UP&lt;/span&gt;

&lt;span class="n"&gt;CENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;money&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rounding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ROUND_HALF_UP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Rates: one row per classification per effective date
&lt;/span&gt;&lt;span class="n"&gt;BASE_RATES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# (stream, level, pay_point, effective_from, hourly)
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SACS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;36.22&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Multipliers: share of the ordinary rate, by band
&lt;/span&gt;&lt;span class="n"&gt;PENALTY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;afternoon&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.125&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# shiftworker: finishes after 8pm, at or before midnight
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;night&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.15&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;# shiftworker: finishes after midnight or starts before 6am
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;saturday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sunday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;public_holiday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;CASUAL_LOADING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.25&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Allowances: flat amounts with a unit, also dated
&lt;/span&gt;&lt;span class="n"&gt;ALLOWANCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# (code, unit, effective_from, amount)
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sleepover&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;per_night&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;62.87&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;broken_shift_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;per_shift&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;21.81&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;broken_shift_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;per_shift&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;28.87&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vehicle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;per_km&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.05&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original article suggested the kilometre allowance sits outside the annual review cycle. It doesn't: the vehicle allowance moved to $1.05 per kilometre from July 2026 along with everything else. If your allowance table has no effective date column, that's the first thing to add.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effective dating, and the "first full pay period" problem
&lt;/h2&gt;

&lt;p&gt;Every lookup takes a date. The simplest version picks the latest row that started on or before that date:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rate_in_force&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Latest row for this key whose effective_from is on or before `on`.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;LookupError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no rate for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The catch is what date you pass in. Award increases don't start on a calendar date. They start from the first full pay period that begins on or after the operative date. So the real start date depends on the employer's pay calendar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;first_full_period_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period_days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;First pay period starting on or after `change`, given any known period start.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;period_days&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;period_days&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;first_full_period_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 2026-12-07
&lt;/span&gt;&lt;span class="nf"&gt;first_full_period_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 2026-12-14
&lt;/span&gt;&lt;span class="nf"&gt;first_full_period_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 2026-12-07
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1 December 2026 is a Tuesday. A weekly pay run that starts on Mondays picks up the new rates from Monday 7 December. A fortnightly run that started on Monday 30 November doesn't get them until 14 December, because that fortnight began before the operative date.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnfpvn51uvmmctriuzt4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnfpvn51uvmmctriuzt4.png" alt="When the new Schedule E rates start for three example pay calendars around Tuesday 1 December 2026: weekly from Monday, new rates from 7 December; fortnightly starting 30 November, from 14 December; fortnightly starting 23 November, from 7 December; Schedule B (SACS) staff have no rate change on 1 December" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two sensible ways to store this. You can write the rate row with &lt;code&gt;effective_from&lt;/code&gt; set to the employer's actual first full period, which keeps lookups simple but means the table is employer-specific. Or you can keep the award's operative date in the table and map each shift to its pay period start before the lookup. Some systems, Rostery included, look up the rate in force on the date of the shift. Whatever your system does, put a shift from the days between the operative date and the next period start into your tests, so you know which rate it picks and can decide whether that matches how you pay.&lt;/p&gt;

&lt;p&gt;For the December change in particular, check which schedule each employee is under. The up-to-15% increase applies to Schedule E (home care employees doing disability work). SACS employees under Schedule B have no rate change on 1 December. A table keyed on level alone, without the stream, will get this wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bands come from real times and calendar days
&lt;/h2&gt;

&lt;p&gt;A shift's band depends on when it was worked, so the input should be the approved actual start and finish, not the rostered times. Two rules matter most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekend and public holiday rates replace shift loadings.&lt;/strong&gt; A Saturday shift that finishes at 10pm is paid at the Saturday rate, not Saturday plus the afternoon loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar days split shifts.&lt;/strong&gt; A shift running from Saturday night into Sunday morning has Saturday hours and Sunday hours. A public holiday covers midnight to midnight.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The afternoon and night loadings work the other way: if a weekday shift qualifies, the loading applies to the whole shift, not just the hours after 8pm. That is an easy bug to write, because the "split by clock time" logic you need for weekends is exactly wrong for weekday shift loadings. Note too that these two loadings are defined for employees engaged as shiftworkers. For a day worker, time outside the 6am to 8pm span is treated differently, so the employee's engagement type needs to be an input.&lt;/p&gt;

&lt;h2&gt;
  
  
  The casual loading adds; it doesn't multiply
&lt;/h2&gt;

&lt;p&gt;This is the error that shows up most often in spreadsheets, and it's worth a function of its own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hourly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;casual&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;multiplier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PENALTY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CASUAL_LOADING&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;casual&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;money&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;multiplier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a casual SACS Level 2.1 worker on a Saturday, that gives 150% + 25% = 175% of $36.22, which is $63.39 an hour, or $507.12 for eight hours. The tempting version takes the casual rate ($45.28) and multiplies it by 150%, giving $67.92 an hour and $543.36 for the same shift. That's $36.24 too much on one shift, and the mirror-image mistake on other lines underpays.&lt;/p&gt;

&lt;p&gt;The same addition gives the casual Sunday rate (225%, $81.50) and the casual public holiday rate (275%, $99.61).&lt;/p&gt;

&lt;p&gt;The original article also said the casual loading doesn't simply add on top of overtime. For casuals it does: the pay guide lists casual overtime at 175% for the first two hours and 225% after that (Monday to Saturday), 225% on Sundays and 275% on public holidays, which is the full-time overtime rate plus 25%. Overtime triggers (daily hours, outside the span, weekly hours) deserve their own module and their own tests; we've left them out of this sketch to keep it short.&lt;/p&gt;

&lt;h2&gt;
  
  
  Allowances are configuration, with structure rules attached
&lt;/h2&gt;

&lt;p&gt;The amounts belong in the dated &lt;code&gt;ALLOWANCES&lt;/code&gt; table. What the code has to work out is when each one applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Broken shift.&lt;/strong&gt; Two or more periods of work on the same day with an unpaid break between them, all inside a 12-hour span. One unpaid break attracts $21.81; two attract $28.87. Count the gaps in the approved times for the day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimum engagement.&lt;/strong&gt; Part-time and casual staff doing disability or home care work are paid at least two hours for each shift, and for each period of work in a broken shift. A 45-minute visit is paid as two hours, at the rate for that day. The rules are on our &lt;a href="https://rostery.com.au/glossary/minimum-engagement" rel="noopener noreferrer"&gt;minimum engagement glossary page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sleepover.&lt;/strong&gt; A flat $62.87 for the sleepover period, with work before and after it treated as separate periods for band purposes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vehicle.&lt;/strong&gt; Kilometres times the dated per-km amount.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each allowance should come out as its own line with a reference to the clause behind it, so a person checking the payslip can see it. Our &lt;a href="https://rostery.com.au/glossary/broken-shift" rel="noopener noreferrer"&gt;broken shift glossary entry&lt;/a&gt; and the &lt;a href="https://rostery.com.au/glossary/casual-loading" rel="noopener noreferrer"&gt;casual loading explainer&lt;/a&gt; have the plain-English versions if you need to agree the rules with a payroll officer before coding them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixtures: the expected values come from the pay guide, not from your code
&lt;/h2&gt;

&lt;p&gt;Unit tests that compare the engine with itself prove nothing. Write the expected values by hand from the Fair Work Ombudsman pay guide and keep them in a fixture file. Here's a starting set for a casual SACS Level 2.1 employee:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50j5e54oqphq1cvug32d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50j5e54oqphq1cvug32d.png" alt="Test fixtures for a casual SACS Level 2 pay point 1 employee from July 2026: Saturday 8 hours $507.12; Sunday hourly $81.50; public holiday hourly $99.61; weekday afternoon shift 3pm to 9:30pm $323.70; broken shift 7 to 9am and 4 to 7pm $248.21 including the $21.81 allowance; sleepover allowance $62.87" width="799" height="373"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;36.22&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# SACS L2.1 from the first full pay period on or after 1 July 2026
&lt;/span&gt;
&lt;span class="nd"&gt;@pytest.mark.parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;band,hours,expected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;saturday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;507.12&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sunday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;81.50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;public_holiday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;99.61&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;afternoon&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;323.70&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;   &lt;span class="c1"&gt;# Thu 3pm to 9:30pm, shiftworker
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;271.68&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_casual_bands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;money&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hourly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;casual&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_broken_shift_with_one_break&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;worked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;money&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hourly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;casual&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 7-9am and 4-7pm
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;worked&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;21.81&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;248.21&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_casual_loading_is_not_multiplied&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;hourly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;saturday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;casual&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nf"&gt;money&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;money&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.25&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These numbers match the worked example on Rostery's &lt;a href="https://rostery.com.au/features/schads-payroll" rel="noopener noreferrer"&gt;SCHADS payroll engine page&lt;/a&gt;, which builds a full week for a casual Level 2.1 worker and shows each line. Add fixtures for the cases that bite: a shift crossing midnight into a public holiday, a 1.5-hour visit (minimum engagement), a shift between 1 December and your first full pay period, and a Schedule B employee in December who should see no change. When the 1 December pay guide is your source, write those expected values from it rather than calculating 15% yourself, because not every level rises by the full amount.&lt;/p&gt;

&lt;p&gt;The free &lt;a href="https://rostery.com.au/tools/schads-pay-rates" rel="noopener noreferrer"&gt;SCHADS pay rates table&lt;/a&gt; and the &lt;a href="https://rostery.com.au/tools/schads-pay-calculator" rel="noopener noreferrer"&gt;SCHADS pay calculator&lt;/a&gt; are handy for cross-checking a fixture before you commit it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show the working
&lt;/h2&gt;

&lt;p&gt;The last design rule is the one that keeps payroll staff on side: every number on the output should be explainable. One line per band and per allowance, each with hours, rate and amount. A total with no breakdown can't be checked, and a payroll officer who can't check a number will rebuild it in a spreadsheet, which brings you back where you started.&lt;/p&gt;

&lt;p&gt;In Rostery, approved timesheets come out line by line in exactly this way before they're exported to Xero Payroll, Employment Hero or &lt;a href="https://rostery.com.au/integrations/quickbooks" rel="noopener noreferrer"&gt;QuickBooks Online&lt;/a&gt;, where the pay run itself happens. Allowance amounts live in an editable list rather than in code. Whether you build or buy, the pattern holds: dated rates, bands from real times, an additive casual loading, allowances as data, and fixtures written from the pay guide.&lt;/p&gt;

&lt;p&gt;If you want the plain-English background before writing any code, we covered the penalty and broken-shift rules in &lt;a href="https://dev.to/rostery/schads-award-explained-penalties-broken-shifts-sleepovers-and-overtime-3094"&gt;SCHADS Award explained: penalties, broken shifts, sleepovers and overtime&lt;/a&gt;, and a short list of test shifts for non-developers in &lt;a href="https://rostery.blogspot.com/2026/11/five-test-shifts-to-run-before-you.html" rel="noopener noreferrer"&gt;Five test shifts to run before you trust your SCHADS payroll&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: Social, Community, Home Care and Disability Services Industry Award 2010 (MA000100), clauses 10, 25, 26, 28, 29 and 34; Fair Work Ombudsman, SCHADS pay guide from the first full pay period on or after 1 July 2026; Fair Work Commission, Annual Wage Review 2025-26 [2026] FWCFB 3500; Fair Work Commission, [2026] FWCFB 232 (Schedule E increases from 1 December 2026). Rostery feature and tool pages read 4 November 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written by the Rostery team in Sydney. Rostery makes rostering, care and billing software for NDIS and aged care providers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>payroll</category>
      <category>testing</category>
      <category>australia</category>
    </item>
    <item>
      <title>Parsing NDIS Support Item Numbers in 2026-27: Fields, Claim-Type Suffixes and Five Checks Before the Claim File</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Tue, 03 Nov 2026 03:26:05 +0000</pubDate>
      <link>https://dev.to/rostery/parsing-ndis-support-item-numbers-in-2026-27-fields-claim-type-suffixes-and-five-checks-before-1c64</link>
      <guid>https://dev.to/rostery/parsing-ndis-support-item-numbers-in-2026-27-fields-claim-type-suffixes-and-five-checks-before-1c64</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally based on our article &lt;a href="https://rostery.com.au/blog/ndis-support-item-numbers-explained" rel="noopener noreferrer"&gt;NDIS support item numbers explained: what every part of 01_011_0107_1_1 means&lt;/a&gt; on rostery.com.au. This version is rewritten for the people who set up price lists, build claim exports or look after the billing side of an NDIS provider's systems.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every NDIS claim line carries a support item number, and most of the claiming problems we see start with that one field. The wrong time-of-day item, a travel line on a number that doesn't allow travel, an item the provider isn't registered for, a price copied from last year's list. None of these are hard to catch. They just need to be caught before the bulk upload rather than after the NDIA sends the file back.&lt;/p&gt;

&lt;p&gt;This post treats the item number as data. We'll split it into its fields, look at what changed in the 2026-27 Support Catalogue, write a small Python sketch that picks the right time band, and finish with five checks to run on every line before you build the claim file.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not claiming or legal advice. The 2026-27 Pricing Schedule, the NDIS Support Catalogue and the NDIA's current guidance always come first.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the numbers come from
&lt;/h2&gt;

&lt;p&gt;Three documents matter, and it helps to know which does what.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;NDIS Pricing Schedule 2026-27&lt;/strong&gt; sets the maximum amounts. Since 24 September 2026 it has the force of law through the NDIS (Pricing Arrangements) Determination 2026, and it lists 611 items with printed prices.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;NDIS Support Catalogue 2026-27 v1.1&lt;/strong&gt; is the spreadsheet you actually load. It has 976 current items and 41 legacy items, each with its unit, national, remote and very remote limits, start and end dates, and flags for which claim types are allowed.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Pricing Arrangements and Price Limits 2025-26 v1.1&lt;/strong&gt; is still the NDIA's claiming guidance. The NDIA says it will publish updated pricing and claiming guidance documents shortly, so check for a newer version before you rely on any rule below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building anything, load the catalogue rather than copying prices from a PDF. You get dates and flags, not just dollars.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fields
&lt;/h2&gt;

&lt;p&gt;An item number such as &lt;code&gt;01_011_0107_1_1&lt;/code&gt; splits on the underscore into five parts. Since 2026-27, many items also carry a sixth.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69z44rgdqh7c2ek7flnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69z44rgdqh7c2ek7flnp.png" alt="Table showing each part of an NDIS support item number: support category (2 digits, 01 to 15), sequence (usually 3 digits, 9 for many assistive technology items), registration group (4 digits), outcome domain (1 to 8), support purpose (1 Core, 2 Capital, 3 Capacity Building) and the claim-type suffix on therapy and professional items, with the rejection code linked to each check" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things trip people up when they store these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep it as text.&lt;/strong&gt; The sequence and registration group have leading zeros (&lt;code&gt;0107&lt;/code&gt;), and the sequence isn't a fixed width. In the 2026-27 catalogue, 270 items use a 9-digit sequence (mostly assistive technology) and 9 use 4 digits. A spreadsheet that turns &lt;code&gt;0107&lt;/code&gt; into &lt;code&gt;107&lt;/code&gt;, or a column typed as a number, will quietly break matching. The NDIA's bulk upload guide allows up to 60 characters in the &lt;code&gt;SupportNumber&lt;/code&gt; field, so don't truncate either.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The support purpose is the last base digit.&lt;/strong&gt; In the current catalogue that's 243 Core items, 238 Capital and 494 Capacity Building. One further item, the bereavement support, has no number at all, so your loader needs to cope with a blank.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The category and the purpose don't always line up the way you'd expect.&lt;/strong&gt; Fourteen therapy and early childhood items appear in category 01 (Assistance with Daily Life) with a purpose of 3 (Capacity Building). &lt;code&gt;01_665_0128_1_3&lt;/code&gt; and &lt;code&gt;15_622_0128_1_3&lt;/code&gt; are both speech pathology direct service at $193.99 an hour. They draw on different budgets, so matching on the description alone will pick the wrong one half the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Units vary.&lt;/strong&gt; Of the 976 current items, 602 are claimed by the hour, 350 per item (each), 11 per year, 6 per week, 5 per day and 2 per month. Quantity validation has to follow the unit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The claim-type suffix
&lt;/h2&gt;

&lt;p&gt;This is the biggest structural change in 2026-27. Therapy and other professional items now have a separate number for each kind of claim:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Suffix&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(none)&lt;/td&gt;
&lt;td&gt;Direct service&lt;/td&gt;
&lt;td&gt;the session price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_CA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Short-notice cancellation&lt;/td&gt;
&lt;td&gt;same as the session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_NF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Non-face-to-face work&lt;/td&gt;
&lt;td&gt;same as the session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_PT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provider travel&lt;/td&gt;
&lt;td&gt;half the session price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_RR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NDIA requested reports&lt;/td&gt;
&lt;td&gt;same as the session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_TH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Telehealth&lt;/td&gt;
&lt;td&gt;same as the session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There are 335 of these suffix items across 67 sets, including three &lt;code&gt;_CA2&lt;/code&gt; and &lt;code&gt;_NF2&lt;/code&gt; variants for two specific items. We checked every &lt;code&gt;_PT&lt;/code&gt; item in the catalogue: each is exactly half its direct service price, so speech pathology travel is $97.00 an hour against a $193.99 session.&lt;/p&gt;

&lt;p&gt;Items without a suffix, such as core daily-living supports, still use the older approach. The number stays the same and the bulk CSV's &lt;code&gt;ClaimType&lt;/code&gt; column says what kind of claim it is: blank for direct service, or &lt;code&gt;CANC&lt;/code&gt;, &lt;code&gt;REPW&lt;/code&gt;, &lt;code&gt;TRAN&lt;/code&gt;, &lt;code&gt;NF2F&lt;/code&gt;, &lt;code&gt;THLT&lt;/code&gt; or &lt;code&gt;IRSS&lt;/code&gt;. Cancellations also need a &lt;code&gt;CancellationReason&lt;/code&gt; code. Whether a claim type is allowed against a base item is in the catalogue's flag columns. If the claim type and the item don't agree, expect rejection &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes/c29" rel="noopener noreferrer"&gt;C29, "This support item is not allowed for this claim type selection"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A sensible pattern is to validate the shape with one expression and then look the number up in the catalogue for everything else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;ITEM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^(?P&amp;lt;category&amp;gt;\d{2})_(?P&amp;lt;sequence&amp;gt;\d{3,9})_(?P&amp;lt;reg_group&amp;gt;\d{4})&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_(?P&amp;lt;outcome&amp;gt;[1-8])_(?P&amp;lt;purpose&amp;gt;[1-3])&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?:_(?P&amp;lt;suffix&amp;gt;CA2|NF2|CA|NF|PT|RR|TH))?$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ITEM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not an item number: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupdict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15_622_0128_1_3_PT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {'category': '15', 'sequence': '622', 'reg_group': '0128',
#  'outcome': '1', 'purpose': '3', 'suffix': 'PT'}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern only tells you the number is well formed. Whether it exists, what it costs and what it allows all come from the catalogue row.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking the time-of-day item
&lt;/h2&gt;

&lt;p&gt;For daily-living supports, the day and time decide the number. Self-care has a weekday daytime item (&lt;code&gt;01_011_0107_1_1&lt;/code&gt;, $73.58 an hour), evening (&lt;code&gt;01_015&lt;/code&gt;, $81.07), night (&lt;code&gt;01_002&lt;/code&gt;, $82.57), Saturday (&lt;code&gt;01_013&lt;/code&gt;, $103.54), Sunday (&lt;code&gt;01_014&lt;/code&gt;, $133.50), public holiday (&lt;code&gt;01_012&lt;/code&gt;, $163.46) and a sleepover item (&lt;code&gt;01_010&lt;/code&gt;, $311.79 each). Those are national limits.&lt;/p&gt;

&lt;p&gt;Part 4 of the Pricing Schedule defines the bands. For supports other than nursing, weekday daytime starts at or after 6 am and ends at or before 8 pm; evening starts at or after 8 pm and finishes by midnight; night crosses midnight or starts before 6 am. Saturday, Sunday and public holiday supports run from midnight to midnight. Part 2 then adds the rule that matters most for code: where a support crosses times or days and one worker delivers all of it, the higher amount applies to the whole support.&lt;/p&gt;

&lt;p&gt;That makes the logic simpler than it looks. Work out every band the shift touches and take the most expensive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="n"&gt;SELF_CARE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;# national limits, Pricing Schedule 2026-27
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_011_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;73.58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# weekday daytime
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_015_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;81.07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# weekday evening
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_002_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;82.57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# weekday night
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_013_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;103.54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Saturday
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_014_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;133.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Sunday
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_012_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;163.46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# public holiday
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;band_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_012_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_013_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_014_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_002_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_011_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;01_015_0107_1_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;item_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;One worker, one continuous support, not a sleepover, not nursing.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;touched&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;touched&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;band_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;holidays&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;touched&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SELF_CARE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A weekday shift from 6 pm to 10 pm touches daytime and evening, so the whole four hours go on the evening item. A shift from 10 pm Friday to 2 am Saturday touches evening and Saturday, so it's all Saturday. Three caveats before you lift this into production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;holidays&lt;/code&gt; has to hold the public holidays for the state or region &lt;strong&gt;where the support is delivered&lt;/strong&gt;, not where your office is.&lt;/li&gt;
&lt;li&gt;Sleepovers are a separate definition (eight hours or more across midnight, worker allowed to sleep) and a separate item. If more than two hours of active support happen overnight, the third and later hours are claimed at Saturday rates on weekdays.&lt;/li&gt;
&lt;li&gt;Nursing uses different times. In 2026-27, nursing weekday daytime is 6 am to 6 pm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to sanity-check the output without writing anything, our free &lt;a href="https://rostery.com.au/tools/ndis-shift-calculator" rel="noopener noreferrer"&gt;NDIS shift price calculator&lt;/a&gt; does the same job for a single shift: pick the support, day and times and it shows the band and the most you can claim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyva3i9aleqq757qvuicc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyva3i9aleqq757qvuicc.png" alt="Rostery's free NDIS shift price calculator showing a weekday 6 pm to 10 pm self-care shift landing on the Weekday Evening item, because the higher band applies to the whole shift" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Location changes the price, not the number
&lt;/h2&gt;

&lt;p&gt;The same number covers city and bush. What changes is which of the three limits applies, and that depends on where the support is delivered, not the participant's home address. MM 1 to 5 locations use the national limit, MM 6 the remote limit and MM 7 the very remote limit, which are generally 40% and 50% higher. Part 3 of the Pricing Schedule also reclassifies some towns surrounded by remote areas; Broken Hill and Kalgoorlie, for example, are treated as remote (MM 6). Store all three limits per item and choose at pricing time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five checks before the claim file
&lt;/h2&gt;

&lt;p&gt;Here's the order we'd run them in, line by line, before anything goes into the bulk CSV.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvkcepuptirvbztg327m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvkcepuptirvbztg327m2.png" alt="Five checks on every item number before the claim file: valid on the date (C16, V10), right band from actual start and finish times, right claim type (C29), registered for it (C15), and unit price within the limit (V31, C06)" width="799" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Valid on the date.&lt;/strong&gt; Look the number up in the catalogue version that was in force on the support date, using its start and end dates. A support from June claimed against a 2026-27 item, or a legacy item claimed after it ended, comes back as &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes/c16" rel="noopener noreferrer"&gt;C16, "The support is not available for the dates entered"&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right band.&lt;/strong&gt; Recalculate the time-of-day item from the actual start and finish times, not the rostered ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right claim type.&lt;/strong&gt; For suffix items, the suffix must match the work. For base items, the &lt;code&gt;ClaimType&lt;/code&gt; must be one the catalogue flags allow. Otherwise, C29.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registered for it.&lt;/strong&gt; The registration group in the number has to be one your organisation holds. If it isn't, the NDIA returns &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes/c15" rel="noopener noreferrer"&gt;C15, "Provider is not registered for this support item"&lt;/a&gt;. Watch supported independent living: the same SIL supports are listed under group 0115 and the new group 0138 at identical prices, so the number you claim has to match your registration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Within the limit.&lt;/strong&gt; The unit price must be at or below the limit for the location. The bulk guide lists &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes/v31" rel="noopener noreferrer"&gt;V31, "The unit price claimed is above the NDIS price limit"&lt;/a&gt;, and it also notes that where an amount above the catalogue price gets through, only the limit is paid and the line is marked &lt;code&gt;Capped = YES&lt;/code&gt; in the reconciliation file. Either way, you don't get the difference.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One more thing sits outside the item number but still stops claims: for participants on plans in the NDIA's newer system, you need to be one of their "my providers" for the support. Our &lt;a href="https://rostery.com.au/glossary/pace" rel="noopener noreferrer"&gt;PACE glossary entry&lt;/a&gt; explains what changed.&lt;/p&gt;

&lt;p&gt;If you'd like a step-by-step version of the upload itself, our earlier dev.to post sets out &lt;a href="https://dev.to/rostery/a-pre-upload-check-workflow-for-ndis-bulk-payment-requests-five-gates-16-columns-and-the-codes-19jp"&gt;a pre-upload check workflow for NDIS bulk payment requests&lt;/a&gt; with all 16 columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free tools for the lookup step
&lt;/h2&gt;

&lt;p&gt;You don't have to build the lookup to use it. Our free &lt;a href="https://rostery.com.au/tools/ndis-price-guide" rel="noopener noreferrer"&gt;NDIS Price Guide 2026-27&lt;/a&gt; searches all 976 current items, and each item has its own page with the national, remote and very remote amounts, the unit, and whether provider travel, short-notice cancellations and non-face-to-face delivery can be claimed. It runs in the browser and nothing you type is sent anywhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fowxctfazn22phvp77m4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fowxctfazn22phvp77m4z.png" alt="Rostery's free NDIS Price Guide 2026-27 tool, showing self-care weekday daytime at $73.58 an hour, Saturday at $103.54, sleepover at $311.79 and support coordination at $100.14, with a note that 611 printed prices were checked against the Pricing Schedule" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have a file, the &lt;a href="https://rostery.com.au/tools/ndis-claim-file-checker" rel="noopener noreferrer"&gt;NDIS claim file checker&lt;/a&gt; checks a bulk payment CSV against the 16-column format and every item and price against the 2026-27 catalogue, also in the browser, so the file never leaves your device.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we handle it in Rostery
&lt;/h2&gt;

&lt;p&gt;For anyone wondering how this works in a full system: in Rostery, our team loads each new Support Catalogue, compares it with the last one and publishes it with its effective date, and prices are looked up by the date of the support. The right band item is chosen for every shift when it's rostered and invoiced. The claim file is built in the NDIA's 16-column format, and if any line fails its checks the whole file is refused with a list of what to fix. Rostery doesn't connect to the NDIA portal, so your team still uploads the file.&lt;/p&gt;

&lt;p&gt;Whatever you use, the pattern is the same: parse, look up by date, derive the band from real times, check the claim type and registration, then check the price.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: NDIS Pricing Schedule 2026-27 (effective 24 September 2026), Parts 1 to 4; NDIS (Pricing Arrangements) Determination 2026; NDIS Support Catalogue 2026-27 v1.1; NDIS Pricing Arrangements and Price Limits 2025-26 v1.1; NDIA, Bulk payment requests guide (December 2025). Rostery feature and tool pages read 3 November 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written by the Rostery team in Sydney. Rostery makes rostering, care and billing software for NDIS and aged care providers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>python</category>
      <category>australia</category>
      <category>healthcare</category>
    </item>
    <item>
      <title>Designing a Medication Administration Record for NDIS Support: Fields, Dose Outcomes and the Checks That Matter (2026)</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Mon, 02 Nov 2026 03:22:45 +0000</pubDate>
      <link>https://dev.to/rostery/designing-a-medication-administration-record-for-ndis-support-fields-dose-outcomes-and-the-checks-3mbh</link>
      <guid>https://dev.to/rostery/designing-a-medication-administration-record-for-ndis-support-fields-dose-outcomes-and-the-checks-3mbh</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally based on our article &lt;a href="https://rostery.com.au/blog/emar-vs-paper-mar-charts-ndis" rel="noopener noreferrer"&gt;eMAR vs paper MAR charts: why NDIS providers are switching&lt;/a&gt; on rostery.com.au. This version is rewritten for the people who build, configure or look after the system that holds the record.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A medication administration record looks like one of the simplest things in disability support software. It's a list of medicines, a grid of times and a place to sign. In practice it's one of the few records where a missing value can mean a person went without their epilepsy medication, or got a second dose of something they'd already had.&lt;/p&gt;

&lt;p&gt;If you're the operations lead, systems person or developer who has to set one up for an NDIS provider, the hard part isn't the screen. It's deciding what the record has to hold, which values are allowed, what gets checked before a record can be saved, and what someone actually reads afterwards. This post walks through those decisions in order, using the rules that apply to registered NDIS providers in 2026 and the way we've built it in Rostery.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not clinical or legal advice. State and territory medicines laws, each participant's prescriber instructions and the provider's own medication policy always come first.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from what the record has to prove
&lt;/h2&gt;

&lt;p&gt;Before any fields, it helps to know what an auditor will test. For providers registered for supports that include medication, the relevant standard is Management of Medication in the Core Module of the NDIS Practice Standards. Its outcome is written from the participant's side: "Each participant requiring medication is confident their provider administers, stores and monitors the effects of their medication and works to prevent errors or incidents."&lt;/p&gt;

&lt;p&gt;The three quality indicators turn that into things you can check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;records clearly identify the medication and dosage each participant needs, including everything required to give it safely&lt;/li&gt;
&lt;li&gt;workers understand the effects and side effects of the medication they give and know what to do if something goes wrong&lt;/li&gt;
&lt;li&gt;medication is stored safely and securely, is easy to tell apart, and only workers who've been trained can get to it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two of those are about people and cupboards, not software. The first is entirely about data. Read it again as a developer and it becomes a requirement: for any participant, at any time, you must be able to show what they take, how much, how, and what the worker needed to know to give it.&lt;/p&gt;

&lt;p&gt;The Core Module is assessed at a certification audit. The Verification Module, used for lower-risk supports, has no medication standard. That matters when you're deciding how much rigour a small provider needs: if they administer medication as part of registered supports, they're in certification territory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer one: the medication itself
&lt;/h2&gt;

&lt;p&gt;The first table describes each medicine for each participant. It's entered once and changed only when the prescription changes. In Rostery the office records the medication's name, dose, frequency, route, form, prescriber, pharmacy, start and end dates, instructions, whether it's PRN (as needed), and its schedule: S2, S3, S4, S8 or unscheduled.&lt;/p&gt;

&lt;p&gt;The schedule field earns its place. S8 medicines (controlled drugs such as many opioids) carry the strictest handling rules under state and territory law, and they drive two behaviours further down: a witness on every dose and a running balance. If the schedule isn't captured cleanly, neither of those rules can be enforced.&lt;/p&gt;

&lt;p&gt;Two design notes from experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treat a dose change as a new version, not an edit.&lt;/strong&gt; When a prescriber halves a dose, the old row should end and a new one start. Otherwise last month's doses appear to have been given at this month's strength.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the pharmacy chart as the source of truth.&lt;/strong&gt; The record in your system is a copy. Every new participant, and every change, should be checked against the current pharmacy chart or prescription before it goes live. Rostery's eMAR can use AI to read the medication list from a PDF chart, which saves retyping, but a person still checks the result against the paper.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frqjrg1d6vkmjkmtyn9ek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frqjrg1d6vkmjkmtyn9ek.png" alt="Three layers of an NDIS medication record: the medication entered once, each dose recorded against it with an outcome and signature, and the list, chart and reports the team reads" width="799" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer two: each dose as an event
&lt;/h2&gt;

&lt;p&gt;Every administration, or decision not to administer, is an event against a medication row. The most useful design decision here is to make the outcome a closed set rather than free text. Rostery uses five: given, refused, not available, held, and PRN not required.&lt;/p&gt;

&lt;p&gt;Each has a different follow-up. A refusal might need a call to the prescriber. "Not available" usually means a pharmacy or stock problem. "Held" means someone decided not to give it, so you want to know who and why. "PRN not required" is a positive record that the as-needed medicine was considered and wasn't needed, which is very different from a blank.&lt;/p&gt;

&lt;p&gt;Alongside the outcome, each dose record holds the dose actually given, the time, notes and, for PRN, a review of whether it worked. Every record needs the worker's typed signature. For S8 doses a witness is also required, and each one reduces a running balance, with the balance after every dose kept.&lt;/p&gt;

&lt;p&gt;Here's a small sketch of the validation rules in Python. It's an illustration of the logic, not Rostery's code or a compliance tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="n"&gt;OUTCOMES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;given&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not_available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;held&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prn_not_required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DoseEvent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;medication_schedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;      &lt;span class="c1"&gt;# "S2", "S3", "S4", "S8" or "unscheduled"
&lt;/span&gt;    &lt;span class="n"&gt;is_prn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;worker_signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;witness_signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;prn_effect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DoseEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outcome&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;OUTCOMES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outcome must be one of the fixed options&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worker_signature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;every record needs the worker&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s signature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outcome&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not_available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;held&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;say why the dose wasn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t given&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outcome&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prn_not_required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_prn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="s"&gt;PRN not required&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; only applies to PRN medication&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;medication_schedule&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;S8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outcome&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;given&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;witness_signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;S8 doses need a witness&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run checks like these before a record can be saved, not in a report afterwards. A missing reason is easy to add at 8:05 am and close to impossible to reconstruct a fortnight later.&lt;/p&gt;

&lt;p&gt;One more principle: never let a dose record be quietly overwritten. If a worker taps the wrong outcome, the fix should be a correcting entry that shows the original, who changed it and when. That's what turns the record into evidence rather than a tidy story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer three: what the team actually reads
&lt;/h2&gt;

&lt;p&gt;Raw events don't protect anyone unless someone looks at them. The question is what to show and where.&lt;/p&gt;

&lt;p&gt;A common assumption is that an eMAR should fire missed-dose alerts at someone's phone. It's worth being honest about what Rostery does here, because people ask. It doesn't send missed-dose alerts, and it doesn't do barcode scanning. Instead, the medication chart in the app marks overdue doses for the worker on shift, and the office medication list shows each medicine's last outcome with seven-day counts. The Medication Usage and Medication Adherence reports show the pattern over time.&lt;/p&gt;

&lt;p&gt;That's a design choice with a trade-off. Alerts are good at grabbing attention and bad at being ignored gracefully: a house with eight participants and a busy morning can produce enough noise that people stop reading them. Visible counts and a regular review put the job on a named person instead. Whichever approach your system takes, decide who looks, how often, and what they do next. Write that into the medication policy so it doesn't depend on one conscientious team leader.&lt;/p&gt;

&lt;h2&gt;
  
  
  PRN, behaviour and chemical restraint
&lt;/h2&gt;

&lt;p&gt;PRN records need more care than scheduled doses, and the reason is regulatory as much as clinical.&lt;/p&gt;

&lt;p&gt;Under the NDIS restrictive practices rules, chemical restraint is the use of a medication or chemical substance for the primary purpose of influencing a person's behaviour. It doesn't include medication a doctor prescribed to treat a diagnosed mental disorder, a physical illness or a physical condition. A PRN sedative given because someone is distressed and hitting out can fall on the restrictive side of that line.&lt;/p&gt;

&lt;p&gt;So the PRN record should capture the reason it was given and its effect, and the reason list should make it obvious when the purpose is behavioural. Where a PRN is part of a behaviour support plan, the record should be checkable against that plan. If chemical restraint is used without authorisation or outside the plan, it's a reportable incident: within 5 business days, or 24 hours if the person was harmed. Our glossary has a short explainer on &lt;a href="https://rostery.com.au/glossary/restrictive-practice" rel="noopener noreferrer"&gt;what counts as a restrictive practice&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a dose record becomes incident evidence
&lt;/h2&gt;

&lt;p&gt;A medication error isn't automatically a reportable incident to the NDIS Commission. It becomes one when it fits a reportable category, such as a death, a serious injury, or neglect, and those must be notified within 24 hours. Since 12 October 2026 new incidents go through the Commission's new portal.&lt;/p&gt;

&lt;p&gt;Either way, the provider's incident management system should hold the error, and the dose record is the first thing anyone will ask for: what was charted, what was given, by whom, at what time. Design for that link. In Rostery, workers report incidents from the same app they chart medication in, and the office records in the incident register whether an incident is NDIS reportable and whether it has been reported. Rostery doesn't notify the Commission for you; that still happens in the Commission's portal. The &lt;a href="https://rostery.com.au/features/incident-reporting" rel="noopener noreferrer"&gt;incident reporting page&lt;/a&gt; sets out how the register works.&lt;/p&gt;

&lt;h2&gt;
  
  
  People data sits next to medication data
&lt;/h2&gt;

&lt;p&gt;The second quality indicator is about worker knowledge, and that's a data problem too, just in a different table. For high intensity supports such as subcutaneous injections or enteral feeding, the Commission's high intensity support skills descriptors (version 3, November 2022) set out what workers need to know. They recommend reviewing competency each year and reassessing a worker who has been away from that support for more than three months. Those are recommendations rather than hard rules, but they're the benchmark auditors reach for.&lt;/p&gt;

&lt;p&gt;At minimum, keep training and competency records per worker and per support, with dates, and make it easy to see who in a house is current before the roster is finalised.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating off paper without losing a dose
&lt;/h2&gt;

&lt;p&gt;The cutover is the riskiest week in the life of any medication record. A sequence that works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reconcile every participant's list with the pharmacy chart before you enter anything.&lt;/li&gt;
&lt;li&gt;Enter the full detail, including PRN instructions and the reasons workers may need for a dose not given.&lt;/li&gt;
&lt;li&gt;Have each worker record a given dose, a refusal and a PRN dose while someone watches, on their own phone.&lt;/li&gt;
&lt;li&gt;Run paper and electronic side by side for a short, fixed period, comparing them at each handover.&lt;/li&gt;
&lt;li&gt;Remove the paper charts from the house on the agreed date, so nobody signs one and not the other.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How it's set up in Rostery
&lt;/h2&gt;

&lt;p&gt;If you're weighing up software, here's the short version. The eMAR is part of Rostery on the Growth plan and above and is switched on in Settings. The medication chart in the &lt;a href="https://rostery.com.au/features/carer-mobile-app" rel="noopener noreferrer"&gt;Rostery carer app&lt;/a&gt; is on every plan. Workers record given or not given, the reason, the time and their initials on shift, and the office manages the full list and dose records on the web. The &lt;a href="https://rostery.com.au/features/emar" rel="noopener noreferrer"&gt;Medication Management (eMAR) page&lt;/a&gt; lists exactly what's included and what isn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qb507ejkepbwk1qm48h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qb507ejkepbwk1qm48h.png" alt="Rostery Medication Management (eMAR): each dose signed for with its outcome, S8 doses witnessed with a running balance, PRN recorded with the reason, and usage and adherence reports" width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
 For a broader set of figures, the &lt;a href="https://rostery.com.au/features/reports" rel="noopener noreferrer"&gt;Report Hub&lt;/a&gt; holds the rest of Rostery's ready-made reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  A weekly review routine
&lt;/h2&gt;

&lt;p&gt;Software only helps if someone reads it. This is the routine we suggest for a team leader or house coordinator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs96ggf5nouzaifuv1prz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs96ggf5nouzaifuv1prz.png" alt="A 20-minute weekly medication review: refusals and holds, PRN doses, S8 balances, gaps on the chart, and changes to scripts" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick the same day each week. Work through refusals and holds, then PRN use, then S8 counts, then any dose with no outcome at all, then new or ceased scripts. Write down what you followed up and with whom. Over a few months that note becomes the best evidence you have that the system is monitored, which is the word the Practice Standards outcome uses.&lt;/p&gt;

&lt;p&gt;For the policy side, including training and storage, our guide to &lt;a href="https://rostery.com.au/blog/medication-management-compliance-ndis" rel="noopener noreferrer"&gt;medication management compliance for NDIS providers&lt;/a&gt; goes further. If you'd prefer a shorter switch plan, we've also published &lt;a href="https://rostery.blogspot.com/2026/10/moving-ndis-medication-charts-off-paper.html" rel="noopener noreferrer"&gt;a practical eMAR guide for small providers&lt;/a&gt; on our blog, and our dev.to post on &lt;a href="https://dev.to/rostery/ndis-certification-audit-evidence-a-checklist-for-each-practice-standard-area-3ne3"&gt;audit evidence for each Practice Standard area&lt;/a&gt; shows where medication records sit in the wider audit file.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: NDIS Quality and Safeguards Commission, NDIS Practice Standards and Quality Indicators (Core Module, Management of Medication; Verification Module); Reportable incidents and reportable incident timeframes; High intensity support skills descriptors, version 3 (November 2022); National Disability Insurance Scheme (Restrictive Practices and Behaviour Support) Rules 2018, s 6 (definition of chemical restraint). Rostery feature pages read 2 November 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written by the Rostery team in Sydney. Rostery makes rostering, care and billing software for NDIS and aged care providers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>healthcare</category>
      <category>australia</category>
      <category>database</category>
    </item>
    <item>
      <title>After the Upload: A Results and Re-lodge Workflow for NDIS Bulk Claims (Claim References, Correction Files and Claim Age, 2026)</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Wed, 28 Oct 2026 03:15:14 +0000</pubDate>
      <link>https://dev.to/rostery/after-the-upload-a-results-and-re-lodge-workflow-for-ndis-bulk-claims-claim-references-1e23</link>
      <guid>https://dev.to/rostery/after-the-upload-a-results-and-re-lodge-workflow-for-ndis-bulk-claims-claim-references-1e23</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally based on our step-by-step guide &lt;a href="https://rostery.com.au/blog/ndis-bulk-upload-guide" rel="noopener noreferrer"&gt;NDIS Bulk Upload 2026: How to Make a Bulk Payment Request in 6 Steps&lt;/a&gt; on rostery.com.au. This version is rewritten for the people who look after a claim file once it has left the building.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most advice about NDIS bulk claiming stops at the Upload button. That's understandable, because the upload is where the visible errors happen. But for a finance or operations team, the harder work starts afterwards. A file of 300 rows turns into 300 separate payment requests, each with its own outcome, and the bank deposit that follows is one number. If nobody ties those back together, short payments and rejected rows simply vanish.&lt;/p&gt;

&lt;p&gt;This post is about that second half: reading the results, re-lodging failed rows without double claiming, and keeping an eye on how old each claim is. We wrote about the pre-upload side last week in &lt;a href="https://dev.to/rostery/a-pre-upload-check-workflow-for-ndis-bulk-payment-requests-five-gates-16-columns-and-the-codes-19jp"&gt;a five-gate check workflow on dev.to&lt;/a&gt;, so we won't repeat the column rules here.&lt;/p&gt;

&lt;p&gt;Everything about the portal comes from the NDIA's &lt;em&gt;Bulk payment requests: self-help guide for providers&lt;/em&gt; (December 2025) and its payment pages on ndis.gov.au, read on 28 October 2026. When we say "the guide", that's the document we mean.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not claiming, financial or legal advice. Check the current NDIA guidance before you change a process.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wdj8t1h53book8iy731.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wdj8t1h53book8iy731.png" alt="After you press Upload: the portal checks the file, you find it under Uploaded Bulk Payment File, read each row, download the results with the Capped column, then reconcile by claim reference" width="799" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The one idea that makes everything else work: one row, one request
&lt;/h2&gt;

&lt;p&gt;The guide is explicit that the number of lines under the header equals the number of payment requests created. So 100 data rows means 100 requests. Each one is checked, paid, capped or rejected on its own.&lt;/p&gt;

&lt;p&gt;That has a design consequence for whoever builds the file. Your system needs a stable key for every row, one that survives the trip to the NDIA and back. The only field in the template that does that job is &lt;strong&gt;ClaimReference&lt;/strong&gt;. It's optional in the template, but if you leave it empty you lose the thread between what you claimed and what came back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: design claim references you can match later
&lt;/h2&gt;

&lt;p&gt;The guide allows up to 50 characters in ClaimReference, using letters, numbers and a few separators. It also has a rejection code, P05, for when a single claim reference has been used on too many claims. Our &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes/p04" rel="noopener noreferrer"&gt;explainer for rejection code P04&lt;/a&gt; sits alongside P05 in the same family of payment codes, and both point at the same habit: give every row its own reference.&lt;/p&gt;

&lt;p&gt;A simple pattern that works well is invoice number plus line number. It's readable by a person, unique per row, and easy to split back apart when you reconcile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;claim_reference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice_no&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line_no&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Invoice number plus line number, letters and digits only, max 50 chars.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;invoice_no&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;line_no&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[^A-Za-z0-9]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reference too long: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_unique&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;refs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dupes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;refs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;dupes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dupes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We strip everything except letters and digits on purpose. The template accepts a few symbols, but references often end up in other systems too, such as your accounting package or a remittance spreadsheet, and plain alphanumerics travel more safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: generate a file name you have never used
&lt;/h2&gt;

&lt;p&gt;The portal remembers every file name it has seen. The guide says a corrected file can't share a name with any earlier upload, whether that earlier upload worked or failed. Names are also capped at 20 characters, counting the dot and the extension, and some characters are banned outright.&lt;/p&gt;

&lt;p&gt;So the file name is another thing worth generating rather than typing. A date plus a short run counter fits comfortably.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;

&lt;span class="n"&gt;BANNED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;?/:*&amp;lt;&amp;gt;|&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;next_file_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;run_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BP&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;run_date&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;R&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.CSV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# e.g. BP261028R01.CSV, 15 chars
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
            &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BANNED&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ran out of run numbers for today&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the &lt;code&gt;used&lt;/code&gt; set somewhere permanent, such as a small table in your database. A spreadsheet tab works too, as long as everyone who uploads writes to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: read the outcome of every row
&lt;/h2&gt;

&lt;p&gt;After a successful upload, the portal says the file has been submitted and is pending payment validation. The guide warns that processing may not be immediate, so this is a next-day job rather than a same-minute one.&lt;/p&gt;

&lt;p&gt;To see the outcomes, go to the Payment Request tile, then View Payment Request, set View By to Uploaded Bulk Payment File and select Get Files. Each row shows one of two statuses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SUCCESSFUL&lt;/strong&gt;: the payment request was created and moves on towards payment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ERROR&lt;/strong&gt;: it wasn't. Select its Payment Request Number to read the Reject Reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;Download Results&lt;/strong&gt; option on the same screen gives you the file back with an outcome against every row. That's the file your script should read. It also carries a &lt;strong&gt;Capped&lt;/strong&gt; column. Where a row asked for more than the maximum catalogue price, the NDIA pays up to the limit and marks Capped as YES. Nothing is rejected, so a capped row looks like a success unless you compare amounts.&lt;/p&gt;

&lt;p&gt;Here is a minimal reconciler. We haven't hard-coded the results file's column names, because you should read them from your own download. Set the four constants once and the rest follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="n"&gt;REF_COL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ClaimReference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# check these against your own results file
&lt;/span&gt;&lt;span class="n"&gt;STATUS_COL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;CAPPED_COL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Capped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;REASON_COL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RejectReason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;invoices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paid_in_full&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;capped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rejected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown_ref&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]}&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REF_COL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;invoices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown_ref&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;STATUS_COL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rejected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REASON_COL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAPPED_COL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YES&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;capped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paid_in_full&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;unknown_ref&lt;/code&gt; bucket is the one people forget. A row that comes back with a reference your system doesn't recognise usually means someone edited the file by hand after it was generated. That's worth knowing about early.&lt;/p&gt;

&lt;p&gt;If several things are wrong on one row, the NDIA may return a single catch-all code instead of a specific one. Our page on &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes/mb1" rel="noopener noreferrer"&gt;MB1, the multiple-fields rejection&lt;/a&gt;, explains it: more than one field needs checking, so look at the whole row rather than hunting for one typo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: build the correction file, and only the correction file
&lt;/h2&gt;

&lt;p&gt;This is the step where well-meaning people create duplicates. The guide is firm about three things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A payment request marked Rejected can't be fixed inside the portal. It stays that way permanently, and a fresh request is needed.&lt;/li&gt;
&lt;li&gt;Don't reload the whole original file. Rows that succeeded the first time would be claimed again, and they'll come back flagged as already existing.&lt;/li&gt;
&lt;li&gt;The new file holds the header row plus only the rows that failed, corrected. You may keep the same ClaimReference on a corrected row.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4cckzcv0x6flcggh2m4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4cckzcv0x6flcggh2m4k.png" alt="Re-lodging failed rows without creating duplicates: fix the cause, build a new file with the header and only failed rows, keep the claim reference if you like, use a new name; never reload the whole file or reuse a file name" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In code, that's a filter over the original rows using the rejected references from Step 3, plus a new file name from Step 2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_correction_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rejected_refs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; \
         &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# header always goes in
&lt;/span&gt;        &lt;span class="n"&gt;ref_i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ClaimReference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;kept&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ref_i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rejected_refs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# only the failed rows
&lt;/span&gt;                &lt;span class="n"&gt;kept&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kept&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One caution. The script copies the failed rows, it doesn't fix them. Someone still has to deal with the cause, and many causes live outside the file: not enough funds left in the budget, service dates outside the plan, or the provider not being recorded as one of the participant's my providers. Re-lodging a row without changing anything just earns the same code again. Run the corrected file through our free &lt;a href="https://rostery.com.au/tools/ndis-claim-file-checker" rel="noopener noreferrer"&gt;NDIS bulk claim file checker&lt;/a&gt; before it goes back up. It reads the CSV in your browser, so the file stays on your machine, and flags format problems before the portal does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: watch the age of every unpaid row
&lt;/h2&gt;

&lt;p&gt;Timing has become a real part of the workflow, and the rules are moving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjw0mn1yueab63wvq6ybp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjw0mn1yueab63wvq6ybp.png" alt="How old is too old for an NDIS claim: the NDIA asks for claims within 90 days, older claims may be held for review up to 28 days, the current limit is 2 years, and from December 2026 the NDIA says claims must be within 90 days" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what the NDIA says today, on its payment pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The outer limit is &lt;strong&gt;2 years&lt;/strong&gt; from the date the support was delivered.&lt;/li&gt;
&lt;li&gt;It asks for claims within &lt;strong&gt;90 days&lt;/strong&gt; of a support being delivered in full, and does extra checks on claims made later than that.&lt;/li&gt;
&lt;li&gt;A claim made more than 90 days after delivery &lt;strong&gt;may be held for review for up to 28 days&lt;/strong&gt;. If it was part of a bulk upload, only that claim waits; the others are paid on the usual terms.&lt;/li&gt;
&lt;li&gt;Its &lt;em&gt;Securing the NDIS for future generations&lt;/em&gt; page lists a change for &lt;strong&gt;December 2026&lt;/strong&gt;: a &lt;strong&gt;90-day deadline&lt;/strong&gt; for lodging a claim after the support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For plans still in the old system, there's also C09: a request can only be made until 90 days after the service booking end date.&lt;/p&gt;

&lt;p&gt;That makes a daily "claim age" check worth adding. Anything unclaimed or rejected that's creeping towards 90 days should go to the top of someone's list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age_flags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;warn_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# rows not yet paid: (ref, support_end_date)
&lt;/span&gt;        &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support_end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;over 90 days: expect extra checks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;warn_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claim or fix this week&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The thresholds are your choice, not the NDIA's. We'd suggest a warning well before day 90, because a rejected row still needs time to be fixed, re-lodged and paid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: close the loop when money lands
&lt;/h2&gt;

&lt;p&gt;Per the guide, a request sitting at Pending is settled by whichever payment run comes next, and there's at least one run every weekday. Anything created after the final Friday run rolls to the next business day, normally Monday. On turnaround, the NDIA's payment page puts it at 2 to 3 business days for a valid claim when you're a recorded my provider, stretching to around 10 business days when you aren't, or when the NDIA wants to check the claim.&lt;/p&gt;

&lt;p&gt;The NDIA also says it won't email you while a claim is open or pending. So the only way to know a row is late is to look. For bulk claims, View Payment Request has a search by submission date with a Pending Payment status filter, which is a good weekly query to run.&lt;/p&gt;

&lt;p&gt;When the deposit does arrive, match it line by line, not as a total. A &lt;a href="https://rostery.com.au/glossary/remittance-advice" rel="noopener noreferrer"&gt;remittance advice&lt;/a&gt; helps you see what a payment covers, but the results file is the line-level truth for NDIA-managed claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  A weekly rhythm that holds it together
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Upload day&lt;/td&gt;
&lt;td&gt;Generate references and a new file name, run the checker, upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next business day&lt;/td&gt;
&lt;td&gt;Download Results, triage into paid, capped, rejected and unknown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same day&lt;/td&gt;
&lt;td&gt;Fix causes for rejected rows, build and upload the correction file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;Search Pending Payment by submission date, chase anything overdue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;td&gt;Run the claim age check on everything not yet paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where Rostery fits
&lt;/h2&gt;

&lt;p&gt;We build Rostery, so here's what it does, in the words of its own pages. For plan managers, &lt;a href="https://rostery.com.au/features/pm-ndia-claim-files" rel="noopener noreferrer"&gt;Rostery's NDIA claim files feature&lt;/a&gt; writes the bulk file from approved, validated invoices and reads the results file back, recording paid, part-paid and rejected against individual invoice lines with the reason code, and lets corrected lines be re-claimed without disturbing the ones already paid. &lt;a href="https://rostery.com.au/features/pm-reconciliation" rel="noopener noreferrer"&gt;Payment reconciliation&lt;/a&gt; then matches the NDIA payment against the claim line by line and raises anything that doesn't match as an exception.&lt;/p&gt;

&lt;p&gt;If you'd rather build this yourself, the steps above are the core of it. The full portal walkthrough, including all 16 columns and the six steps, is in the &lt;a href="https://rostery.com.au/blog/ndis-bulk-upload-guide" rel="noopener noreferrer"&gt;original Rostery guide to the NDIS bulk upload&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rostery team&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only. Portal steps and timeframes checked on 28 October 2026 against ndis.gov.au and the NDIA bulk payment guide dated December 2025. The code samples are illustrations, not a complete claiming system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>A SIRS Triage Workflow for Aged Care Compliance Teams: Reportability, Priority and the Deadlines That Follow (2026)</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Tue, 27 Oct 2026 03:18:10 +0000</pubDate>
      <link>https://dev.to/rostery/a-sirs-triage-workflow-for-aged-care-compliance-teams-reportability-priority-and-the-deadlines-3j9h</link>
      <guid>https://dev.to/rostery/a-sirs-triage-workflow-for-aged-care-compliance-teams-reportability-priority-and-the-deadlines-3j9h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally based on our guide &lt;a href="https://rostery.com.au/blog/sirs-reporting-criteria-priority-1-priority-2" rel="noopener noreferrer"&gt;SIRS reporting criteria: Priority 1 and Priority 2 explained&lt;/a&gt; on rostery.com.au. This version is rewritten for the quality, compliance and admin staff who own the incident process day to day.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you sit in the compliance or quality seat at an aged care provider, the Serious Incident Response Scheme (SIRS) is less about knowing the rules and more about running them reliably. A worker rings at 8pm. A family member mentions something during a review. A note on a shift record reads oddly. Each of those can start a legal clock, and the clock does not care whether the office is open.&lt;/p&gt;

&lt;p&gt;This post lays out SIRS as a workflow you can write down, train people on and audit yourself against. The rules come from the Aged Care Act 2024 (section 16, the meaning of reportable incident), the Aged Care Rules 2025 (Part 2, Division 2 of Chapter 5, rules 165A-25 and 165A-30 in particular) and the Aged Care Quality and Safety Commission's provider pages. Where we say "the Commission", we mean the Aged Care Quality and Safety Commission.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not legal advice. The Act, the Rules and the Commission's guidance are the authority, and they change. Check them before you change your process.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow in one line
&lt;/h2&gt;

&lt;p&gt;Become aware, make people safe, decide reportability, decide priority, notify on time, follow up, and keep one record of all of it. Every step after "become aware" has a time limit hanging over it, which is why it pays to treat this as a pipeline rather than a judgement call made fresh each time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fceen97msv7l19dwyj3as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fceen97msv7l19dwyj3as.png" alt="Priority 1 or Priority 2: is it reportable, is it an always Priority 1 type, did it need treatment, are there grounds to tell police, otherwise Priority 2" width="799" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 1: capture the moment of awareness
&lt;/h2&gt;

&lt;p&gt;Both SIRS deadlines are counted from the point your organisation became aware. Not from when the incident happened, and not from when someone senior has read the report or finished looking into it.&lt;/p&gt;

&lt;p&gt;For a workflow, that means the very first field you capture is a timestamp: when did anyone in our organisation learn about this? Treat it as the anchor for everything that follows. A few practical points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Record awareness separately from occurrence.&lt;/strong&gt; An incident might have happened last Tuesday and been disclosed today. The incident date and the awareness time are two different fields, and only one of them starts the clock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't let triage wait for a manager.&lt;/strong&gt; If the frontline worker's report sits in an inbox overnight, the 24 hours has already been running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the after-hours path explicit.&lt;/strong&gt; Someone has to be on call with access to the notification system, or with a clear way to reach the person who does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Commission also expects providers to assign roles for reporting and to train those staff. The Department's guide to the SIRS functions in the My Aged Care Service and Support Portal describes three SIRS roles: administrator, team leader and staff member, each of which can submit notices. Check who in your organisation actually holds those roles, and whether any of them work evenings or weekends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2: the reportability test
&lt;/h2&gt;

&lt;p&gt;Section 16 of the Act defines a reportable incident as one of eight kinds of incident that has occurred, is alleged to have occurred, or is suspected of having occurred, in connection with the delivery of funded aged care services to a person by a registered provider. The eight kinds are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;unreasonable use of force against the person&lt;/li&gt;
&lt;li&gt;unlawful sexual contact, or inappropriate sexual conduct, inflicted on the person&lt;/li&gt;
&lt;li&gt;psychological or emotional abuse of the person&lt;/li&gt;
&lt;li&gt;unexpected death of the person&lt;/li&gt;
&lt;li&gt;stealing from, or financial coercion of, the person by an aged care worker of the provider&lt;/li&gt;
&lt;li&gt;neglect of the person&lt;/li&gt;
&lt;li&gt;use of a restrictive practice in relation to the person, other than in line with the requirements in the rules&lt;/li&gt;
&lt;li&gt;unexplained absence of the person in the course of the delivery of funded aged care services&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two conditions, then: it fits one of those types, and it occurred or is alleged or suspected to have occurred. For a workflow, write the test as two yes/no fields rather than one. That forces whoever triages to consider the "alleged or suspected" path explicitly, which is where most under-reporting starts.&lt;/p&gt;

&lt;p&gt;The Commission is clear that you must notify alleged and suspected incidents, and incidents involving people with cognitive or mental impairment such as dementia. You don't need permission from the people involved to tell the Commission. Build those three statements into your triage guidance word for word, because they are the ones staff most often get wrong under pressure.&lt;/p&gt;

&lt;p&gt;If an incident fails the test, it still goes into your incident management system. More on that in Stage 6.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3: the priority decision
&lt;/h2&gt;

&lt;p&gt;Rule 165A-25 of the Aged Care Rules 2025 sets out what a Priority 1 reportable incident is. It's a reportable incident:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that has caused a person physical or psychological injury or discomfort that requires medical or psychological treatment, or&lt;/li&gt;
&lt;li&gt;where there are reasonable grounds to report the incident to police, or&lt;/li&gt;
&lt;li&gt;of the unlawful sexual contact or inappropriate sexual conduct kind, or&lt;/li&gt;
&lt;li&gt;of the unexpected death or unexplained absence kind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else that is reportable is Priority 2 (rule 165A-30).&lt;/p&gt;

&lt;p&gt;So three of the eight types are Priority 1 every time: sexual contact or conduct, unexpected death and unexplained absence. For the other five, two questions decide it: did it cause injury or discomfort that needs medical or psychological treatment, and are there reasonable grounds to go to police? A yes to either makes it Priority 1.&lt;/p&gt;

&lt;p&gt;There is one more rule worth putting in your guidance. Where someone's impairment directly affects whether they can recognise or communicate that they've been hurt, rule 165A-25(3) says the provider must not treat that impairment as preventing or lessening the harm, and must consider that each person's experience is unique. In plain terms: "they didn't seem upset" is not a reason to downgrade.&lt;/p&gt;

&lt;p&gt;If your team is unsure, the Commission publishes a SIRS decision support tool that walks through whether an incident is reportable and which priority applies. In a workflow, we'd record that it was used and what it suggested, alongside the human decision and the reason for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 4: calculate the deadlines
&lt;/h2&gt;

&lt;p&gt;Once priority is set, the dates follow mechanically, which makes this the easiest stage to automate. A minimal sketch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sirs_deadlines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aware_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Illustration only. Check the Aged Care Rules 2025 for the exact
    wording of each period before relying on it.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority_1_notice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aware_at&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;police_if_grounds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aware_at&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="c1"&gt;# rule 165A-25(6): further notice within 5 days after the
&lt;/span&gt;            &lt;span class="c1"&gt;# start of the 24 hours, unless the Commissioner sets another period
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;additional_information&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aware_at&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority_2_notice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aware_at&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That snippet is deliberately small. It shows the shape of the logic, not a compliance tool. The point is that the deadline should be calculated from the awareness timestamp and shown to people, not worked out in someone's head.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F393yeo3aiyevtb903y93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F393yeo3aiyevtb903y93.png" alt="Every SIRS deadline runs from awareness: Priority 1 in 24 hours, a further notice within 5 days, Priority 2 in 30 days, then new information and a final report if asked" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On police: the Commission says that where there are reasonable grounds, providers must report to police, and that these incidents must also be reported to police within 24 hours of becoming aware. That applies whether the incident is alleged or suspected, and if there's doubt about whether it's criminal, the Commission's advice is to report it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 5: assemble the notice
&lt;/h2&gt;

&lt;p&gt;Notifications are lodged in the My Aged Care Service and Support Portal, through the SIRS Notice tile. Rule 165A-25(4) lists what a Priority 1 notice must include. It's useful to turn that list into the structure of your internal incident form, so the information is already in one place when someone sits down to notify.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwbesi8t65lvdx4hts5qn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwbesi8t65lvdx4hts5qn.png" alt="What goes in a Priority 1 notice: provider details, the incident and harm, immediate actions, next steps, who is notifying, when and where, the people involved and their level of cognition" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two things make this stage less stressful than it looks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You don't need everything to notify.&lt;/strong&gt; The Rules say you're not required to include information that isn't available within the 24 hours. Missing names or details go in the further notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The further notice has its own date.&lt;/strong&gt; For Priority 1, a second notice with the outstanding information is due within 5 days after the start of the 24 hours, or another period the Commissioner sets. Put it on the same record as a second deadline, not as a reminder in someone's calendar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Rules also cover notifying significant new information (rule 165A-40) and giving a final report where one is required (rule 165A-45). Treat both as open tasks on the incident until they are closed off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 6: the incident management system around it
&lt;/h2&gt;

&lt;p&gt;SIRS is one part of a wider duty. The Commission expects providers to use their incident management system for all incidents, reportable or not: to assess each one, respond so people are safe, involve the right people, practise open disclosure, and use the data from past incidents to judge how well risk is being managed.&lt;/p&gt;

&lt;p&gt;From an admin point of view, the test of your system is simple. Pick any incident from six months ago and see whether one record tells the whole story: what happened, when you became aware, the priority decision and why, when and how you notified, what follow-up happened, and what you changed. If that story is split across an email thread, a spreadsheet and a portal receipt, it will be hard to show at audit, and harder still to learn from.&lt;/p&gt;

&lt;p&gt;Our dev.to post on &lt;a href="https://dev.to/rostery/ndis-certification-audit-evidence-a-checklist-for-each-practice-standard-area-3ne3"&gt;building an NDIS audit evidence checklist for each Practice Standard area&lt;/a&gt; uses the same "one record per obligation" thinking for NDIS audits, and much of it carries across.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 7: if you also deliver NDIS supports
&lt;/h2&gt;

&lt;p&gt;Plenty of providers run aged care and NDIS services side by side. SIRS and NDIS reportable incidents are separate schemes with separate rules, regulators and portals, and one doesn't satisfy the other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffp6gqqjhc3fnn3749xqe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffp6gqqjhc3fnn3749xqe.png" alt="SIRS and NDIS reportable incidents compared: who reports, incident types, timeframes and where to notify" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The NDIS Quality and Safeguards Commission's &lt;a href="https://rostery.com.au/glossary/reportable-incident" rel="noopener noreferrer"&gt;reportable incident&lt;/a&gt; categories cover death, serious injury, abuse or neglect, unlawful sexual or physical contact or assault, sexual misconduct including grooming, and unauthorised use of a restrictive practice. Most must be notified within 24 hours, followed by a 5-day report. Unauthorised restrictive practices are due within 5 business days, or 24 hours if the person was harmed. From 12 October 2026 the NDIS Commission asks providers to lodge new incidents in its new portal. Our guide to &lt;a href="https://rostery.com.au/blog/restrictive-practices-ndis-guide" rel="noopener noreferrer"&gt;restrictive practices for NDIS providers&lt;/a&gt; covers that side in more detail.&lt;/p&gt;

&lt;p&gt;For a mixed provider, the workflow should ask "which scheme?" before "which priority?". An incident involving someone receiving funded aged care follows SIRS. An incident in connection with NDIS supports follows the NDIS rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  A weekly routine for the compliance seat
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monday:&lt;/strong&gt; list every open incident with a pending deadline: Priority 1 further notices due, Priority 2 notices due, final reports requested.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midweek:&lt;/strong&gt; spot-check three incidents marked not reportable. Was "alleged or suspected" considered? Was cognitive impairment taken into account?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friday:&lt;/strong&gt; confirm who is on call over the weekend and that they can get into the portal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly:&lt;/strong&gt; review incident data for patterns by type, site and time of day, and record what you changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Rostery fits
&lt;/h2&gt;

&lt;p&gt;We built &lt;a href="https://rostery.com.au/features/sirs-reporting" rel="noopener noreferrer"&gt;SIRS incident reporting in Rostery&lt;/a&gt; for this workflow. Each incident is recorded with its SIRS category, priority and whether it is reportable, along with the description, the immediate actions taken and who reported it. Rostery calculates the notification deadline from the priority and the incident date, tracks whether notification has happened, and shows open incidents and overdue notifications on the dashboard. Follow-up and investigation stay on the same record through to resolution.&lt;/p&gt;

&lt;p&gt;Rostery doesn't lodge the notice for you. That's still done through the Commission's channels, and Rostery holds the record of what was notified and when. It also isn't the Commission's decision support tool. For NDIS incidents, &lt;a href="https://rostery.com.au/features/incident-reporting" rel="noopener noreferrer"&gt;NDIS incident reporting in Rostery&lt;/a&gt; handles reportability and the 24-hour deadline separately, so the two schemes don't get forced into one shape. If you want a quick refresher on the terms, our glossary entry on &lt;a href="https://rostery.com.au/glossary/sirs" rel="noopener noreferrer"&gt;what SIRS is&lt;/a&gt; is a good starting point.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only. Sources: Aged Care Rules 2025, rules 165A-25 to 165A-45, and section 16 of the Aged Care Act 2024; Aged Care Quality and Safety Commission, About reportable incidents, Reporting incidents and SIRS in residential and home services; Department of Health, Disability and Ageing, Service and Support Portal user guide for SIRS; NDIS Quality and Safeguards Commission, Reportable incidents. Read 27 October 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rostery team&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>compliance</category>
      <category>agedcare</category>
    </item>
    <item>
      <title>A Pre-Upload Check Workflow for NDIS Bulk Payment Requests: Five Gates, 16 Columns and the Codes Behind Rejected Lines (2026)</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Mon, 26 Oct 2026 03:38:34 +0000</pubDate>
      <link>https://dev.to/rostery/a-pre-upload-check-workflow-for-ndis-bulk-payment-requests-five-gates-16-columns-and-the-codes-19jp</link>
      <guid>https://dev.to/rostery/a-pre-upload-check-workflow-for-ndis-bulk-payment-requests-five-gates-16-columns-and-the-codes-19jp</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally based on our guide &lt;a href="https://rostery.com.au/blog/ndis-bulk-payment-request-without-rejections" rel="noopener noreferrer"&gt;How to submit an NDIS bulk payment request without rejections&lt;/a&gt; on rostery.com.au. This version is rewritten for the people who build and run the claim file each week.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you work in finance or operations at an NDIS provider, the bulk payment request is probably the most important CSV in your week. It is how a registered provider claims from the NDIA for many supports in one go, through the myplace provider portal. It is also unforgiving: one stray character can stop the whole file, and a clean file can still come back with lines that were never paid.&lt;/p&gt;

&lt;p&gt;This post sets out a pre-upload workflow we'd suggest for admin teams: five gates a file passes through between the invoice run and the payment landing. Everything about the file format comes from the NDIA's &lt;em&gt;Bulk payment requests: self-help guide for providers&lt;/em&gt; (December 2025). Where we say "the guide", that's the one we mean.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not claiming or legal advice. Check the current NDIA guidance before you change your process.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffc3yx2w796cou0v5pqwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffc3yx2w796cou0v5pqwx.png" alt="Five checks between the invoice run and the upload: template, fields, file, plan and price, and after upload" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a gate model works for this file
&lt;/h2&gt;

&lt;p&gt;A bulk payment request can fail in two places, and they behave very differently.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;At upload.&lt;/strong&gt; The portal reads the file and refuses it if the header, file name, size or any field is wrong. Nothing is lodged. You get a message and, for row problems, an error file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After upload.&lt;/strong&gt; Each row becomes its own payment request and is checked against the participant's plan, funding, provider records and the price limits. Some lines are paid, some are rejected with a code, and some are paid less than claimed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first three gates below deal with the first kind of failure. They are mechanical, so they suit a script or a checklist. The last two gates deal with the second kind, which needs information about the participant's plan that a script may not have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 1: start from a fresh template
&lt;/h2&gt;

&lt;p&gt;Download the bulk upload template from the portal rather than copying last month's file. The guide says not to delete any columns, and a file with a missing or changed header row is refused outright. Save it as a comma-delimited CSV.&lt;/p&gt;

&lt;p&gt;The template has 16 columns. Here is what goes in each, in plain terms:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7oia982bho9mzf71sp7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7oia982bho9mzf71sp7c.png" alt="The 16 columns of an NDIS bulk payment request: what goes in each and the format the NDIA asks for" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few notes the table can't hold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RegistrationNumber&lt;/strong&gt; is your Organisation ID from your portal profile. It starts with 405. &lt;strong&gt;NDISNumber&lt;/strong&gt; starts with 43. Both are numbers only, nine digits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ClaimReference&lt;/strong&gt; is optional, but fill it. It's how you'll match a payment back to an invoice later. Keep it to 50 characters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AuthorisedBy&lt;/strong&gt;, &lt;strong&gt;ParticipantApproved&lt;/strong&gt; and &lt;strong&gt;InKindFundingProgram&lt;/strong&gt; are legacy fields. Leave them blank.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ABN of Support Provider&lt;/strong&gt; is for plan-managed claims. It takes the provider's 11-digit ABN, or one of two exemption codes (REIMB or EXCLS). For a standard service booking you leave it blank.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gate 2: field rules a script can test
&lt;/h2&gt;

&lt;p&gt;Most refused files trace back to one field in one row. These rules are worth encoding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dates.&lt;/strong&gt; The guide's error messages ask for &lt;code&gt;YYYY-MM-DD&lt;/code&gt;. It also warns that Excel will reformat dates if you open and edit anything in the file, which is how a correct file goes wrong after a "quick look".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quantity or Hours, never both.&lt;/strong&gt; Fill one. If both are filled, the portal's message is "Both duration and quantity cannot co-exist". If neither is filled, that's an error too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hours&lt;/strong&gt; go in as &lt;code&gt;HHH:MM&lt;/code&gt; without leading zeros, so two and a half hours is &lt;code&gt;2:30&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UnitPrice&lt;/strong&gt; is dollars and cents with no dollar sign.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GSTCode&lt;/strong&gt; is &lt;code&gt;P1&lt;/code&gt;, &lt;code&gt;P2&lt;/code&gt; or &lt;code&gt;P5&lt;/code&gt;. Older habits such as typing "GST free" in words won't pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ClaimType&lt;/strong&gt; is blank for a direct service, or one of &lt;code&gt;CANC&lt;/code&gt;, &lt;code&gt;REPW&lt;/code&gt;, &lt;code&gt;TRAN&lt;/code&gt;, &lt;code&gt;NF2F&lt;/code&gt;, &lt;code&gt;THLT&lt;/code&gt; or &lt;code&gt;IRSS&lt;/code&gt;, in capitals. &lt;strong&gt;CancellationReason&lt;/strong&gt; (&lt;code&gt;NSDH&lt;/code&gt;, &lt;code&gt;NSDF&lt;/code&gt;, &lt;code&gt;NSDT&lt;/code&gt; or &lt;code&gt;NSDO&lt;/code&gt;) belongs only on &lt;code&gt;CANC&lt;/code&gt; rows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ABNs deserve their own check, because a typo produces an 11-digit number that looks fine. The Australian Business Register publishes the check digit method: subtract 1 from the first digit, multiply each digit by its weight, add them up, and the total must divide evenly by 89.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;WEIGHTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;abn_is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;abn&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WEIGHTS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;89&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;abn_is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;51 824 753 556&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# True, the ABR's own worked example
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A passing check digit only means the number is well formed. It doesn't tell you the ABN is active, so plan-managed teams still need their usual ABN Lookup step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 3: file rules that refuse the whole upload
&lt;/h2&gt;

&lt;p&gt;These are the rules that stop a file before any row is assessed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The file name, &lt;strong&gt;including the extension&lt;/strong&gt;, must be 20 characters or fewer. &lt;code&gt;BULKUPLOAD2.CSV&lt;/code&gt; is 15.&lt;/li&gt;
&lt;li&gt;No special characters in the name: &lt;code&gt;\ ? / : * &amp;lt; &amp;gt; |&lt;/code&gt; or &lt;code&gt;"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Up to 5,000 rows, and the file must be under 10 MB.&lt;/li&gt;
&lt;li&gt;Nothing in any cell beyond your data. The guide's example is claims ending on row 47 with a stray character in row 102, which stops the whole file loading.&lt;/li&gt;
&lt;li&gt;A name you have never used before. A corrected file cannot reuse the name of any earlier upload, whether that upload worked or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a compact preflight that runs gates 1 to 3 against a file and the fresh template you downloaded. It compares headers against the template rather than a hard-coded list, so it keeps working if the NDIA changes the template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;BAD_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[\\?/:*&amp;lt;&amp;gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;HOURS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^(0|[1-9]\d{0,2}):[0-5]\d$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;DATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^\d{4}-\d{2}-\d{2}$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;CLAIM_TYPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CANC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REPW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TRAN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NF2F&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;THLT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IRSS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;GST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;preflight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;template_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;used_names&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;problems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file name over 20 characters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;BAD_NAME&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;special character in file name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;used_names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file name already used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file is 10 MB or more&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;header differs from template&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;more than 5,000 rows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: blank row&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SupportsDeliveredFrom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SupportsDeliveredTo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not YYYY-MM-DD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hours&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: fill Quantity or Hours, not both or neither&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;HOURS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: Hours should look like 2:30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UnitPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: remove $ from UnitPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GSTCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;GST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: GSTCode must be P1, P2 or P5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ClaimType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CLAIM_TYPES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: unknown ClaimType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;problems&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat it as a starting point, not a complete validator. Column names are read from your own template, and you'll want to add the ABN check above and your own rules for item numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 4: what the NDIA checks after upload
&lt;/h2&gt;

&lt;p&gt;Once the file is in, each line is checked against things that live in the NDIA's systems. The guide lists dozens of rejection codes. Grouped by where the fix usually is, they look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr3o1nsbeuowy4ko3u2kp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr3o1nsbeuowy4ko3u2kp.png" alt="What a rejected line is telling you to check: plan dates, funds, who may claim, item and price, duplicates and the claim time limit" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can't see a participant's remaining funds from your own system, but you can catch a fair share of these before upload:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plan dates.&lt;/strong&gt; If you hold the plan start and end dates, flag any line whose service dates fall outside them or straddle two plans (C22, C28, V26, V36). Split those lines by plan period.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who may claim.&lt;/strong&gt; For plans in the NDIA's new system, NDIA-managed and plan-managed supports need you recorded as a &lt;em&gt;my provider&lt;/em&gt;. So do specialist disability accommodation, home and living and behaviour support claims. V11 is the code you'll see when you're not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Item and price.&lt;/strong&gt; Check that each item is valid on the service date (C16) and that the unit price is within the limit. The guide says the system only pays up to the maximum catalogue price, and marks the line &lt;code&gt;Capped = YES&lt;/code&gt; in the reconciliation file. Code V31 also exists for a unit price above the limit, and C06 applies where the price is above an old-system service booking. Either way, the overage isn't paid. Our free &lt;a href="https://rostery.com.au/tools/ndis-price-history" rel="noopener noreferrer"&gt;NDIS price limit history&lt;/a&gt; is handy when a line straddles a price change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates.&lt;/strong&gt; Same participant, item and dates as an earlier claim means V04 or P04. A claim reference used more than twice gives P05.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Age.&lt;/strong&gt; The NDIA rejects claims made more than two years after the support start date (C39). From December 2026, the NDIA says claims must be submitted within 90 days of delivering a support, so a "days since service" column in your check is worth adding now.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a line does come back rejected, our free &lt;a href="https://rostery.com.au/tools/ndia-claim-error-codes" rel="noopener noreferrer"&gt;NDIA claim rejection codes lookup&lt;/a&gt; explains each code in plain English, with what to change before you claim again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 5: after upload, close the loop
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fps7e83kcl0cajrca0t00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fps7e83kcl0cajrca0t00.png" alt="From upload to a reconciled payment: submitted, check each line, fix and re-lodge only failed lines, paid, reconcile" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read every line's result.&lt;/strong&gt; Each row is its own payment request, so record each outcome against its invoice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-lodge only what failed.&lt;/strong&gt; The guide is specific: save a new file with a new name, containing only the corrected records plus the header. Never reload the whole file, or you'll create duplicates of lines already paid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember that Rejected is final for that request.&lt;/strong&gt; A rejected payment request stays rejected. The fix is a new payment request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know the payment rhythm.&lt;/strong&gt; Pending requests are paid after the next payment run, which happens at least once a day, Monday to Friday. Anything created after Friday's last run is picked up on the next business day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reconcile line by line.&lt;/strong&gt; Compare the paid amount with the claimed amount, and look at &lt;code&gt;Capped&lt;/code&gt; for lines paid short.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making it a weekly routine
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Who usually owns it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;After invoices are approved&lt;/td&gt;
&lt;td&gt;1 to 3, run the preflight&lt;/td&gt;
&lt;td&gt;Billing admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Before upload&lt;/td&gt;
&lt;td&gt;4, plan dates, my provider, prices, duplicates, age&lt;/td&gt;
&lt;td&gt;Billing admin, with the team lead for odd cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same or next business day&lt;/td&gt;
&lt;td&gt;5, read results, re-lodge failed lines&lt;/td&gt;
&lt;td&gt;Billing admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After the payment run&lt;/td&gt;
&lt;td&gt;5, reconcile against invoices&lt;/td&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you'd rather not maintain a script, our free &lt;a href="https://rostery.com.au/tools/ndis-claim-file-checker" rel="noopener noreferrer"&gt;NDIS bulk claim file checker&lt;/a&gt; runs the structural checks in your browser, and the file never leaves it. It checks every row and column against the NDIS Support Catalogue 2026-27, including dates Excel has rewritten, the hours format, the ABN check digit and prices above the national, remote and very remote limits. A clean result means the file is the right shape. The NDIA still checks the plan, bookings and funds.&lt;/p&gt;

&lt;p&gt;For teams that would rather not build the file by hand at all, Rostery's &lt;a href="https://rostery.com.au/features/revenue-engine" rel="noopener noreferrer"&gt;end-to-end revenue engine&lt;/a&gt; takes a rostered shift through timesheet and invoice to the NDIS claim. If any of the terms here are new, our glossary entry on the &lt;a href="https://rostery.com.au/glossary/bulk-payment-request" rel="noopener noreferrer"&gt;NDIS bulk payment request&lt;/a&gt; is a short primer.&lt;/p&gt;

&lt;p&gt;Earlier on dev.to we wrote about the other end of this chain: &lt;a href="https://dev.to/rostery/build-an-ndis-service-agreement-that-holds-up-at-claim-time-a-2026-walkthrough-for-providers-4lbi"&gt;building an NDIS service agreement that holds up at claim time&lt;/a&gt;. Many of the lines that fail at gate 4 started there.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only. File rules and codes are from the NDIA's Bulk payment requests self-help guide (December 2025) and ndis.gov.au, read 26 October 2026. NDIA support for providers: 1300 311 675.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>csv</category>
      <category>automation</category>
    </item>
    <item>
      <title>Build an NDIS Service Agreement That Holds Up at Claim Time: A 2026 Walkthrough for Providers</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Sun, 25 Oct 2026 03:18:31 +0000</pubDate>
      <link>https://dev.to/rostery/build-an-ndis-service-agreement-that-holds-up-at-claim-time-a-2026-walkthrough-for-providers-4lbi</link>
      <guid>https://dev.to/rostery/build-an-ndis-service-agreement-that-holds-up-at-claim-time-a-2026-walkthrough-for-providers-4lbi</guid>
      <description>&lt;p&gt;&lt;em&gt;From the Rostery team in Sydney. Originally based on our guide &lt;a href="https://rostery.com.au/blog/ndis-service-agreement-what-to-include" rel="noopener noreferrer"&gt;NDIS Service Agreement: What to Include (2026)&lt;/a&gt;, rewritten as a build order for providers and checked against the NDIA's own pages, its October 2026 template and the current pricing documents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A service agreement is easy to treat as onboarding paperwork. It's worth treating as the document your claims lean on.&lt;/strong&gt; Travel, short notice cancellations, telehealth, non-face-to-face work and NDIA requested reports can only be claimed when the participant agreed to them first. If the agreement is silent, the money is often gone, however reasonable the charge was.&lt;/p&gt;

&lt;p&gt;2026 has also moved a few things under existing templates. Maximum prices now come from the Minister's pricing determination, through the NDIS Pricing Schedule 2026-27 (effective 24 September 2026). In October 2026 the NDIA and the NDIS Quality and Safeguards Commission released a new service agreement template. And from December 2026, claims must be submitted within 90 days of delivering a support.&lt;/p&gt;

&lt;p&gt;This post works through an agreement in the order we'd build one: first the charges that depend on it, then the schedule, prices and payment, then the terms that protect both sides, and finally signing and keeping it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not legal advice. Claiming rules below come from the NDIS Pricing Arrangements and Price Limits 2025-26 (version 1.1), which is still the latest claiming guidance on ndis.gov.au. The NDIA says it will shortly publish updated guidance, so check the current version before relying on any rule. Sources were read on 25 October 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: confirm whether an agreement is required
&lt;/h2&gt;

&lt;p&gt;The NDIA's position is short. You must have a service agreement for specialist disability accommodation (SDA). Agreements are encouraged for supported independent living (SIL). For other supports one isn't required, but the NDIA recommends making one when a participant starts with a new provider or their needs change.&lt;/p&gt;

&lt;p&gt;For registered providers audited against the core module, the NDIS Practice Standards include "Service Agreements with Participants" as an outcome: each participant has a clear understanding of the supports they've chosen and how they'll be provided. So in practice, most providers should treat an agreement as standard.&lt;/p&gt;

&lt;p&gt;Two things to keep in mind from the start. Neither the NDIA nor the NDIS Commission is a party to service agreements, keeps them or enforces them. And a provider can't use an agreement to contract out of its responsibilities under the NDIS Code of Conduct or the Australian Consumer Law.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: list the charges that need advance agreement
&lt;/h2&gt;

&lt;p&gt;Before writing anything else, work out which extra charges you'll actually claim for this participant. Each one has to be in the agreement before the support happens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88u4nwqqtq5i38nvdkhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88u4nwqqtq5i38nvdkhh.png" alt="Six charges to agree in advance: short notice cancellations, provider travel, non-face-to-face and telehealth, NDIA requested reports, irregular SIL supports and the establishment fee" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Charge&lt;/th&gt;
&lt;th&gt;What the agreement should say&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Short notice cancellations and no-shows&lt;/td&gt;
&lt;td&gt;Your notice period and what you charge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider travel&lt;/td&gt;
&lt;td&gt;Which travel costs can be claimed, and how a shared trip is split between participants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-face-to-face supports&lt;/td&gt;
&lt;td&gt;That this work can be claimed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telehealth&lt;/td&gt;
&lt;td&gt;That supports delivered by telehealth can be claimed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NDIA requested reports&lt;/td&gt;
&lt;td&gt;That a report can be claimed when the NDIA asks for one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Irregular SIL supports&lt;/td&gt;
&lt;td&gt;That irregular SIL supports can be claimed when required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Establishment fee&lt;/td&gt;
&lt;td&gt;An agreement to supply at least 20 hours a month for three or more consecutive months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few rules attach to these. Provider travel time is capped at up to 30 minutes each way in Modified Monash Model (MMM) areas 1 to 3 and up to 60 minutes in areas 4 and 5, and the price limit for therapy travel is half the therapy price limit. An establishment fee can be claimed only once per participant, across all their plans, and its 2026-27 national maximum is $735.80. If travel is a big part of your work, we wrote a separate walkthrough on &lt;a href="https://dev.to/rostery/ndis-provider-travel-in-2026-how-to-claim-travel-time-and-kilometres-without-leaving-money-behind-3me3"&gt;claiming NDIS provider travel time and kilometres&lt;/a&gt; that goes deeper on the caps and invoice lines.&lt;/p&gt;

&lt;p&gt;Only tick what you'll use. A clause for every possible charge makes the agreement harder to read and invites questions you don't need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: build the schedule of supports
&lt;/h2&gt;

&lt;p&gt;The schedule is the heart of the agreement and the part an invoice gets checked against later. The NDIA says it should include, for each support, the category, the item name or number, a description, the quantity or hours, the unit price, the total cost and any GST. It should also say how, where and how often the support happens, and list extra charges such as travel.&lt;/p&gt;

&lt;p&gt;The October 2026 template puts this in an attachment called the Schedule of Supports. It notes that for plan-managed and NDIA-managed participants, costs must not exceed the NDIS Pricing Schedule, and that extra costs must be discussed with the participant and agreed in writing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp9ryxt2osr7hglainnh7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp9ryxt2osr7hglainnh7.png" alt="Example schedule of supports using 2026-27 national price limits: self-care weekday daytime at $73.58 an hour, community access at $73.58 an hour, provider travel within the caps, and an establishment fee of $735.80" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using real item numbers matters. When the schedule says &lt;code&gt;01_011_0107_1_1&lt;/code&gt; at an agreed rate and the invoice says the same, nobody has to interpret anything. When the schedule says "personal care, as needed", every disputed line turns into a conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: set prices within the limits
&lt;/h2&gt;

&lt;p&gt;Each provider agrees a price for each support with each participant, up to the price limit. Under the 2026-27 arrangements, the maximum prices in the pricing schedules apply to NDIA-managed and plan-managed participants. The NDIA says it can't pay a claim above the maximum, and providers can't charge more than it. Self-managed participants aren't covered by the maximums. Every maximum already includes any GST, and many NDIS supports are GST-free.&lt;/p&gt;

&lt;p&gt;The limit is a ceiling, not a recommended price. You can agree a lower one. When limits change during the year, existing agreements don't update themselves: the NDIA says providers must discuss proposed changes to existing service agreements with participants, and participants must agree to the changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: write down how you get paid
&lt;/h2&gt;

&lt;p&gt;The funding type decides who you invoice and whether the limits apply, so record it for each participant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flkq9dp3eylrvh8dnnefw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flkq9dp3eylrvh8dnnefw.png" alt="Payment terms for NDIA-managed, plan-managed and self-managed participants: who can deliver, how to claim, whether price limits apply and what to watch for" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NDIA-managed:&lt;/strong&gt; registered providers only, paid through a payment request to the NDIA. Limits apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan-managed:&lt;/strong&gt; registered or unregistered providers invoice the plan manager. Limits apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-managed:&lt;/strong&gt; the participant pays you. The maximums don't apply.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For NDIA-managed and plan-managed funding, participants record the providers they work with regularly as "my providers". Recording is required for SDA, SIL, home and living supports, behaviour supports, and a plan manager, support coordinator or recovery coach. The NDIA automatically rejects claims for those supports from a provider who isn't recorded. Add a line to your intake process to confirm it.&lt;/p&gt;

&lt;p&gt;Timing belongs here too. From December 2026, claims must be submitted within 90 days of delivering a support. If your payment terms or invoicing rhythm assume months of slack, adjust them now. In Rostery, invoices are generated from completed shifts and agency-managed claims can go out as PRODA/PACE bulk-upload files, as described on our &lt;a href="https://rostery.com.au/features/ndis-billing-invoicing" rel="noopener noreferrer"&gt;NDIS billing and invoicing page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: get the cancellation clause right
&lt;/h2&gt;

&lt;p&gt;Under the 2025-26 rules, a provider can claim up to 100% of the agreed fee for a short notice cancellation or no-show, subject to the pricing rules and the service agreement. Short notice typically means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less than 7 days' notice, for disability support worker supports&lt;/li&gt;
&lt;li&gt;less than 2 clear business days' notice, for most other supports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The provider also has to have been unable to find other billable work for the worker, and (unless a sole trader or partnership) still has to pay the worker for the time. There's no hard limit on the number of short notice cancellations, but the NDIA monitors them. You can waive the fee or offer more generous terms. Our glossary entry on &lt;a href="https://rostery.com.au/glossary/short-notice-cancellation" rel="noopener noreferrer"&gt;short notice cancellation rules and notice periods&lt;/a&gt; has the definitions in one place.&lt;/p&gt;

&lt;p&gt;Here's the part many templates miss. The new NDIA template goes further than the pricing rules. It says the provider will only charge for a short notice cancellation or no-show when there has been an actual loss, and won't charge a fee where it would be unfair under the Australian Consumer Law. If you adopt the template, your cancellation practice has to match that wording.&lt;/p&gt;

&lt;p&gt;The clause should also cover what happens when you cancel, pause or replace a support yourself. If you'd like those rules applied the same way every time, our page on &lt;a href="https://rostery.com.au/features/cancellation-rules" rel="noopener noreferrer"&gt;configurable cancellation rules&lt;/a&gt; shows how Rostery applies the notice actually given against the rules you set, and records the reason on the shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: dates, changes and ending
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dates.&lt;/strong&gt; Include a start date, an end date and a review date. The end date shouldn't be later than the participant's plan reassessment date, and the template says the review should be no more than 12 months after the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changes.&lt;/strong&gt; Small changes can go on a variation added to the original agreement. For big changes, such as new supports, a new provider or a new plan, the NDIA recommends a new agreement. The template adds that if you propose a price change and the participant doesn't agree, they can end the agreement straight away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ending.&lt;/strong&gt; The notice period is whatever you agree; the template leaves a blank with 14 days as its example. It also includes an optional cooling-off period, with 7 days as the example, and states that the participant won't be charged an exit fee. That lines up with the pricing rules, which say participants are generally not required to pay exit fees, even when changing providers part way through a plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: rights, privacy, complaints and emergencies
&lt;/h2&gt;

&lt;p&gt;The NDIA's list of what a good agreement covers includes each side's rights and responsibilities and what to do when you disagree or something goes wrong. In practice that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provider responsibilities:&lt;/strong&gt; treat the participant with respect, communicate clearly and on time, work with them on supports that meet their needs, and explain complaints, changes, privacy, records, safety rules and conflicts of interest. The template adds arranging an interpreter if needed and keeping accurate records for at least seven years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Participant rights and responsibilities:&lt;/strong&gt; choice, asking questions, making complaints, getting support and privacy, along with paying invoices on time and telling you when their needs or plan change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cultural safety:&lt;/strong&gt; information that works for them, an interpreter if needed, the choice to involve family, carers or community, and respect for cultural practices that matter to them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy and consent:&lt;/strong&gt; what you collect and share, and how consent can be changed or withdrawn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complaints:&lt;/strong&gt; a clear process, plus the NDIS Commission's contact details (1800 035 544, TTY 133 677).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emergencies:&lt;/strong&gt; the Practice Standards indicator says agreements set out the arrangements for providing supports in an emergency or disaster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 9: leave out what you can't charge
&lt;/h2&gt;

&lt;p&gt;Some things don't belong in an NDIS agreement at all. Under the pricing rules, registered providers must not add credit card surcharges, gap fees, late payment fees or cancellation fees beyond what the rules permit. Developing and agreeing a service agreement is listed as an administrative activity covered by the price limits, so it isn't billable. And the template itself says extra costs must be reasonable, clear and not unfair under the Australian Consumer Law.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 10: sign it, give a copy, keep it
&lt;/h2&gt;

&lt;p&gt;The Practice Standards indicator is specific. Where the agreement is in writing, the participant receives a copy signed by both the participant and the provider. If that isn't practicable, or the participant chooses not to have an agreement, the provider records the circumstances. The participant, or a representative with authority, signs.&lt;/p&gt;

&lt;p&gt;For keeping it, the NDIA has announced a 7-year record-keeping period for providers and says more detail on which records are covered is coming. With the template also committing providers to keep records for at least seven years, 7 years is a sensible default for signed agreements.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pre-signing check
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gbv2ce6smtd1yt2db0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gbv2ce6smtd1yt2db0c.png" alt="Sixteen sections of an NDIS service agreement, from parties and schedule of supports to complaints, emergencies, SIL or SDA terms and signatures" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every charge you'll claim beyond the support itself is named, with its terms.&lt;/li&gt;
&lt;li&gt;Each support has an item number, quantity, unit price and total, within the limit where it applies.&lt;/li&gt;
&lt;li&gt;The funding type and "my provider" status are confirmed.&lt;/li&gt;
&lt;li&gt;Cancellation terms match both the pricing rules and the template wording you've adopted.&lt;/li&gt;
&lt;li&gt;Dates end no later than plan reassessment, with a review inside 12 months.&lt;/li&gt;
&lt;li&gt;Notice, cooling-off and no exit fee are stated.&lt;/li&gt;
&lt;li&gt;Complaints and emergency arrangements are included.&lt;/li&gt;
&lt;li&gt;It's signed, and the participant has a copy in their preferred format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd rather not start from a blank page, our free &lt;a href="https://rostery.com.au/tools/ndis-service-agreement-template" rel="noopener noreferrer"&gt;NDIS service agreement template in Word and PDF&lt;/a&gt; follows the NDIA's October 2026 structure and adds the claim clauses, an emergency clause and a sole trader version.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: ndis.gov.au, What is a service agreement and How to make a service agreement; NDIA and NDIS Commission service agreement template (October 2026); NDIS pricing arrangements page and NDIS Pricing Schedule 2026-27; NDIS Pricing Arrangements and Price Limits 2025-26 v1.1; NDIS Practice Standards (Quality Indicators Guidelines, Service Agreements with Participants); ndis.gov.au, What is a my provider and Securing the NDIS for future generations. All read 25 October 2026. Full guide: &lt;a href="https://rostery.com.au/blog/ndis-service-agreement-what-to-include" rel="noopener noreferrer"&gt;NDIS Service Agreement: What to Include (2026)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>smallbusiness</category>
      <category>disability</category>
    </item>
    <item>
      <title>NDIS Provider Travel in 2026: How to Claim Travel Time and Kilometres Without Leaving Money Behind</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Sat, 24 Oct 2026 03:25:28 +0000</pubDate>
      <link>https://dev.to/rostery/ndis-provider-travel-in-2026-how-to-claim-travel-time-and-kilometres-without-leaving-money-behind-3me3</link>
      <guid>https://dev.to/rostery/ndis-provider-travel-in-2026-how-to-claim-travel-time-and-kilometres-without-leaving-money-behind-3me3</guid>
      <description>&lt;p&gt;&lt;em&gt;From the Rostery team in Sydney. This walkthrough builds on our original guide, &lt;a href="https://rostery.com.au/blog/ndis-travel-kilometre-claiming-guide" rel="noopener noreferrer"&gt;NDIS Travel and Kilometre Claiming: What Providers Can Actually Bill&lt;/a&gt;, and checks each rule against the NDIA's own pricing documents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most NDIS providers know they can charge for travel. Far fewer get every claimable minute and kilometre onto an invoice.&lt;/strong&gt; The rules aren't especially long, but they're split across two kinds of cost, several conditions and a set of limits that change with how remote the participant is. Get one piece wrong and the claim either gets knocked back or, more often, never gets made at all.&lt;/p&gt;

&lt;p&gt;This post goes through it in the order you'd actually work: first the conditions that decide whether travel can be claimed at all, then the two parts of every travel claim, then the time limits, kilometres, shared trips and therapy travel, and finally what the invoice should look like.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not claiming advice. The travel rules here come from the NDIS Pricing Arrangements and Price Limits 2025-26 (version 1.1), which is still the current claiming guidance on ndis.gov.au, and item prices from the NDIS Pricing Schedule 2026-27 (effective 24 September 2026). Both were read on 24 October 2026. The NDIA says updated guidance documents are coming, so check the current versions before you rely on any figure.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: check the travel is claimable at all
&lt;/h2&gt;

&lt;p&gt;Before thinking about minutes or kilometres, run the trip past the conditions in the pricing arrangements. A provider can only claim travel from a participant's plan when &lt;strong&gt;all&lt;/strong&gt; of these are true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The pricing arrangements say Provider Travel can be claimed for that support item.&lt;/li&gt;
&lt;li&gt;The proposed charges comply with the pricing arrangements.&lt;/li&gt;
&lt;li&gt;The travel is part of delivering a specific disability support to that participant.&lt;/li&gt;
&lt;li&gt;The primary support is delivered face to face.&lt;/li&gt;
&lt;li&gt;You've explained the travel to the participant, including why it's a good use of their funds.&lt;/li&gt;
&lt;li&gt;The participant agreed to the travel costs &lt;strong&gt;in advance&lt;/strong&gt;. The agreement between you should say which travel costs can be claimed.&lt;/li&gt;
&lt;li&gt;You have to pay the worker for the travel time under their employment agreement, or you're a sole trader travelling from your usual place of work to or from the participant, or between participants.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two more rules sit alongside these. You can't claim travel on top of a support that already has travel costs built into its price. And the NDIA expects providers to keep a participant's travel costs as low as possible, for example by grouping appointments in an area or using telehealth where it suits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn6wndiptgnvdvp9izgdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn6wndiptgnvdvp9izgdi.png" alt="Seven conditions for claiming NDIS provider travel: the item allows it, charges comply, it's part of a support, the support is face to face, the travel was explained, it was agreed in advance, and the worker is paid for the travel time" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If any one of the seven is missing, the travel is a cost of doing business, not a claim against the plan. Condition 6 is the one that catches providers most often. A service agreement that doesn't mention travel isn't a basis for billing it, however obviously the trip was needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: split the trip into its two parts
&lt;/h2&gt;

&lt;p&gt;Every NDIS travel claim has two separate parts, and the scheme treats them differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Labour cost&lt;/strong&gt;: the worker's time in transit. It's claimed against the same support item being delivered, using the "Provider Travel" option, at the rate agreed for that support or a lower one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-labour cost&lt;/strong&gt;: what it costs to run the vehicle, plus things like tolls, parking and public transport fares. It's claimed on its own item, &lt;strong&gt;Provider travel – non-labour costs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5nw6yixq892459hy8p6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5nw6yixq892459hy8p6.png" alt="NDIS provider travel has two claims: labour (the worker's time, claimed on the same support item with the Provider Travel option and capped by MMM area) and non-labour (vehicle running costs, up to $0.99 a kilometre for a provider or worker car, claimed on the Provider travel - non-labour costs item)" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both are claimed separately from the support itself, and from each other. Mixing them up is the most common travel-claiming mistake we see. Our glossary has a short entry on &lt;a href="https://rostery.com.au/glossary/provider-travel" rel="noopener noreferrer"&gt;provider travel and the difference between labour and vehicle costs&lt;/a&gt; if you want something quick to share with a new admin team member.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: apply the travel time limit
&lt;/h2&gt;

&lt;p&gt;Travel time is capped, and the cap depends on the participant's location under the Modified Monash Model (MMM), which sorts places from MMM 1 (major cities) to MMM 7 (very remote). What matters is where the participant is when the support is delivered, not where your office is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7g9i30jlh7vxts8my176.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7g9i30jlh7vxts8my176.png" alt="NDIS travel time limits by Modified Monash Model area: up to 30 minutes to and from each participant in MMM 1-3, up to 60 minutes in MMM 4-5, no limit in MMM 6-7, and therapy travel priced at 50 percent of the direct price" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MMM 1 to 3:&lt;/strong&gt; up to 30 minutes of travel to and from each participant, for each eligible worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MMM 4 and 5:&lt;/strong&gt; up to 60 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MMM 6 and 7 (remote and very remote):&lt;/strong&gt; no travel time limit. Providers of core and capacity building supports can make specific arrangements with participants to cover travel costs, up to the hourly rate for the support item.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The limit is a ceiling, not an allowance. If the worker drove for 20 minutes, you claim 20 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trip home.&lt;/strong&gt; Providers of core and capacity building supports can also claim travel from the last participant back to the worker's usual place of work, but only if they must pay the worker for that return trip. The same time limit applies to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rate.&lt;/strong&gt; The hourly rate for travel time should be the same as the rate agreed for the support, or lower if you've agreed that with the participant. For NDIA-managed and plan-managed participants, the 2026-27 Pricing Schedule's maximum prices apply, so the rate can't go above the price limit for that item.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: work out the kilometres
&lt;/h2&gt;

&lt;p&gt;For the vehicle side, the NDIA considers these to be reasonable contributions a provider can negotiate with the participant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A vehicle owned by the provider or the worker:&lt;/strong&gt; up to $0.99 a kilometre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other transport or associated costs&lt;/strong&gt; such as tolls, parking and public transport fares: up to the full amount.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three rules come with that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can only claim non-labour costs where the rules allow a claim for travel time on that trip. If the time isn't claimable, the kilometres aren't either.&lt;/li&gt;
&lt;li&gt;The kilometres go on the &lt;strong&gt;Provider travel – non-labour costs&lt;/strong&gt; item for the relevant support category, not on the support item.&lt;/li&gt;
&lt;li&gt;These items aren't subject to price limits. They carry a notional unit price of $1.00, so a $46.80 kilometre charge goes in as 46.8 units at $1.00.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't confuse this with activity based transport.&lt;/strong&gt; When a worker drives a participant somewhere as part of a community participation support, that's activity based transport, not provider travel. The worker's time is claimed at the hourly rate of the community participation item, and the vehicle costs go on an Activity Based Transport item. The guide amounts are different too: up to $0.99 a kilometre in a vehicle that isn't modified for accessibility, and up to $2.76 a kilometre in a modified vehicle or a bus. The $2.76 figure is for transporting participants, not for a worker getting to them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: share trips fairly
&lt;/h2&gt;

&lt;p&gt;Workers often visit several participants in one run. When that happens, the pricing arrangements let you divide the travel time, including the return trip where it's claimable, among the participants. Kilometres are apportioned the same way. The split has to be agreed with each participant in advance as part of their service agreement.&lt;/p&gt;

&lt;p&gt;In the NDIA's own MMM 4 example, a worker drives 65 minutes and 60 km to Participant A, 25 minutes and 50 km to Participant B, then 40 minutes and 40 km back to base. The provider claims all 130 minutes of travel and 150 km, split evenly: 65 minutes and 75 km against each participant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: therapy travel in 2026-27
&lt;/h2&gt;

&lt;p&gt;Therapy is different. Under the 2025-26 pricing arrangements, the price limit for therapy travel time, including early childhood therapy, is 50% of the regular price limit for the item. The NDIA's example is a speech pathologist travelling for an hour in an MMM 5 area: the most that can be claimed for that travel time is $97.00, half the $193.99 direct price limit. This doesn't change what can be claimed for non-labour costs.&lt;/p&gt;

&lt;p&gt;The 2026-27 Pricing Schedule makes this visible in the item list. Therapy and early childhood items now have their own Provider Travel items ending in &lt;code&gt;_PT&lt;/code&gt;. For example, &lt;code&gt;15_622_0128_1_3_PT&lt;/code&gt; (Therapy – Speech Pathologist – Provider Travel) is listed at $97.00 an hour nationally, $135.80 remote and $145.50 very remote. You can search the current items and their remote prices in our free &lt;a href="https://rostery.com.au/tools/ndis-price-guide" rel="noopener noreferrer"&gt;NDIS Price Guide 2026-27 search tool&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: put it on the invoice as three lines
&lt;/h2&gt;

&lt;p&gt;Here's the NDIA's single-participant example. A worker drives 25 minutes (30 km) to a participant in an MMM 3 area, delivers two hours of support, then drives 25 minutes (30 km) back. The agreed rate is $50 an hour and the agreed kilometre charge is $0.78. Both legs are under the 30-minute limit, and the provider has to pay the worker for the return trip.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ohc9gzykn9ckdq2lhmf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ohc9gzykn9ckdq2lhmf.png" alt="NDIA worked example for one participant in MMM 3: $100.00 for two hours of support on 01_301_0104_1_1, $41.67 for 50 minutes of travel on the same item with the Provider Travel option, and $46.80 for 60 km on 01_799_0104_1_1" width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The claim goes in as three separate lines:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;$100.00 for two hours&lt;/td&gt;
&lt;td&gt;01_301_0104_1_1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Travel time&lt;/td&gt;
&lt;td&gt;$41.67 for 50 minutes&lt;/td&gt;
&lt;td&gt;01_301_0104_1_1, "Provider Travel"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kilometres&lt;/td&gt;
&lt;td&gt;$46.80 for 60 km&lt;/td&gt;
&lt;td&gt;01_799_0104_1_1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you'd rather not do this by hand each time, our free &lt;a href="https://rostery.com.au/tools/ndis-travel-calculator" rel="noopener noreferrer"&gt;NDIS provider travel calculator&lt;/a&gt; applies the MMM limits to a trip and shows the time, kilometres and items to claim at 2026-27 prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the kilometres still go unclaimed
&lt;/h2&gt;

&lt;p&gt;Knowing the rules is half of it. The other half is capturing the trip at all. Picture a worker who finishes one shift, drives 14 km to the next participant and does that shift too. There's no natural moment to record the 14 km. The timesheet asks about hours and the progress note asks about the support. By the time anyone raises an invoice, days later, the leg is gone.&lt;/p&gt;

&lt;p&gt;Our original guide makes the point that the addresses are usually already on file: the worker's home, each participant's address and the order of visits on the roster. That means the journey can be worked out rather than remembered, as long as three rules hold. An address that can't be resolved shows up as unresolved, never as zero. A system can propose travel legs, but a person applies them. And a straight-line distance is an estimate, labelled as one, that anyone can correct.&lt;/p&gt;

&lt;p&gt;Then travel has to survive three handoffs: captured against the shift, carried onto the timesheet and approved with it, and finally its own invoice lines. A good test is to take one worker's day last week with two participants and follow the travel from roster to invoice. If it doesn't arrive, you've found your leak.&lt;/p&gt;

&lt;p&gt;In Rostery, workers record the kilometres for each trip in the carer app and the data is captured against the shift, as described on our &lt;a href="https://rostery.com.au/features/mileage-tracking" rel="noopener noreferrer"&gt;mileage tracking page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick pre-claim checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The service agreement mentions travel and how it's charged, including any split between participants.&lt;/li&gt;
&lt;li&gt;The support item allows Provider Travel, and you're paying the worker for the time.&lt;/li&gt;
&lt;li&gt;The participant's location has been checked against its MMM area.&lt;/li&gt;
&lt;li&gt;Travel time is under the limit, and on the same item with the "Provider Travel" option (or the &lt;code&gt;_PT&lt;/code&gt; item for therapy).&lt;/li&gt;
&lt;li&gt;Kilometres are on the non-labour costs item, as their own line.&lt;/li&gt;
&lt;li&gt;You've kept the basis of the distance, so a queried claim can be answered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Travel limits, guide amounts and item numbers change at least once a year. Confirm the current values before relying on any of them, and if core supports claiming in general is new to you, our earlier post on &lt;a href="https://dev.to/rostery/ndis-core-supports-explained-categories-prices-and-claiming-2026-142g"&gt;core supports categories, prices and claiming&lt;/a&gt; covers the wider picture.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: NDIS Pricing Arrangements and Price Limits 2025-26 v1.1 (Provider Travel, Activity Based Transport, claiming items without price limits) and NDIS Pricing Schedule 2026-27, both on ndis.gov.au. Full guide: &lt;a href="https://rostery.com.au/blog/ndis-travel-kilometre-claiming-guide" rel="noopener noreferrer"&gt;NDIS Travel and Kilometre Claiming: What Providers Can Actually Bill&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>disability</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>How to Get an NDIS Worker Screening Check in 2026: Steps, Fees and Start Rules in All Eight States</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Fri, 23 Oct 2026 03:24:52 +0000</pubDate>
      <link>https://dev.to/rostery/how-to-get-an-ndis-worker-screening-check-in-2026-steps-fees-and-start-rules-in-all-eight-states-13p8</link>
      <guid>https://dev.to/rostery/how-to-get-an-ndis-worker-screening-check-in-2026-steps-fees-and-start-rules-in-all-eight-states-13p8</guid>
      <description>&lt;p&gt;&lt;em&gt;From the Rostery team in Sydney. This walkthrough is adapted from our original guide, &lt;a href="https://rostery.com.au/blog/ndis-worker-screening-check-every-state-2026" rel="noopener noreferrer"&gt;NDIS Worker Screening Check in Every State and Territory (2026 Guide)&lt;/a&gt;, which lists every official source.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you work with people with disability for a registered NDIS provider, there's a good chance you need an NDIS Worker Screening Check before you can do the job.&lt;/strong&gt; It's one national check, but you apply through a screening unit in your own state or territory, and each of those units does things a little differently. The fee is different, the way you prove who you are is different, and so is the answer to the question most new workers ask first: can I start before my clearance comes through?&lt;/p&gt;

&lt;p&gt;This post works through it in the order you'll meet it. First, whether you need a check at all. Then the five steps that are the same everywhere, then the state-by-state details, then what happens while you wait, and finally how renewal works. Fees and rules are as published by each screening unit when our original guide was checked on 1 October 2026.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only. Fees usually change on 1 July and rules can change at any time, so confirm with your screening unit before you apply.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you actually need one?
&lt;/h2&gt;

&lt;p&gt;You need a check if you're an employee, volunteer, contractor or student working for a &lt;strong&gt;registered&lt;/strong&gt; NDIS provider in a &lt;strong&gt;risk-assessed role&lt;/strong&gt; or a &lt;strong&gt;key personnel role&lt;/strong&gt;. Self-employed workers and sole traders who are registered providers need one too.&lt;/p&gt;

&lt;p&gt;There are also cases where it isn't legally required but is asked for anyway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a registered provider decides every worker needs one, whatever their role&lt;/li&gt;
&lt;li&gt;an unregistered provider decides its workers need one&lt;/li&gt;
&lt;li&gt;a self-managed participant decides the people they engage need one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the honest answer for most support workers is yes, and if you're not sure, your employer will tell you.&lt;/p&gt;

&lt;h3&gt;
  
  
  What counts as a risk-assessed role
&lt;/h3&gt;

&lt;p&gt;The NDIS Quality and Safeguards Commission defines a risk-assessed role as one that is either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;involved in the direct delivery of specified supports or services to a person with disability, or&lt;/li&gt;
&lt;li&gt;likely to need more than incidental contact with people with disability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"More than incidental contact" covers physically touching a person with disability, building rapport with them as a normal part of the job, or having contact with several people with disability in a specialist support or specialist disability accommodation setting. Contact here includes face to face, phone, written and online contact, which catches roles that people don't always think of as frontline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key personnel&lt;/strong&gt; need a check too: the CEO, directors listed with ASIC, executive staff, managers and board members.&lt;/p&gt;

&lt;p&gt;If you want the one-paragraph version to send a new starter, our glossary has a short entry on &lt;a href="https://rostery.com.au/glossary/worker-screening" rel="noopener noreferrer"&gt;what the NDIS Worker Screening Check is and who needs it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five steps, wherever you live
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm22cmcqog60p4th6ervs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm22cmcqog60p4th6ervs.png" alt="Five steps of an NDIS Worker Screening Check application: employer gives Employer ID, worker applies where they live, worker proves identity, employer verifies within 28 days, screening unit decides cleared or excluded" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The process has the same shape in every state and territory:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get your employer's NDIS Commission Employer ID.&lt;/strong&gt; You have to name an employer on your first application and on every renewal. Some application forms let you search for the employer instead of typing the ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply to the screening unit where you live.&lt;/strong&gt; Not where your employer is based, and not in several places. The check is national, so you only apply once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prove your identity and pay the fee.&lt;/strong&gt; Depending on the state, that's online with your phone's camera or in person at a service centre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your employer verifies your application&lt;/strong&gt; in the NDIS Worker Screening Database. The request reaches them within 48 hours and expires after 28 days, so let them know it's on its way. An unverified application doesn't go anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The screening unit decides&lt;/strong&gt; whether you're cleared or excluded and records the decision in the national database.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are only two outcomes: cleared or excluded. You don't get a certificate to upload anywhere. When you start with a new employer, you give them your worker screening number and they confirm the status in the database themselves.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you're a sole trader
&lt;/h3&gt;

&lt;p&gt;Sole traders are both the worker and the employer, so step 4 loops back to you. You first get access to the NDIS Worker Screening Database through the NDIS Commission's portal, generate your own Employer ID, apply, and then verify your own application within 28 days. The Commission is moving portal sign-in from PRODA to myID and the Relationship Authorisation Manager (RAM), so follow its current instructions rather than an old screenshot. If you're setting up as a registered sole trader from scratch, our guide on &lt;a href="https://rostery.com.au/blog/become-registered-ndis-provider-2026" rel="noopener noreferrer"&gt;how to become a registered NDIS provider in 2026&lt;/a&gt; covers the registration side.&lt;/p&gt;

&lt;h2&gt;
  
  
  State by state
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9zwi48793zaafjr7mlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9zwi48793zaafjr7mlo.png" alt="NDIS Worker Screening Check fees and rules for NSW, Victoria, Queensland, Western Australia, South Australia, Tasmania, the ACT and the Northern Territory" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what's different in each place. Fees are for paid workers first, then volunteers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New South Wales: $112, free for volunteers.&lt;/strong&gt; The NSW NDIS Worker Check is run by the Office of the Children's Guardian. You start online in your MyServiceNSW account, then visit a Service NSW centre within 28 days with your application number and three original identity documents, one each from Categories A, B and C. At least one needs your photo and one your signature, all in the same name. Service NSW takes your photo and the fee. There's no published processing time, but you can follow your application's status in MyServiceNSW.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Victoria: $139.20, with a fee waiver volunteers can apply for.&lt;/strong&gt; Apply through Service Victoria. You verify your identity with your documents and your phone's camera, enter the Employer ID, consent to the checks and pay. Victoria sends a reminder email 120 days before a clearance expires.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queensland: $161.30, free for volunteers&lt;/strong&gt; (including students on unpaid placement), as at 1 July 2026. Applications go through the Worker Screening website. If you also need a blue card for child-related work, a combined NDIS and blue card application costs $176.30 for paid workers and is free for volunteers, and it has to be lodged through the Worker Screening website rather than Blue Card Services. If you can't apply online, Disability Worker Screening can send a paper form (1800 183 690).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Western Australia: $145, $80 concession, $11 for volunteers.&lt;/strong&gt; The Department of Communities runs the NDIS Check, but you lodge through the Department of Transport. Start in DoTDirect, then attend a Driver and Vehicle Services centre with four identity documents: one commencement-of-identity document, one primary and two secondary use-in-the-community documents. If you can't travel, ask about alternate lodgement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;South Australia: $145, $73.50 for tertiary students, free for volunteers.&lt;/strong&gt; The Department of Human Services Screening Unit takes applications online through a Screening SA account, and you'll need your provider's or self-managed participant's Employer ID. The SA Screening Unit says most applications are completed within four weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tasmania: $137.20 for the Employment/Volunteer class, free for the Volunteer class.&lt;/strong&gt; The NDIS check is part of the Registration to Work with Vulnerable People (RWVP), run by the Department of Justice. You apply for, or amend, your RWVP with an NDIS endorsement and give your NDIS employer's details (ABN, trading name or Employer ID). The free Volunteer class is under fee relief that started on 1 January 2026 for two years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACT: $163, free for volunteer-only registration.&lt;/strong&gt; NDIS clearances sit inside the Working with Vulnerable People (WWVP) scheme run by Access Canberra. When you apply or renew with an NDIS clearance, you nominate at least one employer listed in the NDIS Worker Screening Database. Online applications need an ACT Digital Account, or you can go to a service centre.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Northern Territory: $149, $14 for volunteers&lt;/strong&gt; (from 1 July 2026). SAFE NT, part of NT Police, Fire and Emergency Services, runs the check. Apply online with four identity documents, a selfie holding your ID and your address history for the last five years. Volunteers also upload a volunteer declaration.&lt;/p&gt;

&lt;p&gt;Most fees are non-refundable, so make sure you're applying for the right type of check before you pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you start before you're cleared?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdbij8sp2p8cwtyeauv3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdbij8sp2p8cwtyeauv3o.png" alt="Whether a new worker can start before their NDIS Worker Screening Check clearance arrives: yes with conditions in NSW, WA and the NT; no in Victoria, Queensland and South Australia; confirm first in Tasmania and the ACT" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where the states split most clearly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes, with conditions: NSW, WA and the NT.&lt;/strong&gt; In NSW there are arrangements for a person to work while their application is assessed once their employer has verified it, so talk to your employer. In WA most people can start if the application is complete and identity verified, the employer has verified them, the application hasn't been withdrawn, they have no previous exclusion and no interim bar has been imposed. In the NT you can work on application if it's complete, paid and verified, your employer agrees and has risk management in place, and you're supervised by someone with a clearance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No: Victoria, Queensland and South Australia.&lt;/strong&gt; Victoria requires a clearance before a worker starts in a risk-assessed role. Queensland's rule is "no card, no start". In SA it's an offence to work with people with disability without a current check, so new applicants wait, although someone renewing an SA-issued check before it expires may be able to keep working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm first: Tasmania and the ACT.&lt;/strong&gt; The official Tasmanian pages we checked don't say either way. In the ACT, NDIS activity is a regulated activity and working without the required registration is an offence, so ring Access Canberra on 13 22 81 before you start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where working on application is allowed, the provider still has work to do. The NDIS Commission expects it to check the rules in every state or territory it operates in, keep a written risk management plan, make sure the worker is always supervised by someone with a clearance, and record them as a worker without a screening clearance. If a screening unit imposes an &lt;strong&gt;interim bar&lt;/strong&gt; because of information of concern, the person can't work in the role while the application is pending.&lt;/p&gt;

&lt;p&gt;For coordinators, this has a direct effect on the roster. A new starter in Victoria simply can't be put on a shift until the clearance is in. A new starter in the NT can, but only alongside a cleared worker, which means the shift needs two people. If you're building the first few weeks of a new hire's roster, a simple &lt;a href="https://rostery.com.au/tools/roster-template" rel="noopener noreferrer"&gt;weekly or SIL roster template&lt;/a&gt; makes it easier to see where a buddy shift is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Renewal: five years, 90-day window
&lt;/h2&gt;

&lt;p&gt;A clearance lasts up to five years from the date it's issued, unless it's cancelled or revoked. You can renew from 90 days before it expires, with the screening unit in the state or territory where you live at the time. Like the first application, you only renew in one place, and you need to name an employer.&lt;/p&gt;

&lt;p&gt;You don't need a new check because you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;move interstate&lt;/li&gt;
&lt;li&gt;change employer&lt;/li&gt;
&lt;li&gt;change your business structure, for example from sole trader to company.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You only reapply when your check expires or is cancelled. Employers linked to you are notified when your check is about to expire, but don't count on someone else remembering: put the date in your own calendar now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick answers to common snags
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"My employer hasn't verified my application."&lt;/strong&gt; The verification request expires after 28 days. Check they're expecting it and that you used the right Employer ID.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I need a Working with Children Check as well."&lt;/strong&gt; They're separate checks. If your role also involves child-related work you may need both. Queensland lets you apply for both at once. If you want the child-check side for every state, our dev.to post on &lt;a href="https://dev.to/rostery/working-with-children-check-2026-how-to-apply-in-each-state-step-by-step-20j9"&gt;Working with Children Checks in each state&lt;/a&gt; covers it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I work for an unregistered provider."&lt;/strong&gt; The check is mandatory for risk-assessed roles at registered providers. Unregistered providers and self-managed participants can choose to require it, and many do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I moved from Perth to Brisbane."&lt;/strong&gt; Your clearance comes with you. Give your new employer your worker screening number.&lt;/p&gt;

&lt;h2&gt;
  
  
  For providers: where this ends up
&lt;/h2&gt;

&lt;p&gt;Most screening problems turn into rostering problems before they turn into audit findings. A clearance that lapsed last month doesn't stop anyone being booked into a shift unless your system knows the date. In Rostery, each worker's clearance and expiry date sit on their profile, the office is warned before a check runs out, and the &lt;a href="https://rostery.com.au/features/scheduler-rostering" rel="noopener noreferrer"&gt;rostering scheduler&lt;/a&gt; won't let a worker whose required clearance has lapsed be put on a shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the full guide
&lt;/h2&gt;

&lt;p&gt;For the full detail on each state, the provider record-keeping rules and links to every official source, read the original: &lt;a href="https://rostery.com.au/blog/ndis-worker-screening-check-every-state-2026" rel="noopener noreferrer"&gt;NDIS Worker Screening Check in Every State and Territory (2026 Guide)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rostery team, Sydney&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>disability</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Support at Home 2026: Who Can Get It, How to Apply, What It Costs and How Funding Works</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Thu, 22 Oct 2026 03:14:49 +0000</pubDate>
      <link>https://dev.to/rostery/support-at-home-2026-who-can-get-it-how-to-apply-what-it-costs-and-how-funding-works-4igi</link>
      <guid>https://dev.to/rostery/support-at-home-2026-who-can-get-it-how-to-apply-what-it-costs-and-how-funding-works-4igi</guid>
      <description>&lt;p&gt;&lt;em&gt;From the Rostery team in Sydney. This walkthrough was first published on our blog as &lt;a href="https://rostery.com.au/blog/support-at-home-program-guide" rel="noopener noreferrer"&gt;Support at Home Program: The Complete Guide&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support at Home is now the main way the Australian Government pays for care and practical help at home for older people.&lt;/strong&gt; It started on 1 November 2025 and replaced two programs at once: Home Care Packages and the Short-Term Restorative Care Programme. Three agencies share the work. The Department of Health, Disability and Ageing runs the program, Services Australia holds each person's budget and pays providers, and the Aged Care Quality and Safety Commission registers and regulates the providers.&lt;/p&gt;

&lt;p&gt;This post goes through it in the order most people meet it: whether you can get it, how to apply, what funding you might be approved for, what you'll pay, and how to pick a provider. It's written for older people and families, and for the provider staff who explain the program every day. Every dollar figure is the one in effect from 1 October 2026.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only. Amounts and wait times change, so confirm current figures with My Aged Care or your provider before you decide anything.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Check you can be assessed
&lt;/h2&gt;

&lt;p&gt;Under section 58 of the Aged Care Act 2024, you can be assessed for Support at Home if you have care needs and you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;65 or over&lt;/li&gt;
&lt;li&gt;50 or over and an Aboriginal or Torres Strait Islander person&lt;/li&gt;
&lt;li&gt;50 or over and homeless or at risk of homelessness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're under 65, you have to choose aged care in writing, and you must be told about other services that may suit you.&lt;/p&gt;

&lt;p&gt;Meeting the age rule doesn't mean you're approved. It only means you can be assessed. The assessment decides whether you get Support at Home, at what classification and for which services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Apply through My Aged Care
&lt;/h2&gt;

&lt;p&gt;There are three ways in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Online&lt;/strong&gt; at myagedcare.gov.au. Have your Medicare card handy. The form takes about 15 to 20 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;By phone&lt;/strong&gt; on 1800 200 422, Monday to Friday 8am to 8pm and Saturday 10am to 2pm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In person&lt;/strong&gt; with an Aged Care Specialist Officer at a Services Australia office. Book on 1800 227 475.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A GP, another health professional or a hospital can refer you instead, and a family member or friend can apply with you. If there's nobody to help, a care finder can. Elder Care Support helps Aboriginal and Torres Strait Islander people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: The assessment and your two documents
&lt;/h2&gt;

&lt;p&gt;If you're eligible, an aged care needs assessor gets in touch to arrange an assessment. It's part of the Single Assessment System, which started on 1 July 2024, and the assessor uses the Integrated Assessment Tool to understand your needs, your goals and the help you already get.&lt;/p&gt;

&lt;p&gt;Afterwards you receive two documents, and both matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Notice of Decision&lt;/strong&gt; says what you're approved for: your ongoing classification, any short-term pathway or AT-HM tier, the reasons and evidence, and your right to ask for a review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The support plan&lt;/strong&gt; sets out your needs and goals and the services you're approved to use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whichever provider you choose works from these two documents, so keep them somewhere you can find them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Understand which kind of funding you have
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2e55oivmnmp3x6urlelr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2e55oivmnmp3x6urlelr.png" alt="The kinds of Support at Home funding: ongoing services in eight classifications from $2,757.89 to $20,073.50 a quarter; the Restorative Care Pathway at $6,179.40; the End-of-Life Pathway at $25,736.57; AT-HM tiers from $513 to $15,390; supplements; and unspent Home Care Package funds" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ongoing services
&lt;/h3&gt;

&lt;p&gt;Most people are approved for ongoing services in one of eight classifications. Each sets a budget paid every quarter:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Classification&lt;/th&gt;
&lt;th&gt;Each quarter&lt;/th&gt;
&lt;th&gt;Each year&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;$2,757.89&lt;/td&gt;
&lt;td&gt;$11,031.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$4,120.89&lt;/td&gt;
&lt;td&gt;$16,483.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$5,645.23&lt;/td&gt;
&lt;td&gt;$22,580.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;$7,632.04&lt;/td&gt;
&lt;td&gt;$30,528.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;$10,202.32&lt;/td&gt;
&lt;td&gt;$40,809.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;$12,365.48&lt;/td&gt;
&lt;td&gt;$49,461.91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;$14,944.20&lt;/td&gt;
&lt;td&gt;$59,776.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;$20,073.50&lt;/td&gt;
&lt;td&gt;$80,294.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These amounts include the 10% that goes to care management. Budgets are normally indexed every 1 July. The rise on 1 October 2026 was an extra, one-off increase to fund the August 2026 award wage increase for aged care nurses.&lt;/p&gt;

&lt;p&gt;If you want to see what a level is worth week to week, or how carry-over works, our guide to &lt;a href="https://rostery.com.au/blog/support-at-home-funding-levels-2026" rel="noopener noreferrer"&gt;Support at Home funding levels 2026&lt;/a&gt; goes into detail, and the free &lt;a href="https://rostery.com.au/tools/support-at-home-classifications" rel="noopener noreferrer"&gt;Support at Home classifications explainer&lt;/a&gt; lets you click through all eight.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restorative Care Pathway
&lt;/h3&gt;

&lt;p&gt;An intensive, short period of care from allied health professionals and nurses, to help you regain or keep your independence. One unit is $6,179.40 for people starting from 1 October 2026 and covers up to 16 weeks. You can have up to two units in 12 months, and a second episode can't start until three months after the first one's 16 weeks end.&lt;/p&gt;

&lt;h3&gt;
  
  
  End-of-Life Pathway
&lt;/h3&gt;

&lt;p&gt;For people who want to stay at home in their last months. A doctor or nurse practitioner must estimate three months or less to live, and the person's Australian-modified Karnofsky Performance Status (AKPS) score must be 40 or less. It provides $25,736.57 over 12 weeks for people starting from 1 October 2026, and the money can be used over up to 16 weeks without a new review. It's one episode per person. While on it, your ongoing classification is set aside. A second round of funding, from early 2027, has been announced for people who live beyond the first 12 weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assistive technology and home modifications (AT-HM)
&lt;/h3&gt;

&lt;p&gt;Equipment and changes to your home are paid separately from the quarterly budget. For people starting from 1 July 2026 the tiers are $513 (low), $2,052 (medium) and $15,390 (high). Each runs for 12 months, or up to 24 months for complex home modifications at the high tier. Assistive technology over $15,390 can be funded with evidence of need, such as a valid prescription. Whatever's left at the end can't be carried over.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supplements
&lt;/h3&gt;

&lt;p&gt;Some people get extra funding for a specific need. From 1 October 2026: oxygen is $15.06 a day; enteral feeding is $23.90 a day (bolus) or $26.84 (non-bolus); the veterans' supplement adds 11.5% of the classification's daily funding; and people in Modified Monash areas 6 and 7 get a remote supplement of 50% of the AT or HM tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: The wait
&lt;/h2&gt;

&lt;p&gt;Restorative Care and End-of-Life funding is available straight away. AT-HM has its own priority systems. Ongoing funding comes through the Support at Home Priority System, which has four categories: urgent, high, medium and standard. My Aged Care's estimates, last updated 30 June 2026, are within 1 month for urgent, 1 month for high, 5 to 6 months for medium and 7 to 8 months for standard.&lt;/p&gt;

&lt;p&gt;When funding is tight you may get interim funding first: 60% of your classification, with the rest added later and not backdated. People in the urgent category, and people on either short-term pathway, always get full funding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Work out what you'll contribute
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmy4y4dx8eqvkreufbia8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmy4y4dx8eqvkreufbia8.png" alt="The three Support at Home service categories: clinical supports at 0% contribution, independence at 5% to 50%, and everyday living at 17.5% to 80%, with example services in each" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every service on the Support at Home service list sits in one of three categories, and the category decides what you pay:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clinical supports:&lt;/strong&gt; nursing, allied health such as physiotherapy, occupational therapy, podiatry and dietetics, personal care, and care management. You pay nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independence:&lt;/strong&gt; social support, respite, transport, therapeutic services such as remedial massage, and AT-HM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everyday living:&lt;/strong&gt; cleaning and laundry, shopping help, gardening and minor home repairs, meal preparation and delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personal care moved into clinical supports on 1 October 2026, so it no longer attracts a contribution. The date the service was delivered is what counts. Personal care delivered before 1 October still carries a contribution even if the provider claims it later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fouzomutprqq9bbsh14p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fouzomutprqq9bbsh14p7.png" alt="Support at Home contribution rates: full pensioners pay 0%, 5% and 17.5%; part pensioners and card holders 5% to 50% and 17.5% to 80%; others 50% and 80%" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For independence and everyday living you pay a percentage of each service's price, and the government pays the rest. Full pensioners pay 5% and 17.5%. Part pensioners and self-funded retirees with a Commonwealth Seniors Health Card are on a sliding scale up to 50% and 80%. Self-funded retirees without a card, and anyone who doesn't share their means information, pay 50% and 80%.&lt;/p&gt;

&lt;p&gt;Two protections sit on top:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A lifetime cap.&lt;/strong&gt; From 20 September 2026 it's $140,652.80, counting Support at Home contributions together with the non-clinical part of any later residential care contribution. Under the no worse off rules it's $88,934.57.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The no worse off rules.&lt;/strong&gt; If on 12 September 2024 you had a Home Care Package, were on the National Priority System or had been approved for a package, you pay lower rates. Full pensioners under these rules pay nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our &lt;a href="https://rostery.com.au/tools/support-at-home-calculator" rel="noopener noreferrer"&gt;Support at Home budget and contribution calculator&lt;/a&gt; gives a quick estimate for a given classification.&lt;/p&gt;

&lt;p&gt;Also worth knowing: providers have to build their costs into each service price. They can't charge separate administration, package management or travel fees, or charge you to start or leave.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Choose a provider within 56 days
&lt;/h2&gt;

&lt;p&gt;Once your funding is allocated, you have 56 calendar days to sign a service agreement and start services. A 28-day extension from My Aged Care takes that to 84. If services haven't started by then, the funding is withdrawn.&lt;/p&gt;

&lt;p&gt;One registered provider delivers and claims for all your services. It must be registered with the Commission in at least Category 4, plus Category 5 if it delivers nursing. Providers report their usual prices on My Aged Care and publish their full price list on their website, and you can compare them with the Find a provider tool.&lt;/p&gt;

&lt;p&gt;Before or on the first day, the provider writes a care plan with you, gives you an individualised budget as soon as practical, and allocates a care partner, who must have at least one direct care management contact with you each month of at least 15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  After you start: budgets and statements
&lt;/h2&gt;

&lt;p&gt;Services Australia holds your budget, and your provider claims from it after delivering services. Unspent ongoing funding carries over to the next quarter, up to $1,000 or 10% of the quarterly budget after care management, whichever is higher. You get a statement every month, even in months with no services, by the last day of the following month. If no services are delivered for four quarters in a row, your funding is withdrawn.&lt;/p&gt;

&lt;p&gt;You can change provider for any reason, and your funding moves with you. There's no exit fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  For providers
&lt;/h2&gt;

&lt;p&gt;If you're a provider setting up for all this, the obligations add up quickly: prices on My Aged Care, a signed agreement, a care plan by day one, monthly care management contact, contributions by date of service, and a statement every month. In Rostery, each quarter's funding is drawn from the right budget for the participant's &lt;a href="https://rostery.com.au/features/sah-classifications-budgets" rel="noopener noreferrer"&gt;classification and budget&lt;/a&gt;, and claims and statements are built from the same visits.&lt;/p&gt;

&lt;p&gt;If your home care staff are paid under the SCHADS Award, our dev.to piece on &lt;a href="https://dev.to/rostery/schads-award-2026-pay-rates-levels-and-rules-explained-1k9k"&gt;SCHADS Award 2026 pay rates, levels and rules&lt;/a&gt; covers the pay side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the full guide
&lt;/h2&gt;

&lt;p&gt;The original has the full exclusions list, every table, the Home Care Package transition amounts, CHSP and the key dates, plus all the government sources: &lt;a href="https://rostery.com.au/blog/support-at-home-program-guide" rel="noopener noreferrer"&gt;Support at Home Program: The Complete Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rostery team, Sydney&lt;/em&gt;&lt;/p&gt;

</description>
      <category>australia</category>
      <category>agedcare</category>
      <category>healthcare</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Working with Children Check 2026: How to Apply in Each State, Step by Step</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Wed, 21 Oct 2026 03:27:43 +0000</pubDate>
      <link>https://dev.to/rostery/working-with-children-check-2026-how-to-apply-in-each-state-step-by-step-20j9</link>
      <guid>https://dev.to/rostery/working-with-children-check-2026-how-to-apply-in-each-state-step-by-step-20j9</guid>
      <description>&lt;p&gt;&lt;em&gt;From the Rostery team in Sydney. This walkthrough was first published on our blog as &lt;a href="https://rostery.com.au/blog/working-with-children-check-every-state-2026" rel="noopener noreferrer"&gt;Working with Children Check 2026: how to apply in every state, with fees, steps and processing times&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Australia doesn't have one Working with Children Check. It has eight.&lt;/strong&gt; Each state and territory runs its own scheme, under its own law and often under its own name, and a check from one place doesn't cover work in another. For paid work in 2026-27 the fee runs from $87 in Western Australia to $163 in the ACT. A check lasts five years in most places, three in Queensland and WA, and only two in the Northern Territory.&lt;/p&gt;

&lt;p&gt;This post is the practical version: what you need in your hand before you start, the order of the steps in each state, the fee, and whether you can start work while you wait. It's written for support workers, coordinators and the small NDIS and aged-care providers who hire them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;General information only, not legal advice. Fees change every 1 July and rules change often, so confirm with the state agency before you apply.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The eight checks at a glance
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkd1ia78qh17hpw89wdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkd1ia78qh17hpw89wdu.png" alt="Working with Children Check in each Australian state and territory: name, fee, volunteer fee, validity and where to verify ID" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Paid work fee&lt;/th&gt;
&lt;th&gt;Lasts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NSW&lt;/td&gt;
&lt;td&gt;Working with Children Check&lt;/td&gt;
&lt;td&gt;$112&lt;/td&gt;
&lt;td&gt;5 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Victoria&lt;/td&gt;
&lt;td&gt;Working with Children Check&lt;/td&gt;
&lt;td&gt;$139.20&lt;/td&gt;
&lt;td&gt;5 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queensland&lt;/td&gt;
&lt;td&gt;Blue card&lt;/td&gt;
&lt;td&gt;$108.30&lt;/td&gt;
&lt;td&gt;3 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Western Australia&lt;/td&gt;
&lt;td&gt;Working with Children Check&lt;/td&gt;
&lt;td&gt;$87&lt;/td&gt;
&lt;td&gt;3 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South Australia&lt;/td&gt;
&lt;td&gt;Working with Children Check&lt;/td&gt;
&lt;td&gt;$145&lt;/td&gt;
&lt;td&gt;5 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tasmania&lt;/td&gt;
&lt;td&gt;Registration to Work with Vulnerable People&lt;/td&gt;
&lt;td&gt;$137.20&lt;/td&gt;
&lt;td&gt;5 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ACT&lt;/td&gt;
&lt;td&gt;Working with Vulnerable People&lt;/td&gt;
&lt;td&gt;$163&lt;/td&gt;
&lt;td&gt;5 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Northern Territory&lt;/td&gt;
&lt;td&gt;Ochre Card&lt;/td&gt;
&lt;td&gt;$89&lt;/td&gt;
&lt;td&gt;2 years&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Volunteers pay nothing except in WA ($11) and the NT ($8). A volunteer check never covers paid work in any state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you start: who needs one
&lt;/h2&gt;

&lt;p&gt;You need a check if contact with children under 18 is a normal part of your work or volunteering, not something incidental, in a setting your state lists. Disability support for children is on those lists. NSW names helping children with disability without other adults supervising. Queensland names disability services and NDIS supports to a child. South Australia lists disability services for children and any close personal contact with a child with a disability. Tasmania and the ACT treat NDIS work itself as a regulated activity.&lt;/p&gt;

&lt;p&gt;The minimum age to apply varies too: 14 in South Australia, up to 18 in NSW.&lt;/p&gt;

&lt;p&gt;If you're an NDIS worker with participants under 18, expect to need two checks: the national NDIS Worker Screening Check and your state's child check. We've covered the NDIS side in our &lt;a href="https://rostery.com.au/blog/ndis-worker-screening-check-every-state-2026" rel="noopener noreferrer"&gt;NDIS Worker Screening Check guide for every state&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  New South Wales
&lt;/h2&gt;

&lt;p&gt;Run by the Office of the Children's Guardian (OCG), with ID checks at Service NSW.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to have ready:&lt;/strong&gt; four original identity documents (one commencement of identity, one primary and two secondary, with at least one showing your photo and signature), every name you've ever used, your address, an email and a phone number. A digital NSW driver licence is fine. Photocopies and laminated documents aren't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete the online application on the OCG site. You'll get an application (APP) number by email.&lt;/li&gt;
&lt;li&gt;Within 28 days, take the APP number, your ID and the $112 fee (paid workers only) to a Service NSW centre.&lt;/li&gt;
&lt;li&gt;The OCG checks national criminal history and workplace misconduct records. Your clearance comes by email as a WWC number. There's no card, but you can add it to the Service NSW app.&lt;/li&gt;
&lt;li&gt;Give your employer your APP number first, then your WWC number, full name and date of birth.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; police results can take up to 4 weeks. The law lets you start child-related work once you have an APP number, but NSW Health, early childhood services and the Department of Education want a clearance first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Renewing:&lt;/strong&gt; up to 3 months before expiry, online with face verification or at Service NSW. Volunteers moving to paid work have 30 days to upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Victoria
&lt;/h2&gt;

&lt;p&gt;Run by the Social Services Regulator (SSR), with applications through Service Victoria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New from 19 October 2026:&lt;/strong&gt; You must first finish free WWC Child Safety Training, an online course of about 45 minutes in six modules. You then have 30 days to lodge your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Complete the training.&lt;/li&gt;
&lt;li&gt;Apply online through Service Victoria. Verify your identity with one Group A document (Australian driver licence, learner permit or Medicare card) and one Group B document (Australian passport, birth certificate, foreign passport with visa, ImmiCard or citizenship certificate). Without both, verify in person at Australia Post.&lt;/li&gt;
&lt;li&gt;Pay the employee fee of $139.20. Answer any request for information within 28 days or the application is withdrawn.&lt;/li&gt;
&lt;li&gt;Your card shows your photo, number, type (E for employee, V for volunteer) and expiry, and can live in the Service Vic app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; a clean record may take only days. Applications with history usually take 3 to 12 weeks, and the SSR warns some take more than six months. Most people can start once they've applied, except in services covered by the Children's Services Regulations 2020 or the Education and Care Services National Law.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Renewing:&lt;/strong&gt; online, from six months before expiry to three months after. The renewal fee for an employee clearance is $105.30.&lt;/p&gt;

&lt;h2&gt;
  
  
  Queensland
&lt;/h2&gt;

&lt;p&gt;Run by Blue Card Services in the Department of Justice. The check is the blue card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit a Department of Transport and Main Roads customer service centre to get a Customer Reference Number and photo. It's free. Interstate, overseas and remote applicants have a remote option.&lt;/li&gt;
&lt;li&gt;Register online and apply through the applicant portal, using the same email, mobile and date of birth as your TMR record.&lt;/li&gt;
&lt;li&gt;Pay $108.30 for paid work, or have your employer pay. If you also need a yellow card (NDIS worker screening), one combined application covers both and they expire on the same day.&lt;/li&gt;
&lt;li&gt;Wait for the approval notice. The physical card can take up to 21 days to arrive.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; most applications with no criminal history are approved within 5 business days. But the rule is "No Card. No Link. No Start": you can't begin regulated work until you're approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handy saving:&lt;/strong&gt; if you already hold a disability worker screening clearance, a blue card costs $15.&lt;/p&gt;

&lt;h2&gt;
  
  
  Western Australia
&lt;/h2&gt;

&lt;p&gt;Run by the WWC Screening Unit, Department of Communities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick up the form at an authorised Australia Post outlet. Your organisation fills in its part (self-employed people skip this).&lt;/li&gt;
&lt;li&gt;Lodge it in person at Australia Post with your ID and the fee: $87 paid, $11 volunteer.&lt;/li&gt;
&lt;li&gt;Keep the receipt. In most cases it lets you start or keep doing child-related work while you wait.&lt;/li&gt;
&lt;li&gt;Your card is emailed and posted, and the number can be checked online before it arrives.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;WA doesn't publish a processing time. The card lasts 3 years.&lt;/p&gt;

&lt;h2&gt;
  
  
  South Australia
&lt;/h2&gt;

&lt;p&gt;Run by the Screening Unit, Department of Human Services, through the Screening SA portal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Screening SA account with your own email, or sign in with an Australian Government Digital ID. An employer can start the application for you, and you then have 28 days to finish it.&lt;/li&gt;
&lt;li&gt;Verify your identity online with a selfie, a photo ID and a second document. You'll need a smartphone.&lt;/li&gt;
&lt;li&gt;Pay online by credit card: $145 for employees, $73.50 for tertiary students. Fees aren't refunded.&lt;/li&gt;
&lt;li&gt;There's no card. The outcome is emailed, but your employer must verify it through its own portal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; most are done within 4 weeks. New workers can't start in a prescribed position until the employer has verified the check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tasmania
&lt;/h2&gt;

&lt;p&gt;Run by the RWVP Scheme in the Department of Justice, with ID checks at Service Tasmania.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply online. Have 5 years of addresses, any offence history, family violence or child protection orders, and each employer's details handy.&lt;/li&gt;
&lt;li&gt;Within 21 days, take three current ID documents to Service Tasmania, have your photo taken and pay if you didn't pay online.&lt;/li&gt;
&lt;li&gt;Choose your class carefully. NDIS work needs the Employment/Volunteer class with an NDIS Worker Screening Check added, even if you're volunteering. That addition costs $113.68.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; allow up to 6 weeks. You can start early only if your employer has agreed to engage you, you named them, you're supervised at all times by an RWVP holder and the employer has a risk management plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  ACT
&lt;/h2&gt;

&lt;p&gt;Run by Access Canberra. The check is the Working with Vulnerable People (WWVP) registration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to an ACT Government Digital Account, link the WWVP service and apply online.&lt;/li&gt;
&lt;li&gt;Pay $163 for paid work (volunteering only is free).&lt;/li&gt;
&lt;li&gt;Verify your identity with four documents, in person at a Service Centre or by post with certified copies, two passport photos and a photo of you holding your ID.&lt;/li&gt;
&lt;li&gt;Your card is posted. It shows whether you're unrestricted or restricted, and whether NDIS activities are covered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; the average is 8 weeks. Early starts are only for the employer named in the application, with its agreement, under constant supervision by a WWVP holder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Northern Territory
&lt;/h2&gt;

&lt;p&gt;Run by SAFE NT (NT Police) and the NT Screening Authority. The check is the Ochre Card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply online through Territory Services in one sitting, or in person, or by mail. Paper forms changed on 1 September 2026 and old ones are returned.&lt;/li&gt;
&lt;li&gt;Provide 100 points of ID including at least one Category A document.&lt;/li&gt;
&lt;li&gt;Pay $89 for paid work (including student placements) or $8 for volunteering.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Waiting:&lt;/strong&gt; no published processing time, and you can't start until you're cleared unless your employer gets a limited exemption for you. The card lasts only 2 years, and a renewal can take as long as a first application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs, side by side
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsq8pbasgoirylg25jcyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsq8pbasgoirylg25jcyx.png" alt="Working with Children Check fees 2026-27 in each state, for paid work and volunteers" width="799" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most states let an employer pay the fee. Fees aren't refunded if you apply twice, choose paid by mistake or withdraw. Upgrading a volunteer check to paid work also costs in several places: $139.20 in Victoria, $108.30 in Queensland, $113.68 in Tasmania, and a share of $145 in SA depending on the time left on your check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you start before you're cleared?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcsvqd4c7xfroyt385iiu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcsvqd4c7xfroyt385iiu.png" alt="Whether you can start work before your Working with Children Check is cleared, state by state" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The short version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NSW, Victoria and WA:&lt;/strong&gt; most people can once they've applied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasmania and the ACT:&lt;/strong&gt; only under constant supervision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NT:&lt;/strong&gt; only with an employer exemption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queensland and SA:&lt;/strong&gt; not until cleared.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever the law allows, your employer can still insist on a full clearance first.&lt;/p&gt;

&lt;h2&gt;
  
  
  For employers: what to keep on file
&lt;/h2&gt;

&lt;p&gt;Every state expects you to check the worker's status before they start, and most expect you to do it on the agency's own system. In NSW and SA, sighting an email or a card isn't enough. For each worker, record their name, date of birth, check number, whether it's a paid or volunteer check, the expiry date and the date you verified it. Victoria requires records to be kept for at least seven years.&lt;/p&gt;

&lt;p&gt;If you're getting ready for registration, these records sit alongside everything else in our guide to &lt;a href="https://rostery.com.au/blog/become-registered-ndis-provider-2026" rel="noopener noreferrer"&gt;becoming a registered NDIS provider in 2026&lt;/a&gt;. We also put together a checklist on dev.to of the &lt;a href="https://dev.to/rostery/ndis-certification-audit-evidence-a-checklist-for-each-practice-standard-area-3ne3"&gt;audit evidence for each Practice Standard area&lt;/a&gt; that pairs well with this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracking expiry dates
&lt;/h2&gt;

&lt;p&gt;With three different validity periods in play, an expiry date is easy to lose. In Rostery, staff upload their check to their profile and Rostery reads the type, number, issuer and expiry date. Where a card only shows an issue date, it works out expiry from that state's validity period, and alerts go out before a check lapses. More on &lt;a href="https://rostery.com.au/features/document-expiry-tracking" rel="noopener noreferrer"&gt;document expiry tracking&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's also a set of &lt;a href="https://rostery.com.au/tools" rel="noopener noreferrer"&gt;free NDIS tools&lt;/a&gt; on our site, including a price guide search and shift price calculator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the full guide
&lt;/h2&gt;

&lt;p&gt;The original post has every fee table, the employer rules for each state, the 2025 to 2027 changes, the interstate exemptions and a list of official sources: &lt;a href="https://rostery.com.au/blog/working-with-children-check-every-state-2026" rel="noopener noreferrer"&gt;Working with Children Check 2026 in every state&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rostery team, Sydney&lt;/em&gt;&lt;/p&gt;

</description>
      <category>australia</category>
      <category>ndis</category>
      <category>compliance</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>NDIS Core Supports Explained: Categories, Prices and Claiming (2026)</title>
      <dc:creator>Rostery Team</dc:creator>
      <pubDate>Tue, 20 Oct 2026 03:13:58 +0000</pubDate>
      <link>https://dev.to/rostery/ndis-core-supports-explained-categories-prices-and-claiming-2026-142g</link>
      <guid>https://dev.to/rostery/ndis-core-supports-explained-categories-prices-and-claiming-2026-142g</guid>
      <description>&lt;p&gt;&lt;em&gt;From the Rostery team. This guide was first published on our blog as &lt;a href="https://rostery.com.au/blog/ndis-core-supports-explained-2026" rel="noopener noreferrer"&gt;NDIS Core Supports explained: categories, prices and claiming (2026)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Supports are the part of an NDIS plan that pays for everyday help: assistance with daily life, transport, consumables, and support to take part in the community.&lt;/strong&gt; They are the largest and most flexible part of most plans. About 72% of the money committed in active NDIS plans sits in Core, and almost half of it is assistance with daily life.&lt;/p&gt;

&lt;p&gt;This guide explains the four Core categories, how flexible the funding really is, the 2026–27 price limits that took effect on 24 September 2026, and the claiming rules that most often cost providers money. It is written for NDIS providers, plan managers and support coordinators. Participants will find it useful too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Supports at a glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Four support categories:&lt;/strong&gt; 01 Assistance with Daily Life, 02 Transport, 03 Consumables, and 04 Assistance with Social, Economic and Community Participation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible within Core:&lt;/strong&gt; participants can usually choose supports across Core, but cannot move Core funding into Capacity Building or Capital.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The biggest part of the Scheme:&lt;/strong&gt; $47.9 billion of the $66.7 billion in annualised committed supports at 30 June 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New price limits:&lt;/strong&gt; the 2026–27 NDIS Pricing Schedule took effect on 24 September 2026. A standard weekday daytime hour of self-care support is capped at $73.58 nationally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Funding periods:&lt;/strong&gt; since 19 May 2025, new and reassessed plans usually release funding every three months rather than all at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq5yl9xxgaoa9ubd6uqlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq5yl9xxgaoa9ubd6uqlc.png" alt="The four NDIS Core Supports categories: Assistance with Daily Life, Transport, Consumables, and Assistance with Social, Economic and Community Participation, with examples of each" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every Core support item belongs to one of four support categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four Core Supports categories
&lt;/h2&gt;

&lt;p&gt;Every support a provider delivers is a support item in the NDIS Support Catalogue, and every support item belongs to a support category. The first two digits of the item number tell you which one. For example, in &lt;code&gt;01_013_0107_1_1&lt;/code&gt; (Assistance with Self-Care Activities, Standard, Saturday), &lt;code&gt;01&lt;/code&gt; is the support category, &lt;code&gt;013&lt;/code&gt; the sequence number, &lt;code&gt;0107&lt;/code&gt; the registration group, the next &lt;code&gt;1&lt;/code&gt; the outcome domain, and the last &lt;code&gt;1&lt;/code&gt; the support purpose, which is Core.&lt;/p&gt;

&lt;h3&gt;
  
  
  01 Assistance with Daily Life
&lt;/h3&gt;

&lt;p&gt;Help with personal care and everyday tasks: showering, dressing, meals, household tasks, and the overnight and around-the-clock support of supported independent living (SIL). Short-term accommodation (respite) and the home and living supports in this category also sit here. For most support-delivery providers, this category is where nearly all their revenue comes from.&lt;/p&gt;

&lt;h3&gt;
  
  
  02 Transport
&lt;/h3&gt;

&lt;p&gt;Funding to help a participant get to work, study, appointments and the community when they cannot use public transport without substantial difficulty. In the NDIA’s PACE system, transport is often paid as recurring transport funding, category 18, rather than claimed by a provider per trip. The time a support worker spends driving a participant &lt;em&gt;as part of&lt;/em&gt; a community participation support is claimed differently; see activity-based transport below.&lt;/p&gt;

&lt;h3&gt;
  
  
  03 Consumables
&lt;/h3&gt;

&lt;p&gt;Everyday items a participant needs because of their disability: continence products, low-cost assistive technology, and similar products. Consumables are usually low-cost and bought regularly. Higher-cost assistive technology is Capital, not Core.&lt;/p&gt;

&lt;h3&gt;
  
  
  04 Assistance with Social, Economic and Community Participation
&lt;/h3&gt;

&lt;p&gt;Support to take part in community, social, recreational and economic life: community access with a support worker, group and centre-based activities, and support in employment settings. At 30 June 2026 it was the second-largest support category in the Scheme, after daily activities.&lt;/p&gt;

&lt;h3&gt;
  
  
  How PACE shows the Core categories
&lt;/h3&gt;

&lt;p&gt;Plans in PACE use some additional category numbers. Alongside 01 to 04, Core funding in PACE can include 16 Home and Living and 21 Young People in Residential Aged Care (cross-billing), and transport can appear as 18 Recurring Transport. If a claim is rejected for the wrong category, check which category the participant’s PACE plan actually funded.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much of the NDIS is Core?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8946xwxfrz6g2v3z6le.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8946xwxfrz6g2v3z6le.png" alt="Bar chart of annualised committed supports at 30 June 2026: Core daily activities $32.4 billion, Core social and civic $14.0 billion, Core consumables $1.0 billion, Core transport $0.5 billion, all other support categories $18.8 billion" width="799" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Annualised committed supports in active plans at 30 June 2026. Source: NDIA Quarterly Report Q4 2025–26, Table D.25.&lt;/p&gt;

&lt;p&gt;At 30 June 2026 there were 782,013 active NDIS participants. The NDIA’s quarterly report shows $66.7 billion in annualised committed supports across their plans, of which:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Core support category&lt;/th&gt;
&lt;th&gt;Annualised committed supports&lt;/th&gt;
&lt;th&gt;Share of all supports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core: Daily activities&lt;/td&gt;
&lt;td&gt;$32,394 million&lt;/td&gt;
&lt;td&gt;48.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core: Social and civic&lt;/td&gt;
&lt;td&gt;$13,960 million&lt;/td&gt;
&lt;td&gt;20.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core: Consumables&lt;/td&gt;
&lt;td&gt;$1,003 million&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core: Transport&lt;/td&gt;
&lt;td&gt;$546 million&lt;/td&gt;
&lt;td&gt;0.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;All Core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$47,903 million&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Participants in supported independent living account for $18.0 billion of those committed supports, an average of about $488,000 each. With so much of the Scheme paid at support worker rates, a change to those price limits moves the whole Scheme.&lt;/p&gt;

&lt;h2&gt;
  
  
  How flexible is Core funding?
&lt;/h2&gt;

&lt;p&gt;The NDIS Pricing Arrangements describe it plainly: participant budgets often have a lot of flexibility to choose specific supports with their Core budgets, but cannot reallocate Core funding to other support purposes, that is, to Capital or Capacity Building. In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Across Core categories:&lt;/strong&gt; funding can usually be used across daily life, consumables and community participation to suit how the participant actually lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out of Core:&lt;/strong&gt; no. Core cannot pay for therapy, support coordination or equipment funded under Capacity Building or Capital.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stated supports:&lt;/strong&gt; some supports, such as SIL and items subject to quotation, are written into the plan as a stated item and can only be used for that support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport:&lt;/strong&gt; often paid as a regular recurring amount rather than a flexible budget.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Funding periods: the change most providers notice
&lt;/h3&gt;

&lt;p&gt;From 19 May 2025, the NDIA began giving new and reassessed plans shorter funding periods, usually three months. A funding period does not change the total amount in a plan, only when it becomes available. Funding periods were introduced by changes to the NDIS Act in October 2024, and plans made after that already had 12-month periods.&lt;/p&gt;

&lt;p&gt;For a provider this matters more than it sounds. A participant can have money left in the plan for the year and still have nothing left in the current funding period, so a claim can fail even though the plan looks well funded. Check the funding period, not just the plan total, before you roster a large block of support.&lt;/p&gt;

&lt;h3&gt;
  
  
  What counts as an NDIS support
&lt;/h3&gt;

&lt;p&gt;Since 3 October 2024, NDIS law lists what is, and is not, an NDIS support. Core funding can only be spent on supports that fit those lists, even when the participant’s Core budget has room.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbdozcrgbqxsa519xk25c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbdozcrgbqxsa519xk25c.png" alt="Comparison of NDIS Core Supports, Capacity Building and Capital: what each funds, how flexible it is, and typical providers" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Core pays for everyday help. Capacity Building builds skills; Capital buys equipment and homes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core, Capacity Building and Capital
&lt;/h2&gt;

&lt;p&gt;An NDIS plan has three support purposes. &lt;strong&gt;Core&lt;/strong&gt; enables participants to complete activities of daily living. &lt;strong&gt;Capacity Building&lt;/strong&gt; enables a participant to build their independence and skills, through supports such as therapy, support coordination, and finding and keeping a job. &lt;strong&gt;Capital&lt;/strong&gt; is investment: assistive technology, home and vehicle modifications, and specialist disability accommodation, restricted to the specific items in the plan. The last digit of a support item number tells you the purpose: 1 for Core, 2 for Capital, 3 for Capacity Building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Core Supports cost in 2026–27
&lt;/h2&gt;

&lt;p&gt;On 24 September 2026, the Minister for Disability and the NDIS made the first NDIS pricing determination under the 2026 &lt;em&gt;Securing the NDIS for Future Generations&lt;/em&gt; amendments to the NDIS Act. The NDIS Pricing Schedule 2026–27, effective the same day, sets the maximum amounts. They line up with the price guidance the NDIA published earlier in the year. For the most common Core item, assistance with self-care activities by a disability support worker at the standard intensity, the maximum amounts per hour are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Support item&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;National&lt;/th&gt;
&lt;th&gt;Remote&lt;/th&gt;
&lt;th&gt;Very remote&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;01_011_0107_1_1&lt;/td&gt;
&lt;td&gt;Weekday daytime&lt;/td&gt;
&lt;td&gt;$73.58&lt;/td&gt;
&lt;td&gt;$103.01&lt;/td&gt;
&lt;td&gt;$110.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01_015_0107_1_1&lt;/td&gt;
&lt;td&gt;Weekday evening&lt;/td&gt;
&lt;td&gt;$81.07&lt;/td&gt;
&lt;td&gt;$113.50&lt;/td&gt;
&lt;td&gt;$121.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01_002_0107_1_1&lt;/td&gt;
&lt;td&gt;Weekday night&lt;/td&gt;
&lt;td&gt;$82.57&lt;/td&gt;
&lt;td&gt;$115.60&lt;/td&gt;
&lt;td&gt;$123.86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01_013_0107_1_1&lt;/td&gt;
&lt;td&gt;Saturday&lt;/td&gt;
&lt;td&gt;$103.54&lt;/td&gt;
&lt;td&gt;$144.96&lt;/td&gt;
&lt;td&gt;$155.31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01_014_0107_1_1&lt;/td&gt;
&lt;td&gt;Sunday&lt;/td&gt;
&lt;td&gt;$133.50&lt;/td&gt;
&lt;td&gt;$186.90&lt;/td&gt;
&lt;td&gt;$200.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01_012_0107_1_1&lt;/td&gt;
&lt;td&gt;Public holiday&lt;/td&gt;
&lt;td&gt;$163.46&lt;/td&gt;
&lt;td&gt;$228.84&lt;/td&gt;
&lt;td&gt;$245.19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01_010_0107_1_1&lt;/td&gt;
&lt;td&gt;Night-time sleepover (each)&lt;/td&gt;
&lt;td&gt;$311.79&lt;/td&gt;
&lt;td&gt;$436.51&lt;/td&gt;
&lt;td&gt;$467.69&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same weekday daytime maximum, $73.58, applies to SIL (&lt;code&gt;01_801_0115_1_1&lt;/code&gt;) and to community access (&lt;code&gt;04_104_0125_6_1&lt;/code&gt;). Four rules in the schedule decide which amount applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The maximums include GST&lt;/strong&gt; and apply to NDIA-managed and plan-managed funding. Self-managed participants are not bound by them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location is where the support happens,&lt;/strong&gt; not where the participant lives: Modified Monash Model areas MM 1–5 use the national amount, MM 6 the remote amount, and MM 7 the very remote amount, with some isolated towns reclassified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crossing time bands:&lt;/strong&gt; where one worker’s support crosses into a different time of day or day of the week, the higher amount applies to the whole support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groups:&lt;/strong&gt; for a group support, each participant is charged the maximum divided by the number of people in the group.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Changes still to come in 2026–27
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SCHADS Award:&lt;/strong&gt; on 11 September 2026 the Fair Work Commission decided on Schedule E of the SCHADS Award as part of its gender-based undervaluation review. The award changes take effect on 1 December 2026, and the NDIA has said the pricing schedule will be updated later this year to reflect any required changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Differentiated pricing:&lt;/strong&gt; the government is consulting on different price limits for registered and unregistered providers. The NDIA’s 2026–27 Annual Pricing Review recommended it start on 1 January 2027.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updated guidance:&lt;/strong&gt; the NDIA has said it will shortly publish updated pricing and claiming guidance. Until then, the 2025–26 Pricing Arrangements and Price Limits (version 1.1) is the latest guide to the claiming rules below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56bjovrjsyhzxmz5k3fj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56bjovrjsyhzxmz5k3fj.png" alt="Five steps from a Core shift to a paid claim: service agreement, funding checked, shift delivered, claim built, paid and reconciled, with the risk at each step" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most rejected Core claims fail at one of these five steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claiming Core Supports correctly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Service agreements and price limits
&lt;/h3&gt;

&lt;p&gt;Agree the supports, prices and cancellation terms in writing before you start. You cannot charge more than the maximum amount for agency-managed or plan-managed funding, and the NDIA cannot pay a claim above it.&lt;/p&gt;

&lt;h3&gt;
  
  
  PACE: my providers and endorsement
&lt;/h3&gt;

&lt;p&gt;Plans in PACE do not use service bookings. Instead, participants record the providers they work with regularly as “my providers”. According to the NDIA, claims from my providers are generally paid within two to three days. A participant can still use other providers, but a provider who is not recorded may see claims held or rejected, so confirm your status with each participant at the start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Short notice cancellations
&lt;/h3&gt;

&lt;p&gt;A provider can claim up to 100% of the agreed fee for a short notice cancellation or no-show, but only when every condition is met:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disability support worker supports:&lt;/strong&gt; the participant gave less than &lt;strong&gt;seven days’&lt;/strong&gt; notice, or did not show up within a reasonable time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most other supports, such as therapy:&lt;/strong&gt; less than &lt;strong&gt;two clear business days’&lt;/strong&gt; notice.&lt;/li&gt;
&lt;li&gt;The provider could not find other billable work for the worker, and had to pay the worker for the time (unless a sole trader or partnership).&lt;/li&gt;
&lt;li&gt;The cancellation terms are in the service agreement, and the claim uses the same support item with the cancellation option.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no limit on the number of short notice cancellations a provider can claim, but the NDIA monitors cancellation claims and expects providers to find out why a participant is cancelling often. Providers may waive the fee at their discretion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provider travel and activity-based transport
&lt;/h3&gt;

&lt;p&gt;Provider travel can only be claimed for items that allow it, when the support is delivered face to face, the participant agreed to the travel costs in advance, and the worker is paid for the travel time. Activity-based transport is different: when a worker transports a participant as part of a community participation support, the worker’s time is claimed at the support’s hourly rate against the Core budget. The 2025–26 guide sets non-labour vehicle contributions of up to $0.99 a kilometre for an unmodified vehicle and up to $2.76 a kilometre for a modified vehicle or bus, plus tolls, parking and fares at cost, all agreed with the participant in advance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Core claiming mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wrong time band.&lt;/strong&gt; A shift that runs past 8pm or into Saturday is claimed at the lower rate, or at the higher rate for only part of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong location rate.&lt;/strong&gt; Remote rates claimed for a participant whose support was delivered in a national-rate area.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Funding period exhausted.&lt;/strong&gt; The plan has money; the current three-month period does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not endorsed in PACE.&lt;/strong&gt; The participant has not recorded the provider as one of their providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cancellation claimed without the conditions.&lt;/strong&gt; No cancellation terms in the service agreement, or the worker was given other billable work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rostered hours claimed instead of actual hours.&lt;/strong&gt; The claim should match what was delivered.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How Rostery handles Core Supports
&lt;/h2&gt;

&lt;p&gt;Rostery checks Core funding where it is cheapest to fix: at the shift. Each booking is checked against the participant’s funding before it is confirmed, so a shift that would overspend is held rather than discovered at claiming. The claim file is built from approved shifts and actual times, with the right support item and time band on every line, and checked against the current NDIS price limits before it is uploaded. If you want to test a single shift first, the free &lt;a href="https://rostery.com.au/tools/ndis-shift-calculator" rel="noopener noreferrer"&gt;NDIS shift price calculator&lt;/a&gt; shows which band applies and the most you can claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What are Core Supports in the NDIS?
&lt;/h3&gt;

&lt;p&gt;Core Supports fund everyday help so a participant can complete activities of daily living: assistance with daily life, transport, consumables, and support to take part in the community. They are usually the largest and most flexible part of an NDIS plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the four Core Supports categories?
&lt;/h3&gt;

&lt;p&gt;01 Assistance with Daily Life, 02 Transport, 03 Consumables, and 04 Assistance with Social, Economic and Community Participation. Plans in PACE can also show Core funding as 16 Home and Living and transport as 18 Recurring Transport.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I move Core funding to Capacity Building?
&lt;/h3&gt;

&lt;p&gt;No. Core funding is flexible across Core categories, but it cannot be moved to Capacity Building or Capital supports.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the NDIS price limit for a support worker in 2026–27?
&lt;/h3&gt;

&lt;p&gt;Under the NDIS Pricing Schedule 2026–27, effective 24 September 2026, the national maximum for standard weekday daytime assistance with self-care activities is $73.58 an hour, rising to $103.54 on Saturdays, $133.50 on Sundays and $163.46 on public holidays. Remote and very remote areas have higher limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is SIL funded from Core Supports?
&lt;/h3&gt;

&lt;p&gt;Yes. Supported independent living is funded under Assistance with Daily Life, category 01, and is usually a stated support in the plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much notice is needed to cancel a Core support?
&lt;/h3&gt;

&lt;p&gt;For supports delivered by a disability support worker, a provider can claim a short notice cancellation when the participant gave less than seven days’ notice, provided the service agreement allows it and the worker could not be given other billable work. For most other supports, the notice period is two clear business days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;On our blog: &lt;a href="https://rostery.com.au/blog/ndis-price-guide-2026-27-changes" rel="noopener noreferrer"&gt;what changed in the NDIS Price Guide 2026–27&lt;/a&gt; and &lt;a href="https://rostery.com.au/blog/ndis-bulk-payment-request-without-rejections" rel="noopener noreferrer"&gt;how to submit an NDIS bulk payment request without rejections&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Short definitions in our glossary: &lt;a href="https://rostery.com.au/glossary/core-supports" rel="noopener noreferrer"&gt;Core Supports&lt;/a&gt;, &lt;a href="https://rostery.com.au/glossary/capacity-building" rel="noopener noreferrer"&gt;Capacity Building&lt;/a&gt; and &lt;a href="https://rostery.com.au/glossary/pace" rel="noopener noreferrer"&gt;PACE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cancellations and no-shows are where many Core claims go wrong. We wrote about &lt;a href="https://medium.com/@rostery/how-ndis-providers-can-reduce-no-shows-and-claim-correctly-when-they-happen-49ead1ba2b30" rel="noopener noreferrer"&gt;how NDIS providers can reduce no-shows and claim correctly when they happen&lt;/a&gt; on Medium, and a shorter list of &lt;a href="https://rostery.blogspot.com/2026/10/fewer-ndis-no-shows-rostering-habits.html" rel="noopener noreferrer"&gt;rostering habits that mean fewer NDIS no-shows&lt;/a&gt; on Blogger.&lt;/li&gt;
&lt;li&gt;Our &lt;a href="https://rostery.com.au/tools" rel="noopener noreferrer"&gt;free NDIS and aged-care tools&lt;/a&gt;, including a price guide search and a plan budget calculator. No sign-up needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;Checked on 1 October 2026, with the price limits re-checked against the NDIS Pricing Schedule 2026–27 on 20 October 2026. Prices and rules change, so treat the agency sources below as the authority.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ndis.gov.au/providers/pricing-and-payments/pricing/pricing-arrangements" rel="noopener noreferrer"&gt;NDIS pricing arrangements: NDIS Pricing Schedule 2026–27 (effective 24 September 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ndis.gov.au/news/11701-new-price-limits-set-ndis-supports" rel="noopener noreferrer"&gt;NDIS: New price limits set for NDIS supports (24 September 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NDIS Pricing Arrangements and Price Limits 2025–26, version 1.1 (published 14 October 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ndis.gov.au/publications/quarterly-reports" rel="noopener noreferrer"&gt;NDIA Quarterly Report to disability ministers, Q4 2025–26 (Appendices, Tables D.23 and D.25)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ndis.gov.au/news/10721-changes-ndis-funding-periods" rel="noopener noreferrer"&gt;NDIS: Changes to NDIS funding periods (19 May 2025)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Rostery is NDIS and aged-care rostering software, made in Sydney. See how it works at &lt;a href="https://rostery.com.au" rel="noopener noreferrer"&gt;rostery.com.au&lt;/a&gt;. General information only, not legal or financial advice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rostery team&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ndis</category>
      <category>australia</category>
      <category>disability</category>
      <category>smallbusiness</category>
    </item>
  </channel>
</rss>
