Case Study — Tourism & Arts Trail
22 venues across the D'Aguilar Range and surrounds — art studios, sculpture gardens, horse riding, ceramics, accommodation, and bush walks — all connected through a WordPress-backed REST API feeding a Flutter PWA and a curated itinerary system.
Overview
Tawny Trails is a self-guided arts and tourism trail covering the D'Aguilar Range, the Dayboro valley, and the surrounding hinterland northwest of Brisbane. Twenty-two venues — galleries, studios, sculpture parks, horse trail operators, accommodation, and bush walking areas — connected through a single platform that visitors can use on a phone without needing to install anything.
The brief was not just a directory with a map. It needed themed itineraries so a day-visitor from Brisbane could plan a route without spending twenty minutes reading. It needed opening hours that were actually current. It needed to work as a Flutter app on the phone — not a website that looks like it was designed for a desktop. And it needed a membership layer so venue operators could manage their own listings.
"The gap between 'a WordPress site with a map plugin' and 'an actual trail platform' is a custom REST API, a Flutter app, and a decent itinerary system. That is what we built."
The Trail
Each venue is a custom post type (tt_venue) with ACF fields for opening hours, GPS coordinates, category, accessibility notes, and contact details. The Flutter app reads all of it from the REST API — no hardcoded content in the app itself.
Technical Architecture
The TawnyTrails API plugin (tt-api) is the backbone. It exposes venue data, itineraries, and opening-hour logic via a custom REST API. The Flutter app has no hardcoded content — everything it displays is fetched live from WordPress.
A custom WordPress plugin built specifically for this project. Handles venue data storage, custom field management, the REST API layer, and data caching to keep the Flutter app fast without hitting the database on every request.
A Flutter Web app compiled to JavaScript and deployed as static files. 6.9 MB, runs on Android, iPhone (via Safari Add to Home Screen), and desktop. Reads venues and itineraries from the REST API on load. No App Store account required for iOS users.
Every venue has GPS coordinates stored as ACF fields. The Flutter app renders an interactive map from the API data. Visitors can see all 22 stops, filter by category, and get directions from their current location.
Each venue's opening hours are stored as structured data, not free text. The API calculates whether a venue is open right now based on the current time and day. The app shows "Open now" or "Closed — opens at X" without the Flutter app doing any time calculations itself.
A full day on Tawny Trails, a Brisbane scenic drive and arts highlight, and a creative country walk through Dayboro township. Each itinerary is a custom post type with ordered venue stops, timing estimates, and driving directions between them.
A separate accessibility-focused view of the trail with venue-level accessibility notes. Flat access, parking proximity, and facility notes for each venue — stored as ACF fields and exposed through the same REST API.
Standard WordPress map plugins (Google Maps, MapPress, etc.) embed a JavaScript widget on a page. They work fine for a simple business locator. They cannot serve a Flutter app, they cannot calculate opening-hour state, they cannot handle itinerary ordering or accessibility data in a structured way. When the Flutter app needs to consume venue data, you need a real REST API — not a plugin that renders HTML.
Platform Features
Venue operators log in and manage their own listings. Visitors can purchase trail memberships for extended features. The whole thing runs on PMPro — the same membership engine used across the other platforms we manage.
The tt-pmpro-extensions plugin bridges PMPro and the TawnyTrails-specific access rules — which membership level gets access to which itinerary, gift certificate handling, and member discount logic for venue bookings.
A dedicated page for tour operators listing group experience options, with booking inquiry forms linked to each operator's contact.
Regular editorial content about venues, seasonal events, new openings, and trail news. Indexed and surfaced in search.
Trail membership gift certificates configured in PMPro. Recipients redeem them at checkout for trail access.
A feature flag system in tt-api lets us enable or disable features for specific membership levels without a code deploy — controlled from the WordPress admin.
Custom plugins built
Core REST API. Registers CPTs, meta fields, routes, CORS, caching. The Flutter app's entire data layer.
Membership access rules specific to TawnyTrails — itinerary gating, gift certificates, operator dashboard access.
Shortcodes for embedding trail events, seasonal listings, and venue availability in standard WordPress pages.
Performance and display adjustments specific to the trail theme — header overrides, lazy load tuning, schema output.
Under the Hood
The platform is live and functional. A few pages are not yet published — some shortcode-driven content sections are still being completed, and the gift certificate flow is in draft. The REST API, Flutter app, venue directory, itineraries, and membership system are all fully operational. This is a normal state for a growing platform — it is not abandoned or broken.
What we can build for you
The same architecture — custom REST API, Flutter PWA, itinerary system, opening-hour logic, accessibility map, and membership layer — can be built for any arts trail, tourism precinct, or multi-venue experience. The venue count does not matter. The complexity does not matter. The pattern is proven.