Most real estate agencies already have a WordPress website full of listings. When they ask for an app, the expensive mistake is building a second backend with its own database, its own admin panel and its own copy of every property. Six months later, the website and the app show different prices.
I'm a WordPress and Flutter developer in Famagusta, North Cyprus, and I work on a multilingual real estate website (English, German, Turkish, Persian). These are the notes I use when planning how an app should sit next to a site like that. The short version: keep WordPress as the single source of truth and let Flutter read from it.
1. Expose the listings through the REST API
If properties are a custom post type, make sure it's available in the REST API:
register_post_type( 'property', [
'public' => true,
'show_in_rest' => true, // exposes /wp-json/wp/v2/property
'rest_base' => 'property',
'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields' ],
] );
Fields like price, bedrooms and area usually live in post meta or ACF. Register only the fields the app actually needs (register_rest_field or register_post_meta with show_in_rest), so you don't leak internal data and responses stay small.
2. Keep the Flutter side boring and testable
A clean split makes the app easy to change later:
-
Data layer: a repository that calls
/wp-json/wp/v2/propertyand maps JSON to aPropertymodel - Domain layer: plain Dart entities and use cases (search, favourite, request a viewing)
- Presentation: BLoC per screen (list, details, favourites)
class PropertyRepository {
PropertyRepository(this._client, this._baseUrl);
final http.Client _client;
final String _baseUrl;
Future<List<Property>> fetch({int page = 1, String lang = 'en'}) async {
final uri = Uri.parse(
'$_baseUrl/wp-json/wp/v2/property?page=$page&per_page=20&lang=$lang&_embed',
);
final res = await _client.get(uri);
if (res.statusCode != 200) {
throw Exception('Failed to load properties (${res.statusCode})');
}
final data = jsonDecode(res.body) as List;
return data.map((e) => Property.fromJson(e as Map<String, dynamic>)).toList();
}
}
_embed pulls in the featured image in the same request. Use pagination from day one: real agencies have hundreds of listings.
3. Multilingual and right-to-left from the start
International buyers expect their own language. Two things save a lot of pain later:
-
Content language comes from WordPress. With WPML, each translation is its own post, so the app requests the right language (the
langparameter above, or a language-specific endpoint depending on your setup). - UI language lives in Flutter's localisation files. For Persian and Arabic, Flutter flips the layout to right-to-left automatically when the locale changes. Still test every screen in RTL: icons with a direction, price formats and mixed English/Persian text are where bugs hide.
4. Features buyers actually use
For a first version, these are the features I would prioritise:
- Search with filters (area, type, bedrooms, price, sea view, pool)
- Map view with pins along the coast
- Property pages with a gallery, key facts and a floor plan
- Favourites and sharing a listing on WhatsApp
- A one-tap viewing request and phone/WhatsApp buttons
- Alerts when a new listing matches a saved search
Video tours, side-by-side comparison, buyer accounts and an agent area can come later, once people are using the app.
5. Notifications without a second database
Saved-search alerts sound like they need a big backend. A simple approach: store each saved search (filters plus the device token) in a small table or service, and run a scheduled job when a new property is published that checks for matches and sends a push notification. The listings themselves still live only in WordPress.
6. Performance on both sides
The app is only as fast as the API behind it. Cache REST responses on the server, return only the fields you need, and serve images as WebP in sensible sizes. On the website I work on, a colleague and I raised the median mobile PageSpeed score from 51 to 75, and most of that came from the same basics: caching, lighter images and fewer heavy scripts.
FAQ
Can the app use listings from an existing WordPress site?
In most cases, yes. Once the post type and fields are exposed in the REST API, the app reads the same data.
Do I still need the website if I have an app?
Yes. The website brings new buyers in from Google. The app keeps returning buyers close.
Android and iPhone?
One Flutter codebase covers both, which keeps development and maintenance lower than building two separate apps.
Originally published on ehsanabedi.com. You can see a real estate app concept in my portfolio.
Top comments (0)