Delivery Driver App for WooCommerce documentation
A step-by-step guide for everyone, no coding needed: add drivers, set the rules, assign orders, set up push notifications and build your own Android app online. Developers will also find the source-code and REST API chapters.
Documents version 1.1.0Updated Oct 22, 2026
Start here
What you bought: three parts that work together
| Part | What it is | Who needs it |
|---|---|---|
1. The plugindelivery-driver-app-for-woocommerce-plugin.zip | Goes on your WordPress store. You assign orders, choose the rules, set up customer text messages and push messages, and build the app, all in one place. | Everybody |
| 2. The online App Builder (a tab inside the plugin) | Makes your own branded Android app (your name, icon and colours) on our servers. You fill in a short form and press one button. | Most people |
3. The app source codeflutter-app-source.zip | The complete code of the driver app (Flutter, for Android and iPhone). Use it if you want to change the app or build it yourself. | Developers |
How a delivery works
| Step | Who | What happens |
|---|---|---|
| Assigned | You (or the driver, from the open pool) | The driver receives a push notification “New order assigned”. |
| Accepted | Driver taps Accept Route | You know the driver took the job. |
| Picked up | Driver taps Mark as Picked Up | The customer can get an “on the way” text message. |
| Completed | Driver taps Complete Delivery (and takes a photo if you require one) | The WooCommerce order becomes Completed, the driver’s commission is paid, the customer gets a “delivered” message. |
Optional extras you can switch on or off: drivers can claim orders nobody has taken (the “open pool”), drivers can reject an order, and a delivery photo can be compulsory.
What you need before you start
| You need | Why |
|---|---|
| A WordPress site with WooCommerce 8.0 or newer, PHP 7.4+ | The plugin reads and updates your WooCommerce orders. |
| HTTPS (a padlock in the browser) and “pretty” permalinks | The phone talks to your store through https://yourstore.com/wp-json/. |
| A free Firebase project (Google account) | Needed for push notifications. Chapter 7 shows every click. |
| Optional: the free TeraWallet plugin | Pays the driver’s commission into a wallet the driver can see in the app. |
| Optional: an account with an SMS provider (Twilio, Unifonic, 2Factor or OTPless) | Sends “on the way” and “delivered” messages to customers. |
| Your purchase code | Needed by the online App Builder (chapter 12). |
Install the plugin
- Unzip the package you downloaded. Inside you will find
delivery-driver-app-for-woocommerce-plugin.zipandflutter-app-source.zip. Do not unzip these two. - In WordPress open Plugins → Add New → Upload Plugin, choose
delivery-driver-app-for-woocommerce-plugin.zip, press Install Now, then Activate. - Open Settings → Delivery App. If you see the page with five tabs (Operations, Mobile App, SMS & WhatsApp, Push Notifications, App Builder), the plugin is ready.
- Check Settings → Permalinks: anything except “Plain” is fine. Press Save Changes once if the app cannot reach your store.
Create your drivers
- Open Users → Add New.
- Fill in a username (for example
maria), an email, the name and a strong password. - Set Role to Delivery Boy and press Add User.
- Give the username and password to the driver. That is all.
The settings, tab by tab
Operations: the rules of your delivery business
| Setting | What it does |
|---|---|
| Delivery History (Days) | How many days of finished deliveries the driver can see. 1 = today only, 7 = the last week. |
| Driver Commission per Delivery | An amount paid into the driver’s TeraWallet once when the order is completed. 0 = pay nothing. |
| Allow Self-Assignment (Open Pool) | Adds an Available tab to the app with processing orders nobody has taken. A driver taps Claim Order to take one. |
| Allow Order Rejection | Shows a Reject this order button on newly assigned orders. A rejected order goes back to “unassigned” (and will not be offered to the same driver again). |
| Require Photo Proof | The driver must take a photo before an order can be completed. |
| Dispatch Hotline Phone Number | Shown in the app under Contact Dispatch; the driver taps to call you. |
Mobile App
| Setting | What it does |
|---|---|
| Force App Update | The lowest app version allowed, for example 1.2.0. Older apps show an “Update Required” screen and cannot be used. |
| App Update Link | Where the “Update Now” button goes: your Google Play or App Store page. |
| Privacy Policy / Terms links | Opened from the driver’s profile screen. |
SMS & WhatsApp
Switch on Enable Automated Texts, choose your provider, paste the key (and secret, if your provider has one), type the sender name or number, and edit the two messages. In the messages you can use {order_id}, {customer_name} and {total}. The “on the way” message is sent when the driver taps Mark as Picked Up; the “delivered” message when the order is completed.
Push Notifications
This is where your Firebase key goes (chapter 7).
Set up push notifications (Firebase)
A. Create the Firebase project
- Go to console.firebase.google.com and sign in with a Google account.
- Press Add project, type a name (for example “Acme Drivers”), and finish the wizard. You can turn Google Analytics off.
B. The file for the app: google-services.json (Android)
- In your project press the Android icon (“Add app”).
- Android package name: type the unique name of your app, for example
com.acme.drivers. Write it down: you must use exactly the same name in the App Builder (chapter 12). - Press Register app, then Download google-services.json. Keep this file for chapter 12 or 13. You can skip the remaining Firebase screens.
C. The file for your store: a service account key
- In Firebase press the gear icon → Project settings → tab Service accounts.
- Press Generate new private key and confirm. A
.jsonfile downloads. - Open that file in a text editor, select everything and copy it.
- In WordPress open Settings → Delivery App → Push Notifications, paste into the box, press Save Settings.
D. iPhone only
For iPhone also add an iOS app in Firebase (use your bundle ID), download GoogleService-Info.plist, and upload an Apple APNs key under Project settings → Cloud Messaging. Details are in chapter 13.
Test it
Log into the app on a phone (chapter 9), then assign that driver an order (chapter 8). The phone should ring within seconds. The order notes on the order screen say “Push notification sent to driver…” or show the exact error from Google if something is wrong.
Give an order to a driver
- Open WooCommerce → Orders and click an order that is Processing.
- In Assign Delivery Boy, open the list and choose the driver.
- The status line shows “Assigned” and the driver gets a push message.
You can change the driver as long as the delivery is not finished. The new driver starts again at “Assigned”. Choosing the empty line removes the driver.
What you see on the order afterwards
| Item | Meaning |
|---|---|
| Current Status | Assigned, Accepted, Picked up or Completed. |
| Track Driver on Map | Opens Google Maps at the driver’s last position, with the time of the last update. |
| Proof of Delivery | The photo (and signature) the driver uploaded. |
| Order notes | Every step is written to the order notes, for example “Order assigned to Ahmed Khan”. |
The driver’s guide (give this to your drivers)
Install and log in
- Install your app (the APK file from the App Builder email, or from Google Play).
- Open it, allow notifications and location when asked, and log in with the username and password you created.
- The dashboard opens. The driver stays logged in until they press Logout or you change their password.
The dashboard
| Tab | Contains |
|---|---|
| Available | Orders nobody has taken yet. Tap one, then Claim Order. |
| Assigned | New orders for this driver. |
| Accepted | Orders the driver has accepted or picked up. |
| Completed | Today’s deliveries (or the last days you chose in Operations). |
Doing a delivery
- Tap the order. Call rings the customer, Navigate opens the address in the maps app.
- Tap Accept Route (or Reject this order, if you allowed it).
- At the shop tap Mark as Picked Up. The customer can now get the “on the way” text.
- At the door tap Complete Delivery. If the customer has not paid yet (cash on delivery) the button says Collect Cash & Complete. If you turned on photo proof, the camera opens: take a photo of the parcel at the door and the delivery is completed.
Earnings and profile
The profile screen (person icon, top right) shows Total Earnings from TeraWallet, the dispatch phone number, delivery history, privacy and terms, the app version and Logout.
Driver commission and earnings
Set an amount under Operations → Driver Commission per Delivery. When a delivery is completed the plugin adds that amount to the driver’s TeraWallet balance. It is paid once per order, even if the order is edited afterwards. The order notes show “Credited … to driver”. The driver sees the balance as Total Earnings in the app.
Install and activate the free TeraWallet plugin (WooCommerce wallet) for this. Without it deliveries still work; the order note says “Commission not paid: TeraWallet is not active” and the app shows 0.00. To pay your drivers out, use TeraWallet’s own screens (Wallet menu → adjust or withdraw).
Messages to customers
Turn on Settings → Delivery App → SMS & WhatsApp → Enable Automated Texts. The customer’s billing phone number is used, so make it a required checkout field and ask for the country code.
| Provider | Good for | Key / Secret |
|---|---|---|
| Twilio | Worldwide SMS and WhatsApp | Account SID / Auth Token; sender = your Twilio number (for WhatsApp: whatsapp:+1…) |
| Unifonic | Saudi Arabia, UAE, Gulf | AppSid; sender = approved sender name |
| 2Factor | India transactional SMS | API key; sender id |
| OTPless | WhatsApp messages | Client ID / Client Secret |
Build your own branded app online (no coding)
Before you start
- Your purchase code.
- Your app icon (square PNG, 1024×1024), a logo and a splash image.
- The
google-services.jsonfile from chapter 7, made for the package name you will type below.
Step by step
- Open Settings → Delivery App → App Builder.
- Step 1. Check your website address (https, no slash at the end), paste your purchase code and press Connect & load my app. The green “Connected” sign appears. Your code is stored on your server and is not shown again.
- Step 2. Type the App name (shown under the icon on the phone), the Package name (the same one you gave Firebase, for example
com.acme.drivers) and your email. We send the download link to that email. - Step 3. Choose the icon, logo and splash images (they upload as soon as you pick them), choose the splash colour and upload
google-services.json. - Step 4. Choose APK (to install straight on a phone and test) or App Bundle (to upload to Google Play). Press Save details, then Start Android build.
- Wait for the email (usually a few minutes; builds are queued one after another). Open the link on the phone to download and install the APK.
Good to know
- The builder makes Android apps. For iPhone use the source code (chapter 13).
- Every purchase code can build one app. To change the name, icon or screens later, save the form again and press Build again.
- What is sent to the build server: your site address, purchase code, app name, package name, your email and phone, the splash colour, your three images and the Firebase file. No store passwords or WooCommerce keys are needed.
- Only administrators can use this tab, and every request is protected by a security token.
Install the APK on a phone: open the link in the phone’s browser, allow “install from this source” if Android asks, and open the app. Log in with a driver account from chapter 5.
For developers: build the app from source
flutter-app-source.zip: Flutter (Dart), Dio for networking, Firebase Messaging, Geolocator, Secure Storage.Requirements
- Flutter 3.41 or newer (
flutter doctorshould be green), Android Studio for Android, Xcode and CocoaPods for iPhone.
1. Open the project and point it to your store
unzip flutter-app-source.zip -d driver_app && cd driver_app flutter pub get # run on a connected phone or emulator flutter run --dart-define=API_DOMAIN=https://yourstore.com
Or change the default permanently in lib/core/constants/app_config.dart:
class ApiConstants {
static const String domain = String.fromEnvironment(
'API_DOMAIN',
defaultValue: 'https://yourstore.com', // <- your store, no slash at the end
);
...
}2. Add your Firebase files
- Android:
android/app/google-services.json(the Gradle plugin switches on automatically when the file exists). - iPhone:
ios/Runner/GoogleService-Info.plist, then openios/Runner.xcworkspacein Xcode and drag it into the Runner group if it shows in red.
3. Name, package and icons
# unique app id (must match Firebase) dart run change_app_package_name:main com.acme.drivers # replace assets/images/icon.png (1024x1024) and assets/images/splash.png, then: dart run flutter_launcher_icons dart run flutter_native_splash:create
The app name shown on the phone is in android/app/src/main/AndroidManifest.xml (android:label) and ios/Runner/Info.plist (CFBundleDisplayName). Brand colours are in lib/core/constants/app_colors.dart.
4. Sign and build (Android)
# create a signing key once and keep it safe keytool -genkey -v -keystore ~/acme-drivers.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload # android/key.properties storeFile=/Users/you/acme-drivers.jks storePassword=... keyAlias=upload keyPassword=...
In android/app/build.gradle.kts read these values in a signingConfigs { create("release") { … } } block and use it in buildTypes.release instead of the debug key (the file has a comment where). Then:
flutter build apk --release --dart-define=API_DOMAIN=https://yourstore.com # APK to test flutter build appbundle --release --dart-define=API_DOMAIN=https://yourstore.com # AAB for Google Play
5. iPhone
cd ios && pod install --repo-update && cd .. flutter build ipa --release --dart-define=API_DOMAIN=https://yourstore.com
In Xcode choose your Team, set a unique Bundle Identifier (the same as in Firebase) and keep the Push Notifications capability. Upload an APNs key in Firebase for push.
Where things are
| Folder | What is inside |
|---|---|
lib/core/network/dio_client.dart | Network client; adds the login token to every request and logs the driver out when the server says the login is over. |
lib/features/auth | Login, splash screen, session. |
lib/features/orders | Dashboard, order list, order detail, photo proof, history. |
lib/features/profile | Earnings, contact, legal links, logout. |
lib/core/services | Location sharing, store settings, secure storage. |
default_files/ | Templates used by the online builder. Ignore. |
For developers: the REST API
Base address: https://yourstore.com/wp-json/taqnix/v1. Everything except /login and /settings needs the token you get from login, sent in the header X-Driver-Token (Authorization: Bearer … works too). Tokens last 90 days, a driver can be logged in on up to 5 phones, and /logout ends one.
| Method and path | What it does |
|---|---|
POST /login | username, password → boy_id, token, name, email. 429 after too many wrong passwords. |
POST /logout | Ends this token and stops pushes to this phone. |
GET /settings | Public rules: minimum version, rejection, photo proof, open pool, dispatch phone, legal and update links. |
GET /orders | The driver’s active orders (+ the open pool when on). |
GET /history | The driver’s completed orders for the chosen number of days. |
POST /orders/{id}/status | status = assigned (claim from the pool), accepted, picked_up or completed. Only the next step is allowed; otherwise 409. |
POST /orders/{id}/reject | Optional reason. Only when rejection is on and the order is still “assigned”. |
POST /orders/{id}/pod | Multipart upload: pod_photo (JPG/PNG/WebP), optional pod_signature. Completes the order. |
POST /location | latitude, longitude. |
POST /update-fcm | fcm_token of the phone. |
GET /wallet | Balance from TeraWallet (balance_raw, balance_formatted). |
Try it
# 1. log in
curl -s -X POST https://yourstore.com/wp-json/taqnix/v1/login \
-H 'Content-Type: application/json' \
-d '{"username":"maria","password":"your-password"}'
# -> {"success":true,"data":{"boy_id":7,"token":"7.3f9c…","display_name":"Maria Lopez",...}}
# 2. list my orders
curl -s https://yourstore.com/wp-json/taqnix/v1/orders -H 'X-Driver-Token: 7.3f9c…'
# 3. accept an order
curl -s -X POST https://yourstore.com/wp-json/taqnix/v1/orders/123/status \
-H 'X-Driver-Token: 7.3f9c…' -H 'Content-Type: application/json' -d '{"status":"accepted"}'Assign an order from your own code
// PHP, inside WordPress
$order = wc_get_order( 123 );
$result = TDB_Flow::assign( $order, $driver_user_id ); // sends the push message too
if ( is_wp_error( $result ) ) {
error_log( $result->get_error_message() );
}Order data you can read
| Meta key | Value |
|---|---|
_assigned_delivery_boy_id | User ID of the driver. |
_delivery_status | assigned, accepted, picked_up, completed. |
_tdb_pod_photo_id | Media ID of the delivery photo. |
_tdb_commission_paid | Commission paid for this order (empty = not paid). |
Security and privacy
- Every request needs a login token. Without it the API answers “401”. The driver id is taken from the token, never from the request, so one driver cannot read or change another driver’s orders, wallet or position.
- Tokens are random and stored as a one-way hash. Logging out, deleting the user or removing the role ends access immediately.
- The step order is enforced on the server, commission is paid once per order, and uploads must be real JPG, PNG or WebP images.
- Login attempts are limited (5 wrong passwords, then 15 minutes).
- The App Builder tab and every admin action need an administrator and a security token; nothing is available to visitors.
- Data stored: the driver’s last 100 positions, push token and login tokens (user meta), delivery photos (media library), order notes. Ask your drivers for consent to location sharing and mention it in your privacy policy.
Troubleshooting
| Problem | What to do |
|---|---|
| The app says “Cannot reach the server” | Check the store address in the app (API_DOMAIN), HTTPS, and open https://yourstore.com/wp-json/taqnix/v1/settings in a browser: you should see text starting with {"success":true. If not, re-save Settings → Permalinks. |
| “Access denied” at login | The user’s role must be Delivery Boy (not Customer or Subscriber). |
| “Too many failed attempts” | Wait 15 minutes. It protects the account from password guessing. |
| The app suddenly shows the login screen | The login ended (logged out, password changed, 90 days passed). Log in again. |
| No push notification | Read the order notes: they show the answer from Google. Check the service-account file (chapter 7C), that the driver logged in on that phone at least once, and that notifications are allowed on the phone. |
| The driver does not see the order | The order must be Processing and assigned to that driver. Completed orders move to the Completed tab. |
| “Available” tab is missing | Switch on Allow Self-Assignment and restart the app. |
| Complete Delivery is refused with “photo required” | Photo proof is on. The app opens the camera; allow camera access in the phone’s settings. |
| Earnings stay 0.00 | Install TeraWallet and set a commission amount. Orders completed before that are not paid retroactively. |
| The App Builder says “Not allowed” | Your admin session expired: reload the page. |
| The App Builder says the package name does not match | Make the package name in the builder identical to the one in Firebase, or download a new google-services.json. |
| Cache plugins (LiteSpeed, WP Rocket, Cloudflare) | Exclude /wp-json/taqnix/ from caching. The app already asks for fresh data. |
Updating, and moving from the older plugins
Updating
Upload the new plugin zip with Replace current with uploaded; your settings and drivers stay. Build a new app version (chapter 12 or 13) and ask drivers to update. Raise Force App Update to the new version number when you want everyone to update.
If you used “Delivery Boy for WooCommerce” (1.0.x) and “Taqnix App Builder”
- This plugin replaces both. Deactivate and delete “Taqnix App Builder”; its builder is now the App Builder tab here. Enter your purchase code there once.
- Upload this plugin over the old one. Your drivers, settings and orders are kept.
- Old driver apps stop working on purpose. Version 1.1 closed a serious hole: until then anybody who knew a driver’s id could read and change orders. The new app logs in with a token. Build and install the new app, then raise Force App Update.
- The commission used to be a fixed 15, paid again every time an order was saved as completed. It is now a setting (default 0) and is paid once per order.
Removing
Deactivate and delete the plugin. Your drivers (users), orders and photos stay. Plugin settings are removed.
Support
Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace item page where you bought the package. Please include your store address, what you did, and what you saw on the screen (a screenshot helps).