Skip to content
TAQNIX
Odoo ModulesWordPress PluginsWordPress ThemesShopify ThemesApp TemplatesScripts & UtilitiesBlogSell on TAQNIX

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

In plain words: This product lets you hand WooCommerce orders to delivery drivers. You pick a driver on the order screen, the driver gets a notification on their phone, drives the order to the customer and marks each step in a small app. You see everything live in WordPress.
Orders waiting for the driverOrder details with Call and Navigate buttonsDriver profile and earnings
The driver app on a phone: the order list, an order, and the driver’s earnings.

What you bought: three parts that work together

PartWhat it isWho needs it
1. The plugin
delivery-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 code
flutter-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
Tip: You can start without any programming: install the plugin, add drivers, build the app online, install it on a driver’s phone. Chapters 4 to 12 are written for shop owners. Chapters 13 and 14 are for developers.

How a delivery works

In plain words: Every order goes through the same four steps. The driver can only do the next step, so nothing gets skipped.
StepWhoWhat happens
AssignedYou (or the driver, from the open pool)The driver receives a push notification “New order assigned”.
AcceptedDriver taps Accept RouteYou know the driver took the job.
Picked upDriver taps Mark as Picked UpThe customer can get an “on the way” text message.
CompletedDriver 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.

Important: A driver only ever sees the orders assigned to them (and, if you allow it, the open pool). Another driver’s orders, wallet and position are never shown to them.

What you need before you start

You needWhy
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” permalinksThe 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 pluginPays 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 codeNeeded by the online App Builder (chapter 12).

Install the plugin

  1. Unzip the package you downloaded. Inside you will find delivery-driver-app-for-woocommerce-plugin.zip and flutter-app-source.zip. Do not unzip these two.
  2. In WordPress open Plugins → Add New → Upload Plugin, choose delivery-driver-app-for-woocommerce-plugin.zip, press Install Now, then Activate.
  3. 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.
  4. Check Settings → Permalinks: anything except “Plain” is fine. Press Save Changes once if the app cannot reach your store.
Important: If you used an older “Delivery Boy for WooCommerce” plugin, or the separate “Taqnix App Builder” plugin, read chapter 17 first: this plugin replaces both.

Create your drivers

In plain words: A driver is just a WordPress user with the role Delivery Boy. The driver logs into the app with that username and password.
  1. Open Users → Add New.
  2. Fill in a username (for example maria), an email, the name and a strong password.
  3. Set Role to Delivery Boy and press Add User.
  4. Give the username and password to the driver. That is all.
Add a driver: a normal new user with the role “Delivery Boy”.
Add a driver: a normal new user with the role “Delivery Boy”.
Tip: Wrong password five times in a row locks that username on that phone for 15 minutes. Use Users → Edit to reset a password at any time.

The settings, tab by tab

In plain words: Open Settings → Delivery App. Change what you need, press Save Settings. The app reads these rules when it starts, so drivers see the change the next time they open the app.

Operations: the rules of your delivery business

Operations tab.
Operations tab.
SettingWhat 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 DeliveryAn 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 RejectionShows 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 ProofThe driver must take a photo before an order can be completed.
Dispatch Hotline Phone NumberShown in the app under Contact Dispatch; the driver taps to call you.

Mobile App

Mobile App tab.
Mobile App tab.
SettingWhat it does
Force App UpdateThe lowest app version allowed, for example 1.2.0. Older apps show an “Update Required” screen and cannot be used.
App Update LinkWhere the “Update Now” button goes: your Google Play or App Store page.
Privacy Policy / Terms linksOpened from the driver’s profile screen.

SMS & WhatsApp

SMS & WhatsApp tab.
SMS & WhatsApp tab.

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

Push Notifications tab: paste the Firebase service account file here.
Push Notifications tab: paste the Firebase service account file here.

This is where your Firebase key goes (chapter 7).

Tip: Secrets such as the SMS secret are never shown again after you save them. Leave the box empty to keep the saved one.

Set up push notifications (Firebase)

In plain words: Push notifications are the “ding” on the driver’s phone when you assign an order. Google provides them for free through Firebase. You set this up once. It needs two files: one tells the app which Firebase project to use, the other lets your store send messages.

A. Create the Firebase project

  1. Go to console.firebase.google.com and sign in with a Google account.
  2. 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)

  1. In your project press the Android icon (“Add app”).
  2. 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).
  3. 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

  1. In Firebase press the gear icon → Project settings → tab Service accounts.
  2. Press Generate new private key and confirm. A .json file downloads.
  3. Open that file in a text editor, select everything and copy it.
  4. In WordPress open Settings → Delivery App → Push Notifications, paste into the box, press Save Settings.
Important: The service-account file is a password for your Firebase project. Do not email it or put it in a public place.

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

In plain words: Open any order. On the right you will find a box called Assign Delivery Boy. Pick a driver and you are done. It saves immediately, no need to press Update.
The order screen: the Assign Delivery Boy box is in the right column.
The order screen: the Assign Delivery Boy box is in the right column.
  1. Open WooCommerce → Orders and click an order that is Processing.
  2. In Assign Delivery Boy, open the list and choose the driver.
  3. 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

ItemMeaning
Current StatusAssigned, Accepted, Picked up or Completed.
Track Driver on MapOpens Google Maps at the driver’s last position, with the time of the last update.
Proof of DeliveryThe photo (and signature) the driver uploaded.
Order notesEvery step is written to the order notes, for example “Order assigned to Ahmed Khan”.
A finished delivery: status, driver position and the delivery photo.
A finished delivery: status, driver position and the delivery photo.

The driver’s guide (give this to your drivers)

In plain words: The app has four tabs and one button per order. The driver always sees the single next step.

Install and log in

  1. Install your app (the APK file from the App Builder email, or from Google Play).
  2. Open it, allow notifications and location when asked, and log in with the username and password you created.
  3. The dashboard opens. The driver stays logged in until they press Logout or you change their password.
The login screen.
The login screen.

The dashboard

AvailableAssignedAccepted
Tabs: Available (only if the open pool is on), Assigned, Accepted and Completed.
TabContains
AvailableOrders nobody has taken yet. Tap one, then Claim Order.
AssignedNew orders for this driver.
AcceptedOrders the driver has accepted or picked up.
CompletedToday’s deliveries (or the last days you chose in Operations).

Doing a delivery

Claim an open orderAccept or rejectComplete the delivery
The same order screen at different steps. The big button at the bottom always shows the next action.
  1. Tap the order. Call rings the customer, Navigate opens the address in the maps app.
  2. Tap Accept Route (or Reject this order, if you allowed it).
  3. At the shop tap Mark as Picked Up. The customer can now get the “on the way” text.
  4. 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.

Profile and earnings.
Profile and earnings.
Tip: The app shares the driver’s position while it is open, about every 10 minutes. It does not track a phone that is closed or logged out.

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.

ProviderGood forKey / Secret
TwilioWorldwide SMS and WhatsAppAccount SID / Auth Token; sender = your Twilio number (for WhatsApp: whatsapp:+1…)
UnifonicSaudi Arabia, UAE, GulfAppSid; sender = approved sender name
2FactorIndia transactional SMSAPI key; sender id
OTPlessWhatsApp messagesClient ID / Client Secret
Tip: If messages do not arrive, open the order: a failed send is written to the order notes with the answer of your provider.

Build your own branded app online (no coding)

In plain words: The App Builder tab makes an Android file (APK) with your app name, icon and colours, pointing at your store. You fill in a form; a few minutes later you get an email with the download link. You do not need to install anything on your computer.
Settings → Delivery App → App Builder.
Settings → Delivery App → App Builder.

Before you start

  • Your purchase code.
  • Your app icon (square PNG, 1024×1024), a logo and a splash image.
  • The google-services.json file from chapter 7, made for the package name you will type below.

Step by step

  1. Open Settings → Delivery App → App Builder.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
Important: The package name in the builder and in Firebase must be identical. If they differ the build stops with a message that tells you which names it found.

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

In plain words: Skip this chapter if you use the online builder. The full source code of the driver app is in flutter-app-source.zip: Flutter (Dart), Dio for networking, Firebase Messaging, Geolocator, Secure Storage.

Requirements

  • Flutter 3.41 or newer (flutter doctor should 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 open ios/Runner.xcworkspace in 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

FolderWhat is inside
lib/core/network/dio_client.dartNetwork client; adds the login token to every request and logs the driver out when the server says the login is over.
lib/features/authLogin, splash screen, session.
lib/features/ordersDashboard, order list, order detail, photo proof, history.
lib/features/profileEarnings, contact, legal links, logout.
lib/core/servicesLocation sharing, store settings, secure storage.
default_files/Templates used by the online builder. Ignore.

For developers: the REST API

In plain words: The app and the plugin talk through a small REST API. You can use it to build your own driver app, a dispatch board or an integration.

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 pathWhat it does
POST /loginusername, password → boy_id, token, name, email. 429 after too many wrong passwords.
POST /logoutEnds this token and stops pushes to this phone.
GET /settingsPublic rules: minimum version, rejection, photo proof, open pool, dispatch phone, legal and update links.
GET /ordersThe driver’s active orders (+ the open pool when on).
GET /historyThe driver’s completed orders for the chosen number of days.
POST /orders/{id}/statusstatus = assigned (claim from the pool), accepted, picked_up or completed. Only the next step is allowed; otherwise 409.
POST /orders/{id}/rejectOptional reason. Only when rejection is on and the order is still “assigned”.
POST /orders/{id}/podMultipart upload: pod_photo (JPG/PNG/WebP), optional pod_signature. Completes the order.
POST /locationlatitude, longitude.
POST /update-fcmfcm_token of the phone.
GET /walletBalance 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 keyValue
_assigned_delivery_boy_idUser ID of the driver.
_delivery_statusassigned, accepted, picked_up, completed.
_tdb_pod_photo_idMedia ID of the delivery photo.
_tdb_commission_paidCommission 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

ProblemWhat 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 loginThe 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 screenThe login ended (logged out, password changed, 90 days passed). Log in again.
No push notificationRead 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 orderThe order must be Processing and assigned to that driver. Completed orders move to the Completed tab.
“Available” tab is missingSwitch 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.00Install 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 matchMake 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).