RosterElf Logo
Start trial
FREE TOOL

Get Australian award pay rates in Google Sheets

Paste one short script into your sheet and use =ROSTERELF_RATE("Hospitality","Level 2","casual") to pull minimum and casual award rates into any cell. It reads our open award-rates dataset, so figures stay current with each 1 July update.

Free custom function No add-on to install Auto-updates each 1 July

This tool returns indicative minimum award rates for general information only, drawn from the current Fair Work Ombudsman pay guides. RosterElf is not affiliated with, or endorsed by, the Fair Work Ombudsman. Rates depend on award coverage, classification, enterprise agreements and individual circumstances, and change periodically — do not rely on this tool for payroll or payment decisions, and always verify with the official Fair Work pay guide before setting or paying wages. This is not legal, payroll, tax or financial advice, and RosterElf Pty Ltd accepts no liability for any loss arising from reliance on it. It does not constitute legal, HR, or professional advice and should not be relied on as a substitute for advice specific to your business, workforce, or circumstances.

How to add award rates to Google Sheets

A one-time, four-step setup. No add-on to install — you paste a short script that adds a custom =ROSTERELF_RATE() function to your sheet.

  1. 1 In your Google Sheet, open Extensions → Apps Script. This opens the script editor bound to that specific sheet (custom functions only work in the sheet their script is attached to).
    Google Sheets menu with Extensions then Apps Script selected
  2. 2 Select everything in the editor (Cmd/Ctrl + A), delete it, paste the script below, then click Save (the disk icon).
    Apps Script editor showing the pasted ROSTERELF_RATE function and the Save button
  3. 3 Pick ROSTERELF_RATE in the function dropdown and click Run once to authorise it (Review permissions → Advanced → Allow). It logs a "provide an award" error — that is expected; you are only granting the one-time permission to fetch data.
    Apps Script Run button and the authorisation dialog with an Allow button
  4. 4 Back in the sheet, type =ROSTERELF_RATE("Hospitality","Level 2","casual") in any cell. You should get a dollar figure straight away.
    A spreadsheet cell using the ROSTERELF_RATE formula and returning a rate

The script

/**
 * RosterElf award rates - Google Sheets add-on.
 * Reads the public dataset published by rosterelf.com (single source of truth =
 * the award-rates data layer), so rates stay current with the 1-July refresh.
 */
var DATASET_URL = 'https://www.rosterelf.com/data/award-rates/index.json'
var CACHE_KEY = 'rosterelf_award_rates_v1'
var CACHE_TTL = 21600 // 6 hours

function fetchDataset_() {
  var cache = CacheService.getScriptCache()
  var cached = cache.get(CACHE_KEY)
  if (cached) {
    try {
      return JSON.parse(Utilities.ungzip(Utilities.newBlob(Utilities.base64Decode(cached), 'application/x-gzip')).getDataAsString())
    } catch (e) {
      // Unreadable cache entry - fall through and refetch.
    }
  }
  // The WAF blocks requests missing a User-Agent or Accept header; UrlFetchApp
  // omits Accept by default, so set both explicitly.
  var res = UrlFetchApp.fetch(DATASET_URL, {
    muteHttpExceptions: true,
    headers: { 'User-Agent': 'RosterElfSheets/1.0 (+https://www.rosterelf.com)', Accept: 'application/json' },
  })
  if (res.getResponseCode() !== 200) throw new Error('Could not load RosterElf award data (HTTP ' + res.getResponseCode() + ')')
  var text = res.getContentText()
  var data = JSON.parse(text)
  // CacheService caps a value at 100 KB and the dataset is ~155 KB, so gzip it
  // (compresses to ~25 KB). Caching is best-effort - never let it break the lookup.
  try {
    var packed = Utilities.base64Encode(Utilities.gzip(Utilities.newBlob(text)).getBytes())
    if (packed.length < 100000) cache.put(CACHE_KEY, packed, CACHE_TTL)
  } catch (e) {
    // Ignore cache write failures.
  }
  return data
}

function norm_(s) {
  return String(s || '')
    .toLowerCase()
    .replace(/[^a-z0-9]+/g, ' ')
    .trim()
}

function findAward_(data, award) {
  var q = norm_(award)
  return data.awards.filter(function (x) {
    return norm_(x.slug) === q || norm_(x.name).indexOf(q) >= 0 || (x.shortLabel && norm_(x.shortLabel).indexOf(q) >= 0) || norm_(x.code) === q
  })[0]
}

/**
 * Returns the 2026/27 minimum hourly rate for an Australian modern award classification.
 * Indicative only - verify against the Fair Work pay guide before paying wages.
 *
 * @param {string} award  Award name, short name, slug or code (e.g. Hospitality or MA000009).
 * @param {string} level  Classification label (e.g. Level 2).
 * @param {string} type   casual or permanent (default: permanent).
 * @return The hourly rate.
 * @customfunction
 */
function ROSTERELF_RATE(award, level, type) {
  if (!award || !level) throw new Error('Provide an award and a classification level.')
  var data = fetchDataset_()
  var a = findAward_(data, award)
  if (!a) throw new Error('Award not found: ' + award)
  var q = norm_(level)
  var c = a.classifications.filter(function (x) {
    return norm_(x.label) === q || norm_(x.id) === q
  })[0]
  if (!c) {
    var labels = a.classifications
      .map(function (x) {
        return x.label
      })
      .join(', ')
    throw new Error('Classification not found: ' + level + '. Options: ' + labels)
  }
  var casual =
    String(type || '')
      .toLowerCase()
      .indexOf('cas') >= 0
  return casual ? c.hourlyCasual : c.hourlyPermanent
}

function onOpen() {
  SpreadsheetApp.getUi().createMenu('RosterElf').addItem('How to use', 'showAbout_').addToUi()
}

function showAbout_() {
  var lines = ['Insert a 2026/27 award rate with the custom function:', '', '=ROSTERELF_RATE(award, level, type)', '', 'Award = name, short name, slug or MA code. Type = casual or permanent.', '', 'Indicative minimums only - verify with Fair Work. Data: rosterelf.com/award-rates-dataset']
  SpreadsheetApp.getUi().alert('RosterElf award rates', lines.join('\n'), SpreadsheetApp.getUi().ButtonSet.OK)
}

Example formulas

Pass the award as a name, short name, slug or Fair Work MA code, the classification level, and "casual" or "permanent" (permanent if omitted). Covered awards match the award rate guides.

=ROSTERELF_RATE("Hospitality","Level 2","casual")

Casual hourly rate for a Hospitality Award Level 2 employee.

=ROSTERELF_RATE("Retail","Level 1","permanent")

Permanent (base) hourly rate for General Retail Award Level 1.

=ROSTERELF_RATE("MA000009","Level 3")

Look up by Fair Work award code; type defaults to permanent.

=ROSTERELF_RATE("Fast Food","Level 1","casual")

Casual base rate for a Fast Food Award Level 1 team member.

Formula recipes for pay models

Combine the function with ordinary spreadsheet formulas to build rosters, quotes and pay estimates. Put your inputs in columns and fill down.

Reference cells instead of hard-coding

=ROSTERELF_RATE(A2, B2, C2)

Put the award in A2, the level in B2 and casual/permanent in C2, then fill the formula down a column so each row reads its own inputs.

Cost a shift (rate × hours)

=ROSTERELF_RATE(A2, B2, C2) * D2

Multiply the returned hourly rate by hours worked in D2 to get the base shift cost. Add penalties or loadings in the next column.

Compare casual vs permanent

=ROSTERELF_RATE(A2,B2,"casual") - ROSTERELF_RATE(A2,B2,"permanent")

Show the casual loading in dollars per hour for the same classification — handy for weighing casual vs part-time.

Add super on top (12%)

=ROSTERELF_RATE(A2,B2,C2) * 1.12

Approximate the hourly cost including 12% superannuation. For a full on-cost breakdown use the payroll cost calculator.

Round to cents for display

=TEXT(ROSTERELF_RATE(A2,B2,C2), "$0.00")

Wrap the result in TEXT to format it as currency in reports and quotes.

Guard against typos

=IFERROR(ROSTERELF_RATE(A2,B2,C2), "Check award / level")

IFERROR catches an unknown award or classification so a bad input shows a friendly note instead of an error.

Need penalty, overtime or allowance rates too? Those live in the full award rate guides and the open dataset — or let award interpretation apply them to shifts automatically.

How it works

  • The function reads our free award-rates dataset (JSON) over the web and caches it for a few hours.
  • Rates refresh automatically each 1 July after the Fair Work Commission wage review — no need to re-paste the script.
  • It returns the minimum permanent or casual hourly rate by classification. Figures match our award pay rate checker.
  • Nothing you type is sent to RosterElf; the sheet only fetches the public rate file.

Troubleshooting

  • #NAME? — the script isn't in this sheet. Add it via Extensions → Apps Script in the sheet you're using.
  • Permission error — run the function once from the editor and accept the prompt (step 3).
  • "Classification not found" — the error lists the valid levels for that award; copy one exactly.
  • Prefer Excel? The same data is available as JSON and CSV on the dataset page for Power Query.

Indicative minimums only — always confirm against the current Fair Work pay guide before paying wages. Advising clients? See the accountant resource hub and partner program.

Apply these rates to your roster automatically

RosterElf's award interpretation applies the right base, casual, penalty and overtime rates to every shift, then sends payroll-ready totals to Xero and MYOB — no formulas to maintain.

Start free trial See See award interpretation
FAQ

Award rates in Google Sheets FAQs

  • No. You paste a short script into your own sheet once (Extensions → Apps Script). It reads our free open award-rates dataset over the web, so there is no add-on to install and the rates stay current with each 1 July update.

  • Open Extensions → Apps Script in your sheet, paste the script above, save, run it once to authorise, then type =ROSTERELF_RATE("Hospitality","Level 2","casual") in a cell. The five-step setup is shown above.

  • The award name, short name, slug or Fair Work MA code — for example “Hospitality”, “General Retail” or “MA000009”. The third argument is “casual” or “permanent” (permanent if omitted).

  • All 30 awards in our open dataset, with minimum (permanent) and casual hourly rates by classification level. For penalties, juniors, apprentices and allowances, see the full award rate guides.