Behio Storefront SDK
Cart & Checkout

Address Autocomplete

Google Places powered address suggestions for checkout

Autocomplete addresses during checkout — user selects country, starts typing, and gets structured suggestions (street, city, zip).

This is a paid feature. Usage is tracked per 15-minute interval and billed monthly based on request count.

How It Works

  1. Customer selects country (required)
  2. Starts typing address → debounced API call returns suggestions
  3. Customer clicks a suggestion → full structured address is filled in
  4. Fields street, city, zip, country are auto-populated

SDK Client

// Search suggestions (country is required)
const { suggestions } = await storefront.addresses.autocomplete('Vodickova 12', 'CZ');

// Get full structured address from a suggestion
const address = await storefront.addresses.getDetail(suggestions[0].placeId);
// { street: "Vodičkova 699/30", city: "Praha", zip: "11000", country: "Czechia", countryCode: "CZ", lat, lng }

React Hook

The useAddressAutocomplete hook handles debouncing, caching, and selection out of the box:

import { useAddressAutocomplete } from '@behio/storefront-sdk/react';

function AddressInput() {
  const {
    query,
    setQuery,
    suggestions,
    isLoading,
    select,
    selected,
    isSelecting,
    clear,
  } = useAddressAutocomplete({
    country: 'CZ',       // required — ISO 3166-1 alpha-2
    debounce: 300,        // ms (default: 300)
    minChars: 3,          // min characters before searching (default: 3)
  });

  return (
    <div>
      <input
        value={query}
        onChange={e => setQuery(e.target.value)}
        placeholder="Start typing your address..."
      />

      {isLoading && <div>Searching...</div>}

      {suggestions.length > 0 && (
        <ul>
          {suggestions.map(s => (
            <li key={s.placeId} onClick={() => select(s.placeId)}>
              {s.description}
            </li>
          ))}
        </ul>
      )}

      {selected && (
        <div>
          <p>Street: {selected.street}</p>
          <p>City: {selected.city}</p>
          <p>ZIP: {selected.zip}</p>
          <p>Country: {selected.country}</p>
        </div>
      )}
    </div>
  );
}

Checkout Form Example

Combine with a country selector for a complete checkout address form:

import { useState } from 'react';
import { useAddressAutocomplete } from '@behio/storefront-sdk/react';

function CheckoutAddressForm({ onComplete }) {
  const [country, setCountry] = useState('CZ');
  const { query, setQuery, suggestions, select, selected } = useAddressAutocomplete({
    country,
    debounce: 300,
  });

  // When user selects a suggestion, fill all fields
  const handleSelect = async (placeId: string) => {
    const address = await select(placeId);
    onComplete({
      street: address.street,
      city: address.city,
      zip: address.zip,
      country: address.countryCode,
    });
  };

  return (
    <div>
      <select value={country} onChange={e => setCountry(e.target.value)}>
        <option value="CZ">Czech Republic</option>
        <option value="SK">Slovakia</option>
        <option value="DE">Germany</option>
        <option value="AT">Austria</option>
        <option value="PL">Poland</option>
      </select>

      <input
        value={query}
        onChange={e => setQuery(e.target.value)}
        placeholder="Street address"
      />

      {suggestions.map(s => (
        <div key={s.placeId} onClick={() => handleSelect(s.placeId)}>
          {s.description}
        </div>
      ))}
    </div>
  );
}

Hook Options

OptionTypeDefaultDescription
countrystringrequiredISO 3166-1 alpha-2 country code
debouncenumber300Debounce delay in ms
minCharsnumber3Min characters before searching
enabledbooleantrueDisable the hook

Hook Return

PropertyTypeDescription
querystringCurrent input value
setQuery(value: string) => voidInput onChange handler
suggestionsAddressSuggestion[]Google Places suggestions
isLoadingbooleanFetching suggestions
select(placeId: string) => Promise<AddressDetail>Select a suggestion
selectedAddressDetail | nullResolved structured address
isSelectingbooleanResolving place detail
clear() => voidReset everything

Address Detail Fields

After calling select():

FieldTypeExample
streetstring"Vodičkova 699/30"
streetNumberstring"699/30"
citystring"Praha"
zipstring"11000"
countrystring"Czechia"
countryCodestring"CZ"
formattedAddressstring"Vodičkova 699/30, 110 00 Praha 1, Czechia"
latnumber50.0815
lngnumber14.4243

On this page