Migration guide

A Google Places alternative for Australian addresses

Address autocomplete touches one field on your form, so this is a small job. Here is what changes, what you give up, and the field mapping.

Reasons

Why teams switch

Keystrokes leave before submit does

Autocomplete sends what your customer types as they type it. That happens before consent, before they press submit and before your own validation sees it. If you have told a customer, an auditor or a tender that Australian personal information stays onshore, an offshore autocomplete breaks that promise on every address field.

The session discount has a condition

Google’s session-pricing documentation says a session is billed as a session when it ends with a Place Details or Address Validation call. A session that is abandoned reverts to per-request billing for every autocomplete request in it. Checkouts produce many abandoned sessions.

Australian dollars, one GST

We price in AUD with GST included, add the 10% once, and issue a tax invoice with our ABN on it. There is no exchange-rate drift between the estimate and the statement, and your bookkeeper can claim the credit from the invoice.

Nothing is billed for a keystroke

One address search is one lookup, however many characters were typed. An abandoned search costs nothing. $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:

// before: Google Maps JS + Places
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:

// after: npm install @wattleaddr/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}${a.components.street_suffix ? ' ' + a.components.street_suffix : ''}`,
    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

Read this before you start. The awkward row is route. Google gives you “Collins Street” as one string. G-NAF holds the name and the type separately, so we return them separately. The type is the full word, not an abbreviation.

Google PlacesWattleAddrWatch out for
place_ididStore it, but store the components too. G-NAF ids can change between quarterly releases.
formatted_addressformattedDisplay string. Ours is the canonical G-NAF form.
subpremiseflat_number / level_numberSplit in two. Google folds a unit and a level into one component; we do not.
street_numberstreet_numberText, not a number. 12A and 12-14 are real.
routestreet_name + street_type (+ street_suffix)The main change. “Collins Street” arrives as two fields, plus street_suffix on streets that have one (the West in Station Street West), and street_type is G-NAF’s full word: Street, never St.
localitylocalitySuburb. Title-cased.
administrative_area_level_1 (short_name)stateOne of eight values, already abbreviated. No need to map long names.
postal_codepostcodeA string. Darwin is 0800, and an integer column turns that into 800.
geometry.location.lat / .lnggeo.lat / geo.lngSame meaning. Null when the record is not geocoded.

What you give up

Read this before you commit. Two of these cannot be fixed 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 a postal_address_unsupported notice instead of an empty dropdown, and do not bill for the query. Your form can then 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 with no offshore edge: Sydney primary, Melbourne standby.
  • Billing in AUD with GST included, per completed address search, with abandoned searches free.
  • Address components already split into the fields you store.
  • A verdict and a per-field status on verify, 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 hosted in Australia 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. Data residency: autocomplete sends a user’s keystrokes to the provider before they press submit, so an offshore autocomplete can break a residency commitment made to a customer, an auditor or a tender. Billing: Google bills an autocomplete session as a session only when it ends with a Place Details or Address Validation call. An abandoned session reverts to per-request billing on every keystroke, and checkouts produce a lot of abandoned sessions. Currency: a USD rate card brings exchange-rate movement and foreign-currency 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, and repoint your key. The mapping changes because WattleAddr returns street name and street type as separate fields, where Google returns a combined route. There is a published OpenAPI 3.1 specification, so you can generate a typed client before you sign up. The free tier lets you build it without a card.

What do I lose by switching from Google Places to WattleAddr?

Coverage outside Australia, and places that are not addresses. WattleAddr returns Australian physical addresses from G-NAF only. It returns no international addresses, businesses, landmarks or points of interest. It returns no PO Boxes, because G-NAF holds physical addresses only. PO Boxes are in Australia Post’s separately licensed PAF. For a PO Box we return a postal_address_unsupported notice instead of an empty dropdown, and do not bill for the query. If your form needs 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 AddressAutocomplete component that follows the ARIA combobox pattern and works from the keyboard, 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.

Try it on the free tier

5,000 lookups a month, ongoing, no card. Run it beside your existing field and compare the two before you switch.