An Australian address column is usually three fields, and almost every check people run treats them one at a time: is the postcode four digits, is the state one of eight abbreviations, is the suburb non-empty. All three can pass while the address does not exist. The combination is what carries the meaning, and checking it needs the actual list of Australian localities rather than a rule of thumb.
1. The check that matters
A suburb, a state and a postcode are three claims about the same place. Validating them separately answers three questions nobody asked. The question worth asking is whether the three agree:
| Suburb | State | Postcode | Verdict |
|---|---|---|---|
| Brisbane | QLD | 4000 | Correct |
| Sydney | QLD | 4000 | Sydney is not in Queensland |
| Brisbane | NSW | 4000 | 4000 is not a NSW postcode |
| Parramatta | NSW | 2150 | Correct |
Every value in the two bad rows is individually valid. Only the combination is wrong.
The official locality for 4000 is Brisbane City, not Brisbane — the first row is still a correct address, and section 5 covers why the difference matters anyway.
Both bad rows would pass a format check without complaint. "Sydney" is a real suburb, "QLD" is a real state, and "4000" is a real postcode. Nothing short of a lookup against the real list of Australian addresses will catch them, which is why this check tends to get skipped and why bad address data survives so long in a CRM.
2. A postcode does not identify a suburb
The most common shortcut is a postcode-to-suburb lookup table, on the assumption that a postcode names one place. Postcode 2000 covers six separate localities:
| Postcode | State | Localities it covers |
|---|---|---|
| 2000 | NSW | Sydney, Haymarket, Millers Point, The Rocks, Barangaroo, Dawes Point |
| 4000 | QLD | Brisbane City, Spring Hill, Petrie Terrace |
| 2611 | ACT | 17 localities |
| 0872 | NT | 46 localities |
Counts taken from G-NAF, the national address file, and are the localities within the state named — 0872 and 2611 both cross a state border as well (section 4).
So a lookup that maps a postcode to a single suburb will overwrite Haymarket with Sydney, or Spring Hill with Brisbane City, and call it a correction. If you are going to fill a blank suburb from a postcode, the honest version of that rule is that it only works where the postcode covers exactly one locality, and you have to check which ones those are.
3. A suburb name does not identify a state
The reverse shortcut fails harder. Of the 14,034 distinct locality names in the national address file, 880 are used in more than one state. Kingston is five different places:
| Suburb | State | Postcode |
|---|---|---|
| Kingston | ACT | 2604 |
| Kingston | QLD | 4114 |
| Kingston | TAS | 7050 |
| Kingston | VIC | 3364 |
| Kingston | WA | 6256 |
Springfield and Waterloo each appear in six states.
This is the case that quietly corrupts a mailing list. A row that says Kingston with no state, or with the wrong state, cannot be repaired from the suburb name — there is no fact of the matter to recover. It has to be flagged and resolved against the source system, which is unwelcome but is the only correct answer.
4. The rule most people are confident about, and it is wrong
Almost everyone believes the first digit of a postcode gives you the state: 2 is NSW, 3 is Victoria, 4 is Queensland. It is right often enough to feel like a rule, and 15 postcodes cross a state border anyway:
| Postcode | States it spans |
|---|---|
| 0872 | NT, SA, WA |
| 2406 | NSW, QLD |
| 2611 | ACT, NSW |
| 2620 | ACT, NSW |
| 3644 | NSW, VIC |
| 3691 | NSW, VIC |
Six of the fifteen. Most sit on the ACT border or along the Murray.
The practical consequence is not that you will miss errors — it is that you will manufacture them. A validation rule that derives state from postcode reports every genuine address in these ranges as broken, somebody spends an afternoon "fixing" correct data, and the rule gets switched off. A check that produces confident false positives is worse than no check, because it costs trust as well as time.
5. The official name is not always the name people use
Address data records the locality, which is not always what a person would write. The Brisbane CBD is Brisbane City in the national file, and 22,559 addresses carry that name; "Brisbane" on its own is what almost everybody types. The same pattern turns up wherever a council name, a suburb name and a colloquial name disagree.
This matters when you compare two lists. "Brisbane" and "Brisbane City" are the same place and different strings, so an exact-match join drops the row, a deduplication pass treats one customer as two, and a validation rule flags a correct address. Any comparison needs to resolve the name against the real locality list first, rather than trusting the text as written.
6. Checking a column by hand
You need a reference list of valid suburb, state and postcode combinations — Australia Post publishes one, and G-NAF is the authoritative source. Build a key in both your file and the reference, then match on the key rather than on any single field:
=UPPER(TRIM(B2))&"|"&UPPER(TRIM(C2))&"|"&TEXT(D2,"0000")
Then check each row's key against the reference:
=IF(COUNTIF(Reference!$A:$A,E2)>0,"ok","check")
Three details decide whether this works. Normalize case and whitespace on both sides before joining, or trailing spaces will produce failures that look like data errors. Use TEXT(D2,"0000") for the postcode, because a spreadsheet stores 0872 as the number 872 and it will never match. And keep the result as a flag column rather than overwriting anything — the point of the check is to find rows for a person to look at, not to guess replacements.
What this will not do is tell you which of the three fields is wrong. A failed key means the combination does not exist; deciding whether the suburb, the state or the postcode was mistyped needs either more context or the customer.
Common questions
Is a four-digit postcode check worth anything? It catches truncation, which is the single most common postcode error — 0872 stored as 872 by a spreadsheet that read it as a number. It tells you nothing about whether the address exists.
Which is more reliable, the suburb or the postcode? Neither on its own. A postcode is more precisely defined but covers several suburbs; a suburb name is more meaningful to a person but is ambiguous across states. That is the reason for checking the combination rather than picking a winner.
Can I just fill the state in from the postcode? For most postcodes yes, and for the fifteen border cases you will be wrong some of the time with no way of knowing which rows. If you do it, exclude those postcodes and flag them instead.
What about PO boxes? Post office boxes use their own postcode ranges and will not match a street-address reference list. Separate them before validating, or every one of them will be reported as an error.
Doing this by hand means sourcing a reference list, keeping it current, and rebuilding the join every time a new export arrives — for a check whose whole value is that it runs on every row.
DataMadeClean validates suburb, state and postcode together against G-NAF, the national address file, as a Pro feature. A combination that does not exist is flagged for review rather than rewritten: "Sydney, QLD, 4000" comes back with a note that the locality could not be confirmed against that state and postcode, and the row is left as it is. A misspelling close enough to be unambiguous is corrected and listed as a change — "Brisban, QLD, 4000" becomes Brisbane City — while anything the data cannot settle stays flagged for a person. See how it validates Australian addresses →