Every agency has that one fun app idea. We had ours too.
In 2015, Maarten De Block and I were working at EntityOne, at that time an eight-person Drupal agency in Ghent. We wanted a simple app for ordering drinks at the bar with a group of friends.
We tried to outsource it, but the quotes were in our opinion a bit ridiculous, so we decided to build it ourselves. At DrupalCamp Leuven we shared what we learned.
Cordova, then Ionic
Cordova wraps HTML, CSS and JavaScript in a native app, so you can ship to iOS and Android from one codebase. For Drupal developers that means you can start right away with the skills you already have.
Our first version worked, but it felt nothing like a native app. Ionic fixed that. It sits on top of Cordova and AngularJS and gives you native-looking components, Sass theming, a CLI with live reload, and Ionic View for testing on a real phone without packaging the app first.
Talking to Drupal
For the backend we compared Services with RESTful Web Services in Drupal 7 and went with RESTWS. It's more developer-oriented and built on the Entity API. We also shared the pitfalls that cost us far too long:
- With RESTWS basic auth, the username has to start with
restws, unless you change the regex in your settings. - The CSRF token header changed from underscores to dashes:
X-CSRF-Token. - We tried a Drupal 8 backend, but updating from beta 4 to beta 14 broke everything, so we went back to Drupal 7 for now.
We also covered DrupalGap, an SDK for tightly integrated Drupal apps. It's powerful, but hard to get started with.
Native or hybrid?
Our conclusion: if you have billions to spend, go native. Otherwise, and especially as a Drupal developer, Cordova and Ionic let you start building today.
2026 update
Eleven years later, the reason for going hybrid has changed.
In 2015 the argument was skills: Drupal developers could ship an app with the HTML, CSS and JavaScript they already knew.
In September 2026 Shopify moved its apps from React Native back to Swift and Kotlin.
Coding agents now do much of the work of building and translating each feature for both platforms. Writing everything twice no longer costs twice as much, so sharing one codebase saves less than it used to.
Native is cheap enough again.