Building for the AU Market: GST, ABN Validation and Auspost Integration
The Australian plumbing problem
Most modern web platforms are built first for the US, then the UK and EU, and only later adapted for Australia. That means a lot of sensible Australian requirements (validating an ABN, handling GST-free food categories, rating a parcel to a PO Box in regional Victoria) are either missing, implemented badly, or require an add-on plugin whose author stopped maintaining it in 2022.
We end up writing this layer on almost every AU-focused build. This post is the practical version of what we actually ship. ABR integration for ABN and ACN checks, GST calculation covering the edge cases that matter, and Australia Post integration for live rates and tracking.
ABN validation with the ABR API
If you run a B2B site, have a wholesale tier, or need to conditionally remove GST for overseas customers, you need to validate Australian Business Numbers server-side. Do not rely on client-side checksum validation alone. It tells you the number is structurally plausible, not that it belongs to an active business.
Get an ABR API GUID
The Australian Business Register exposes a free JSON web service. Register for an API GUID at the ABR website. It takes minutes and is free for all commercial use within reasonable rate limits.
The two endpoints that matter
- ABN details by ABN: use when you already have the number
- ABN search by name: use when the user does not know their ABN and is willing to type a business name
Call the ABN details endpoint server-side. The response tells you the entity name, the entity type, whether the ABN is currently active, whether the business is registered for GST, and the trading names associated with the number. All of those fields matter.
What to actually check
Minimum validation for a B2B registration or checkout:
- ABN is structurally valid using the 11-digit checksum
- ABR confirms the ABN is currently active
- The entity name on the ABN either matches or is reasonably consistent with what the user typed
- If the transaction is B2B, record whether the business is GST-registered
Store the ABN, entity name and GST-registration status on the customer record. Do not re-query on every page load. ABR data is stable enough that a 24-hour cache is fine.
ACN for company-only flows
If you are specifically onboarding registered companies, also accept the ACN (Australian Company Number). ASIC exposes a lookup, or you can derive the ABN from an ACN using the deterministic prefix rule. Most B2B flows can stick to ABN and cover 95 per cent of cases.
GST calculation, the edge cases
The headline is simple. 10 per cent on most goods and services sold in Australia. The edge cases are where things break.
GST-free categories
Basic food, most health services, most education services and specified medical devices are GST-free. If you sell any of these, your product model needs a GST treatment field, not a global tax rate. We use an enum (standard, gst_free, input_taxed) on every sellable item, and the tax engine reads that field rather than applying a blanket percentage.
This particularly trips up food retailers. A Milo tin from Coles is GST-free. A Milo drink sold hot is standard-rated. Bread is GST-free, but a bread roll sold with butter at a deli is standard-rated. Get the classification right up front. It is painful to refactor later.
Overseas customers
GST does not apply to goods exported to overseas customers within 60 days. For digital services sold to overseas consumers, GST does not apply, but the rules around the "Netflix tax" for non-resident suppliers add complexity if you are a global seller.
The practical rule for an AU merchant selling physical goods: if the shipping address is outside Australia, do not charge GST on goods or freight, and keep documentation of the export for your BAS. Your invoice template should clearly show the GST-free treatment and reason.
B2B reverse-charge and low-value imports
If you import goods under AUD 1,000 to Australian consumers, you are required to charge GST at the point of sale under the Low Value Imported Goods rules. Your checkout logic needs to know whether you are the importer of record for that transaction.
The GST-inclusive versus GST-exclusive price flag
Most Australian consumer pricing is displayed GST-inclusive. B2B pricing is GST-exclusive. Your product model should store prices in a canonical form (we use GST-exclusive as the source of truth) and render either based on the audience. Get this decision clear at database design time. It is cheap to decide and expensive to migrate.
Australia Post integration
If you ship physical goods in Australia, Australia Post is almost always in the mix, even if it is not your primary carrier. They publish two API families worth knowing.
DeliveryChoices for rates and transit
DeliveryChoices is the rate-shopping API. Given an origin postcode, a destination postcode, and parcel dimensions and weight, it returns the available services, prices and estimated transit times.
Integrate it at the cart or checkout stage so customers see accurate shipping rates rather than flat rates that are either too generous or too stingy. The pattern:
- Collect dimensions and weight on every product (mandatory field, no optionals)
- On cart calculation, aggregate to a parcel estimate
- Call DeliveryChoices with the origin postcode and destination
- Surface Express Post, Parcel Post, and where eligible, Same Day and International services
- Fall back to a flat rate if the API is unreachable
Cache responses for five minutes against the origin-destination-weight tuple. The API is fast but not free, and carts get recalculated frequently.
ShipmentsAPI for booking and tracking
ShipmentsAPI handles the post-purchase side. Printing labels, booking collection and retrieving tracking. A mature integration uses webhooks to push tracking updates back into your order system and into the customer's transactional emails.
PO Box, Parcel Locker and regional quirks
Validate addresses against AusPost's address validation endpoint or a third-party address autocomplete. Watch for three specific cases:
- PO Box addresses do not accept all services. Express Post works, most international services do not.
- Parcel Lockers are a specific address format and customers frequently mistype them.
- Regional Western Australia and the Northern Territory have transit times that can surprise customers used to metro delivery. Show realistic estimates, not optimistic ones.
Display expected delivery dates rather than transit days. "Arrives by Friday 17 November" converts better than "3-5 business days."
Putting it together on a real build
On a typical AU-first checkout we ship, the integration layer looks like this. Product-level GST treatment stored on every SKU. ABN field on B2B registration with live ABR validation and a flag indicating whether GST invoices are required. Cart calculation that reads GST treatment per line, applies export rules based on shipping address, and displays both inclusive and exclusive totals where appropriate. Shipping step that calls DeliveryChoices for rates, respects PO Box and Parcel Locker rules, and falls back gracefully on timeout. Post-purchase flow that books the label via ShipmentsAPI and pushes tracking updates through webhooks.
None of these are individually difficult. The trap is that global platforms treat them as optional add-ons rather than core requirements, and gaps compound across the checkout.
If you are building or re-platforming for the Australian market and want the AU plumbing done properly from day one, get in touch and we will help you scope it correctly.



