A Google Places alternative for Australian addresses
Address autocomplete touches exactly one field on your form, which is why this is a smaller job than it feels like. Here is what changes, what you give up, and the mapping that will actually cost you the fifteen minutes.
Three reasons, and only one of them is patriotic
Keystrokes leave before submit does
Autocomplete transmits what your customer is typing while they type it — before consent, before a submit button, before your own validation ever sees it. If you have told a customer, an auditor or a tender that Australian personal information stays onshore, an offshore autocomplete quietly made that untrue on every address field you own.
The session discount has a condition
Google’s own session-pricing documentation is explicit: a session is billed as a session when it is terminated by a Place Details or Address Validation call. A session that is abandoned reverts to per-request billing across every autocomplete request in it. A checkout produces abandoned sessions by the thousand.
Australian dollars, one GST
We price in AUD with GST included, add the 10% exactly once, and issue a tax invoice with our ABN on it. No exchange-rate drift between the estimate and the statement, and nothing your bookkeeper has to reconstruct to claim the credit.
Nothing is billed for a keystroke
One address search is one lookup, always, however many characters were typed — and an abandoned search costs nothing at all. $0 for 5,000 a month, $53.90 for 50,000, $163.90 for 250,000, GST included. See pricing.
The code you are replacing
The Places binding, with its loader and its component walk:
const ac = new google.maps.places.Autocomplete(input, {
componentRestrictions: { country: 'au' },
fields: ['address_components', 'geometry'],
});
ac.addListener('place_changed', () => {
const p = ac.getPlace();
// then walk address_components looking for types…
});
And the replacement, in React:
import { AddressAutocomplete } from '@wattleaddr/react';
<AddressAutocomplete
apiKey="waddr_pk_live_…"
onSelect={(a) => setAddress({
line1: `${a.components.street_number} ${a.components.street_name} ${a.components.street_type}`,
suburb: a.components.locality,
state: a.components.state,
postcode: a.components.postcode, // keep it a string
})}
/>
Not on React? There is a one-line <script> widget with no build step, a headless client in @wattleaddr/js that also runs on Node 18+, and a public OpenAPI 3.1 spec you can generate a typed client from in any language. All three are in the docs.
The field mapping
This is the part worth reading before you start. The only genuinely awkward row is route: Google gives you “Collins Street” as one string, and G-NAF holds the name and the type separately — so we return them separately, with the type as the full word rather than an abbreviation.
| Google Places | WattleAddr | Watch out for |
|---|---|---|
place_id | id | Store it, but store the components too — G-NAF ids can change between quarterly releases. |
formatted_address | formatted | Display string. Ours is the canonical G-NAF form. |
subpremise | flat_number / level_number | Split in two. Google folds a unit and a level into one component; we do not. |
street_number | street_number | Text, not a number — 12A and 12-14 are real. |
route | street_name + street_type | The one real gotcha. “Collins Street” arrives as two fields, and street_type is G-NAF’s full word — Street, never St. |
locality | locality | Suburb. Title-cased. |
administrative_area_level_1 (short_name) | state | One of eight values, already abbreviated. No need to map long names. |
postal_code | postcode | A string. Darwin is 0800, and an integer column turns that into 800. |
geometry.location.lat / .lng | geo.lat / geo.lng | Same meaning. Null when the record is not geocoded. |
What you give up
Read this before you commit, because two of them are not recoverable by configuration.
- Everything outside Australia. We return Australian addresses only. If your form takes overseas addresses, keep a global provider on that path.
- Businesses, landmarks and points of interest. G-NAF is a register of physical addresses. “Sydney Opera House” will not resolve; “Bennelong Point” will.
- PO Boxes. They are not in G-NAF, so no G-NAF provider can match them. We return an explicit
postal_address_unsupportednotice rather than an empty dropdown, and do not bill for the query, so your form can offer a separate postal field. - Maps, routing and the rest of the platform. If you use Places because it came with the map you already had, switching the address field alone may not be worth it to you.
What you gain
- A request path that is Australian end to end — Sydney primary, Australian backup, no offshore edge.
- Billing in AUD with GST included, per completed address search, with abandoned searches free.
- Address components already split into the fields you were going to store anyway.
- A
verdictand a per-field status onverify, so a checkout can re-prompt for the one field that disagreed. - A data-residency attestation and DPA you can hand to procurement without a call, and an SLA on Enterprise.
Migration questions
What is the best Australian alternative to Google Places Autocomplete?
For Australian addresses specifically, WattleAddr: an address autocomplete, verification and geocoding API served entirely from Australian infrastructure on the open G-NAF dataset, billed in Australian dollars per completed address search. It replaces Places Autocomplete plus Place Details for the address field on a form. It does not replace Places for businesses, landmarks or points of interest, and it does not return addresses outside Australia.
Why do Australian companies move address autocomplete off Google Places?
Three reasons, in roughly this order. Data residency: autocomplete transmits an end user’s raw keystrokes to the provider before they press submit, so an offshore autocomplete undermines a residency commitment already made to a customer, an auditor or a tender. Billing: Google bills an autocomplete session as a session only when that session is terminated by a Place Details or Address Validation call, and an abandoned session reverts to per-request billing on every keystroke — which is exactly the traffic a checkout generates most of. Currency: a USD rate card carries exchange-rate movement and foreign-transaction handling into an Australian P&L.
How long does it take to migrate from Google Places to WattleAddr?
For a single address field, typically under an hour. Address autocomplete touches one input: you swap the script tag or npm package, change the field mapping because WattleAddr returns street name and street type as separate fields where Google returns a combined route, and repoint your key. There is a published OpenAPI 3.1 specification so you can generate a typed client before you sign up, and the free tier lets you build the whole thing without a card.
What do I lose by switching from Google Places to WattleAddr?
Coverage outside Australia, and non-address places. WattleAddr returns Australian physical addresses from G-NAF only — no international addresses, no businesses, no landmarks, no points of interest, and no PO Boxes, because G-NAF does not contain them — those live in Australia Post’s separately licensed PAF. For PO Boxes we return an explicit postal_address_unsupported notice rather than an empty dropdown, and do not bill for the query. If your form needs to resolve a business name or an overseas address, keep a global provider for that path or run both.
Does WattleAddr work with React and Next.js?
Yes. @wattleaddr/react provides a useAddressAutocomplete hook and an accessible AddressAutocomplete component, and @wattleaddr/js is a zero-dependency client that runs in the browser and in Node 18+. Both are official, typed and MIT-licensed. There is also a single script tag widget with no build step, and the plain REST API for anything else.
Build it on the free tier first
Five thousand lookups a month, ongoing, no card. Wire it up beside your existing field and compare the two before you switch anything.