iPhone

Car Booking SaaS – iPhone Apps Documentation

Apps v1.0.0 · needs website v1.7+

Overview

Car Booking is a pair of iPhone apps for the Car Booking SaaS – Car Rental Management System website: a Driver app for drivers and a Customer app for renters. Rental company owners and staff keep using the website. The apps talk only to your website, so all data stays on your server.

Two apps, one websiteDriver app for the company's drivers, customer app for the renters of every company on your platform.
One app for many companiesRenters find a company by name, QR code or code, so a single App Store listing serves every rental company on your website.
Own-brand optionA build script makes a separate customer app for ONE company: its own name, icon and bundle id.
Same rules as the websitePrices, taxes, deposits, cancellation and permissions come from the website's own code.
Push notificationsThrough Firebase and Apple's APNs: new and cancelled jobs for drivers, booking updates and reminders for customers.
SecureToken kept in the iPhone Keychain; HTTPS only; optional Face ID / Touch ID / passcode lock in the customer app.

What is in the package

Folder / fileWhat it is
driver_app/Flutter project of the Driver app (bundle id com.carbooking.driverApp), with its ios/ folder ready.
customer_app/Flutter project of the Customer app (bundle id com.carbooking.customerApp), with its ios/ folder and tools/build_branded.py.
docs/mobile-api.mdReference of the website API the apps use (for developers who want to extend them).
README.mdShort overview and quick start.
documentation/This guide.
Required: the apps need Car Booking SaaS v1.7 or newer, installed on a domain with HTTPS (SSL certificate). The website is a separate product.

Features

Driver app

AreaWhat the driver can do
Sign inEmail and password of the driver account created on the website. Stays signed in (token kept in the phone's secure storage).
HomeToday's jobs, the week ahead, money earned and to be paid, and alerts.
JobsJobs for the next days with call the customer and open in maps buttons.
Start and finish a rentalOdometer and fuel level at start and at return; the website closes the contract and works out late and extra-kilometre fees.
PhotosPick-up, return and damage photos, uploaded to the booking (visible to the office and the customer).
BookingsHistory of the driver's bookings with search and filters.
Rental agreementsRead the agreement and sign with a finger.
ExpensesAdd an expense (fuel, parking, toll…) with a photo of the receipt.
EarningsCommission per completed job and the payout history.
Notices & pushOffice notices; push notification when a job is assigned or cancelled.

Customer app

AreaWhat the renter can do
Find a companySearch by name or city, scan the company's QR code, or type the company code. One app can serve many rental companies, or you can build an own-brand app for one company (see Own-brand customer app).
Sign inEmail code, password, or phone SMS code (each method can be switched on or off by the company). New customers are registered on first sign-in.
Search carsPick-up and return date and time, only the free cars with the trip price, sorting (price, seats, name), filters (type, gearbox, fuel) and saved favourites.
Car pagePhotos, extras, pick-up and return places, promo or friend code, notes, price breakdown and the company's rules (online payment, approval, free cancellation).
Book and payBook, then pay on the company's secure payment page (Stripe, PayPal, Paystack, Flutterwave or Razorpay, whichever the company enabled).
My bookingsUpcoming, past and cancelled. Per booking: status, dates, places, extras, money (total, paid, to pay), "show at pick-up" card, pay, extend the rental, rate the rental, invoice (PDF), cancel inside the free window, car photos, deposit and driver details, report a problem, add to calendar.
Home dashboardCurrent trip, countdown to the next trip, directions, amount to pay, book again and offers.
ProfileEdit details, My documents (photograph the licence and ID with expiry date), Rewards (loyalty points, history, friend code, current promo codes), switch company, delete my account.
ContactCall, WhatsApp, email, or a message into the company's inbox; Ask our AI helper when the company has it switched on.
NotificationsInbox (bell) that keeps every message, plus push notifications when a booking is confirmed or cancelled and a reminder the day before pick-up and return.
Comfort & securityLight, dark and automatic appearance; optional fingerprint / face / PIN lock.

Not included

Requirements

Your computer (to build the apps)

Building an iPhone app requires a Mac (Apple's rule). No Mac? Use a cloud Mac (MacinCloud, AWS EC2 Mac) or a CI service such as Codemagic — see Building without a Mac.
WhatVersion / notes
MacApple Silicon (M1 or newer) recommended; macOS version required by the current Xcode
XcodeLatest version from the Mac App Store (App Store uploads require a recent Xcode / iOS SDK)
Flutter SDKLatest stable release (3.27 or newer; tested with 3.47)
CocoaPodsLatest (brew install cocoapods)
Python 3 with PillowOnly for the own-brand build script (pip3 install pillow)
DiskAbout 30 GB free (Xcode is large)

Phones that can run the apps

iPhone with iOS 15 or newer.

Accounts

AccountCostNeeded for
Apple IDFreeRunning on your own iPhone during development
Apple Developer Program$99 per yearPush notifications, TestFlight, App Store
Firebase (Google)Free (Spark plan is enough)Push notifications

Enrol as an Organization (needs a D-U-N-S number, the seller name shows your company) or as an Individual (shows your personal name).

Website

Car Booking SaaS v1.7 or newer on HTTPS — see Prepare the website.

Install Xcode & Flutter

  1. Xcode: install from the Mac App Store, open it once, accept the licence and let it install components. Then in Terminal:
    sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
    sudo xcodebuild -runFirstLaunch
    xcodebuild -downloadPlatform iOS
  2. Homebrew and CocoaPods (Homebrew from brew.sh):
    brew install cocoapods
  3. Flutter: follow docs.flutter.dev/get-started/install/macos (iOS). Add Flutter's bin folder to your PATH (e.g. in ~/.zshrc).
  4. Check:
    flutter doctor
    It must show ticks for Flutter and Xcode. (Android Studio is not needed for iPhone.)

Prepare the website

Do this once on the website before building the apps.

  1. Website on HTTPS. Install Car Booking SaaS v1.7 or newer on your domain with an SSL certificate (Let's Encrypt is free). Release builds of the apps refuse plain http://.
  2. Run the update. If you upgraded an existing website, make sure the database update ran (php artisan migrate --force, or the website's update screen). It creates the tables for phones, notifications, customer sign-in codes and photos.
  3. Find your API address. It is your website address followed by /api/mobile/v1, for example https://rent.yourdomain.com/api/mobile/v1. Test it in a browser: https://rent.yourdomain.com/api/mobile/v1/companies?q=a should answer with JSON (a list of companies), and …/api/mobile/v1/company/demo shows one company's name, logo and colour.
  4. Online booking for each company. The customer app needs the company's online booking switched on (owner → Online Booking). The company code is the web address name of that page: …/book/demo means code demo. Owners also find the code, a QR code and a "copy message" button under Mobile apps in their menu.
  5. Customer sign-in. Customers receive a 6-digit code by email, so the company needs working email settings (Settings → Email). The owner can also allow password sign-in and SMS code sign-in (needs the owner's Twilio account). Each method can be switched on or off by the company.
  6. Driver accounts. Create each driver under Driver in the owner's menu. Drivers sign in to the app with that email and password. Set the commission rule on the driver's page to see earnings in the app.
  7. Store links (optional but recommended). After publishing, add the Google Play / App Store links as super admin → Mobile apps. They appear on every company's public "Get our app" page (/book/<code>/app) together with the QR code.
  8. Cron job and queue. The website's cron (php artisan schedule:run every minute) sends the reminders (pick-up, return, payment). For push notifications keep a queue worker running (php artisan queue:work) or set QUEUE_CONNECTION=sync in .env.
  9. Upload size. Photos are sent from the phone: set PHP upload_max_filesize and post_max_size to at least 10M.

Set up the projects

The ios/ folder of both apps is already included, with the permission texts, app name, icons and deployment target applied. There is no setup script.

  1. Unzip the package. It contains driver_app, customer_app and docs; put them in a path without spaces, for example ~/projects/iphone_app.
  2. Download the libraries for each app:
    cd ~/projects/iphone_app/driver_app
    flutter pub get
    cd ../customer_app
    flutter pub get
    Flutter installs the iOS libraries (CocoaPods) the first time you run or build. If that step ever fails, run cd ios && pod install --repo-update.
  3. Set your website address. Either edit lib/config.dart in each app:
    static const String apiBase = String.fromEnvironment(
      'API_BASE',
      defaultValue: 'https://your-domain.com/api/mobile/v1',
    );
    or leave the file as it is and add --dart-define=API_BASE=https://your-domain.com/api/mobile/v1 to every flutter run / flutter build command.
  4. Choose your bundle identifier. The placeholders are com.carbooking.driverApp and com.carbooking.customerApp. Change them to your own (for example com.acmerentals.driver) in Xcode (next section) before you create the app in App Store Connect.
    The bundle ID cannot change after the app is created in App Store Connect.
  5. Open the Xcode project — always the workspace:
    open ios/Runner.xcworkspace
The customer app can be built for ONE company (no company search). Add --dart-define=COMPANY=demo to the command, or use the build script (Own-brand customer app).

Xcode signing & capabilities

Do this once for each app. In Xcode select Runner (blue icon, left) → target Runner:

  1. Signing & Capabilities tab → tick Automatically manage signing → Team: your Apple Developer team (add your Apple ID in Xcode → Settings → Accounts if the list is empty).
  2. Bundle Identifier: set your own, e.g. com.acmerentals.driver. It must be unique in the App Store.
  3. Click + Capability → Push Notifications.
  4. Click + Capability → Background Modes → tick Remote notifications.
  5. General tab → Minimum Deployments: iOS 15.0. Display Name: your app name.
  6. Optional (saves a question at every upload): in ios/Runner/Info.plist add <key>ITSAppUsesNonExemptEncryption</key><false/> — the apps only use standard HTTPS encryption.
Push Notifications needs a paid developer account. With a free Apple ID you can still run the apps on your own iPhone without that capability (notifications will not work).

Run on an iPhone or simulator

Simulator

open -a Simulator
flutter run --dart-define=API_BASE=https://your-domain.com/api/mobile/v1

Your iPhone

  1. Connect the iPhone with a cable, unlock it and tap Trust.
  2. On the iPhone: Settings → Privacy & Security → Developer Mode → on (restart when asked).
  3. Run flutter run (or press ▶ in Xcode with your iPhone selected). The first time, on the iPhone go to Settings → General → VPN & Device Management and trust your developer certificate.

Testing against a local website (http)

For quick tests against a website on your Mac (simulator only): flutter run --dart-define=API_BASE=http://localhost/car-booking-saas/main_file/api/mobile/v1. iOS blocks plain http:// on real devices unless you add an App Transport Security exception — for real devices, test against an https website.

Which account to sign in with

AppSign in with
DriverThe email and password of a driver account created on the website (owner → Driver).
CustomerThe company code of a company that has online booking switched on, then any email address: the 6-digit code arrives by email. New emails become customer accounts on first sign-in.

Branding & customisation

Changes that need no new build (from the website)

WhatWhere on the website
Company name, logo and colour shown in the customer appOwner → Settings → General (company name, logo) and the website colour. The customer app follows them every time it opens.
Which sign-in methods customers getOwner → Online Booking / Settings (email code, password, SMS code)
Whether the company is listed in the app's searchOwner → Mobile apps → "List my company in the app"
Store links, QR code and company code pageSuper admin / Owner → Mobile apps
Which push messages are sentOwner → Configuration → Email Notification (Push Enable column and "Phone app notifications")

Changes in the code (then build again)

WhatHow
App name under the iconCFBundleDisplayName in ios/Runner/Info.plist (or Display Name in Xcode). Currently "Car Booking Driver App" and "Car Booking".
Website addressapiBase in lib/config.dart, or --dart-define=API_BASE=… when building.
Fixed company (customer app)--dart-define=COMPANY=your-code when building: the company screen is skipped.
App iconIn Xcode open ios/Runner/Assets.xcassets → AppIcon and drop a 1024×1024 PNG (no transparency, no rounded corners) — or replace the images in that folder. For the customer app the own-brand script (below) makes every size from one logo.
Launch screenios/Runner/Assets.xcassets/LaunchImage.imageset and Base.lproj/LaunchScreen.storyboard.
Login logoReplace assets/logo.png (login screen) and assets/mark.png (small mark).
Driver app colourslib/theme.dart.
Texts / translationScreen texts are in lib/screens/. Permission texts are in ios/Runner/Info.plist.

Push notifications (Firebase + APNs)

Without this step the apps work and show updates in the inbox, but iPhones do not get notifications. Apple delivers iPhone notifications through APNs; Firebase connects your website to APNs. You need a Firebase project, one file in each app, and one file on the website server.

A. Apple: APNs key

  1. developer.apple.com → Certificates, IDs & Profiles → Keys → +.
  2. Name it (e.g. "Push"), tick Apple Push Notifications service (APNs) → Continue → Register.
  3. Download the .p8 file (you can download it only once) and note the Key ID and your Team ID (top right of the page).
  4. Check Identifiers → your bundle ID has Push Notifications enabled (Xcode does this when you add the capability).

B. Firebase

  1. console.firebase.google.com → create a project, or use the one for your Android apps.
  2. Add app → iOS, once per app: Apple bundle ID exactly as in Xcode (e.g. com.acmerentals.driver) → Register.
  3. Download GoogleService-Info.plist, drag it into Xcode into the Runner folder (tick Copy items if needed and the Runner target). Do this for both apps, each with its own file.
  4. Project settings → Cloud Messaging → Apple app configuration → APNs Authentication Key → Upload: the .p8 file, Key ID and Team ID.
  5. Project settings → Service accounts → Generate new private key (only once per project; skip if you did it for Android).

C. Website server

  1. Save the service account JSON on the website server outside the web folder and put its path in the website's .env:
    FCM_CREDENTIALS=/home/youruser/firebase-service-account.json
    Keep the queue running (php artisan queue:work) or use QUEUE_CONNECTION=sync.
  2. Rebuild the apps. On a real iPhone (the simulator has limited push support): sign in and tap Allow for notifications.
  3. Test: in the admin panel assign the driver a job; the phone should ring within a few seconds. For the customer app confirm a booking of that customer.
Development builds (run from Xcode) and TestFlight/App Store builds both work with an APNs key (.p8) — no separate certificates needed.

When users are notified

WhoEventOpens
DriverNew job assignedThe job
DriverJob cancelledThe job
CustomerBooking confirmed by the companyThe booking
CustomerBooking cancelled by the companyThe booking
CustomerReminder the day before pick-up and the day before returnThe booking

Every message to a customer is also saved in the in-app inbox (the bell), even when phone notifications are off. The company switches push messages on or off under Configuration → Email Notification.

Version numbers

The version of each app is in its pubspec.yaml:

version: 1.0.0+1

Create the app in App Store Connect

Do this once for each app (driver and customer).

  1. appstoreconnect.apple.com → Apps → + → New App.
  2. Platform iOS, name (max 30 characters, must be unique in the App Store), primary language, bundle ID (the one from Xcode), SKU (any internal code, e.g. acme-customer-ios), access: Full.

Build & upload

Make sure the apps point to your https website, then in each app folder:

flutter clean
flutter pub get
flutter build ipa --release --dart-define=API_BASE=https://your-domain.com/api/mobile/v1
# file: build/ios/ipa/*.ipa   (archive: build/ios/archive/Runner.xcarchive)

If you set the address in lib/config.dart, the --dart-define part can be left out.

Upload it with one of:

After 5–30 minutes the build appears in App Store Connect → your app → TestFlight.

Alternative: in Xcode choose Any iOS Device (arm64) → Product → Archive → Distribute App.

TestFlight (beta testing)

  1. App Store Connect → TestFlight → the build → answer Export compliance ("uses only standard encryption / exempt") if asked.
  2. Internal testing: add up to 100 people from your App Store Connect team — available at once.
  3. External testing: up to 10,000 testers by email or public link; the first build gets a short beta review (about a day). Add the demo login in "Test information".
  4. Testers install TestFlight from the App Store and open your invitation.

Publish on the App Store

1. App information & pricing

2. App Privacy

Privacy policy URL and the data types — see Privacy & data safety. Data is "linked to the user", "not used for tracking".

3. Version page

ItemRequirementSuggestion
ScreenshotsiPhone 6.9" (1320×2868 or 1290×2796) required; 6.5" (1242×2688) if asked. 1–10 each.Take them in the iPhone Pro Max simulator (⌘+S)
Promotional textMax 170 charactersCan change any time without review
DescriptionMax 4000 charactersThe features of the app from this guide
KeywordsMax 100 characters, comma separatedcar rental,rent a car,booking,vehicle,driver,fleet,travel
Support URLRequiredYour website's contact page
BuildSelect the uploaded build

4. App Review information

5. Submit

Add for Review → Submit. Review usually takes 1–3 days. Choose automatic or manual release after approval. Afterwards add the App Store links on the website: super admin → Mobile apps.

Common rejection reasons and how to avoid them

GuidelineWhat to do
2.1 App completenessDemo account works, website online, data present, no placeholder texts.
5.1.1(v) Account deletionThe customer app has Profile → Delete my account; explain how drivers are removed (by the company) in the review notes.
4.2 Minimum functionalityDescribe the many features in the notes and screenshots.
3.1.1 PaymentsCar rental is a real-world service: paying on the company's payment page is allowed. Do not sell digital content.
5.1.2 Data usePrivacy labels must match the app (no tracking).
4.0 DesignYour own icon and name (not the default), screenshots from the real app.

Updates

Raise the version/build in pubspec.yaml, build, upload, create a new version in App Store Connect, select the build, submit.

Building without a Mac

Privacy & data safety

Both stores require a privacy policy URL and a description of the data the apps handle. Publish a privacy policy page on your website (the website's own privacy policy page can be used) and use these answers in App Store Connect → App Privacy:

DataCollectedPurposeNotes
Name, email, phone numberYesAccount management, app functionalityEntered by the company (drivers) or the customer
Driving licence / ID photosYes (optional, customer app)App functionality"My documents" so pick-up is faster
Photos of vehicles and receiptsYes (optional, driver app)App functionalityPick-up, return and damage photos, expense receipts
Signature imageYes (optional, driver app)App functionalityAgreement signing
MessagesYesApp functionality, customer supportContact the company, report a problem, AI helper
Purchase / booking historyYesApp functionalityBookings, payments, loyalty points
Payment infoNo (in the app)—Payment happens on the company's secure payment page
Device / push tokenYesApp functionalityTo send notifications
LocationNo—Directions open the phone's maps app
Analytics, ads, trackingNo—No analytics or advertising libraries
Account deletion: Both stores expect that users can delete their account. The customer app has Profile → Delete my account built in. Drivers are created by the rental company: mention in your privacy policy and review notes that drivers ask the company to remove their account.

iPhone permissions used

PermissionAppText shown (Info.plist)
Camera (NSCameraUsageDescription)Driver"Take photos of the vehicle at pick-up, return or when you find damage."
Photo library (NSPhotoLibraryUsageDescription)Driver"Choose photos of the vehicle to attach to the job."
CameraCustomer"Take a photo of your driving licence or ID to speed up pick-up."
Photo libraryCustomer"Choose a photo of your driving licence or ID."
Face ID (NSFaceIDUsageDescription)Customer"Unlock the app with Face ID."
NotificationsBothAsked after sign-in (only when push is set up)

Change the texts (for example to translate them) in ios/Runner/Info.plist of each app.

iPhone settings reference

What is already set in the ios/ folder of the apps, for reference or when you change something by hand.

ios/Runner/Info.plist

<key>CFBundleDisplayName</key>      <string>Car Booking</string>
<key>NSCameraUsageDescription</key>     <string>Take a photo of your driving licence or ID to speed up pick-up.</string>
<key>NSPhotoLibraryUsageDescription</key> <string>Choose a photo of your driving licence or ID.</string>
<key>NSFaceIDUsageDescription</key>     <string>Unlock the app with Face ID.</string>   <!-- customer app -->
<key>LSApplicationQueriesSchemes</key>  <array> ... </array>                     <!-- customer app: opens tel:, mailto:, https: links -->

Capabilities you add in Xcode

Deployment target

iOS 15.0 (IPHONEOS_DEPLOYMENT_TARGET in the Xcode project).

Firebase

GoogleService-Info.plist in ios/Runner/ (added to the Runner target). Without it the app runs and push stays off.

Code structure

Both apps

PathContents
lib/main.dartStart-up, theme, chooses the sign-in or the main screens
lib/config.dartServer address (API_BASE), fixed company (customer app), app version
lib/api.dartHTTP client: token, JSON, errors, uploads and downloads
lib/push.dartFirebase notifications: permission, registering the phone, opening the right screen
lib/theme.dartColours and styles
lib/format.dartMoney and date helpers
test/Unit tests (flutter test)

Driver app screens (lib/screens/)

login, home, dashboard, jobs, job_detail, agreements, expenses, earnings, more.

Customer app screens (lib/screens/)

company and scan_code (find a company), login, home, dashboard, cars, car_detail, bookings, booking_detail, booking_photos, documents, rewards, profile, contact, assistant (AI helper), notifications, switch_company. Extra files: app_lock.dart (fingerprint / face / PIN), favorites.dart, cars_filter.dart, settings.dart.

Libraries used: Driver — http, flutter_secure_storage, image_picker, url_launcher, intl, firebase_core, firebase_messaging. Customer — the same plus local_auth (app lock) and mobile_scanner (QR codes). No analytics or advertising libraries.

To add a screen: create it in lib/screens/, load data with the client in lib/api.dart, and add the endpoint on the website in routes/api.php (every endpoint is described in docs/mobile-api.md).

Own-brand customer app

By default the customer app is one app for many companies: the renter finds a company by name, QR code or code. A rental company that wants its own app (its own name, icon and store listing, with no company search) can have a copy built just for it.

Apple and Google only accept an own-brand app when the company publishes it from its own developer account. Give the company the generated project (or the build) to submit.

From the customer_app folder (needs Python 3 with Pillow: pip install pillow, and Flutter on the PATH for --build):

python3 tools/build_branded.py \
  --company sunrentals \
  --name "Sun Rentals" \
  --logo logo.png \
  --api https://your-domain.com/api/mobile/v1 \
  --package com.sunrentals.app \
  --build none
OptionMeaning
--companyThe company code (the web address name, e.g. sunrentals for …/book/sunrentals). The app skips the company screen.
--nameApp name under the icon
--logoPNG with the company's logo or mark (transparent background is best). All app icons and the login logo are made from it.
--apiYour platform's API address
--packageAndroid application id and iPhone bundle id, e.g. com.sunrentals.app (letters, numbers and dots, at least three parts)
--buildapk, appbundle or none (only create the project)
--outFolder for the result (default build_branded/)

The result is a copy of the app in build_branded/<company>/. The original is never changed. A company can add its own store links under Mobile apps in its menu; they replace the platform's links on that company's website.

Updating to a new version

When a new version of the apps is released:

  1. Back up your project folders (driver_app and customer_app), especially your ios/ edits (signing, GoogleService-Info.plist), lib/config.dart and assets/.
  2. Update the website first if the release notes say the apps need a newer website version.
  3. Copy the new lib/, pubspec.yaml, test/ and docs/ over your project. Put your own values back into lib/config.dart (or keep using --dart-define=API_BASE=…, which needs no edit).
  4. Run flutter pub get.
  5. Run cd ios && pod install after replacing the files.
  6. Raise the version in pubspec.yaml (see "Version numbers"), build and upload as usual.

Troubleshooting

ProblemSolution
flutter: command not foundFlutter's bin folder is not in PATH. Open a new Terminal after changing PATH; check with flutter --version.
flutter doctor shows Xcode problemsRun the commands in Install Xcode & Flutter (xcode-select, runFirstLaunch, downloadPlatform) and accept the licence.
CocoaPods errors (pod install fails)cd ios && pod repo update && pod install --repo-update. On Apple Silicon use a native (arm64) Terminal and a current CocoaPods (brew upgrade cocoapods).
"No connection" / "Could not reach the server" on every screenWrong API_BASE, or the website is on http:// (iOS blocks it on real devices). Open …/api/mobile/v1/companies?q=a in Safari on the iPhone to check.
Customer app: "company not found"Check the code (the last part of …/book/<code>) and that online booking is switched on for that company.
Customer app: the sign-in code never arrivesThe company needs working email settings (and the email may be in spam). Allow password or SMS sign-in for the company, or check storage/logs/laravel.log.
Driver app: "sign in with a driver account"The account is not a driver (owners, managers and admins use the website) or the password is wrong.
Xcode: "Signing for Runner requires a development team"Select your Team under Signing & Capabilities.
Xcode: bundle identifier already in useChoose another bundle identifier (it must be unique in the whole App Store).
Xcode: "Untrusted Developer" on the iPhoneSettings → General → VPN & Device Management → trust your certificate.
Upload rejected: "The bundle version must be higher"Raise the +number in pubspec.yaml.
Upload rejected: missing purpose stringA permission text is missing in ios/Runner/Info.plist (see iPhone permissions used).
No push notificationsAre Push Notifications and Background Modes added in Xcode? Is GoogleService-Info.plist in the Runner target and the APNs key uploaded to Firebase? Is FCM_CREDENTIALS set in the website's .env and the queue running? Tested on a real iPhone? Is push switched on under Configuration → Email Notification?
Photos fail to uploadRaise PHP upload_max_filesize / post_max_size to 10M+ on the server.
Payment page does not openOnline payment must be enabled and configured for the company on the website (Settings → Payment).
Old logo/colours shownClose and reopen the customer app; it refreshes the company branding on start.

FAQ

Do I need one app per rental company?

No. One customer app serves all companies on your website: renters find the company by name, QR code or code. A company that wants its own listing can have an own-brand build (Own-brand customer app).

Can owners and staff use the apps?

Not in this version. Owners, managers and staff use the website, which is fully mobile friendly. The apps are for drivers and customers.

Where is the data stored?

Only on your website/server. The iPhone keeps the sign-in token (in the Keychain) and a few settings such as saved favourites.

Does the app work without the website?

No, every screen loads from your website's API.

Can I change the server address without a new build?

No, the address is built into the app (API_BASE). Company name, logo and colours are not built in: they come from the website.

How do payments work?

Pay now opens the company's secure payment page in the browser (Stripe, PayPal, Paystack, Flutterwave or Razorpay); card data never passes through the app. Apple allows this because car rental is a real-world service.

Can I publish the apps under my own name?

Yes — your bundle ID, app name, icon and Apple Developer account.

Do I need a Mac?

Yes, Apple requires a Mac with Xcode to build iPhone apps; see Building without a Mac for cloud options.

Can I give testers the app before it is on the App Store?

Yes: TestFlight.

Can customers delete their account?

Yes: Profile → Delete my account in the customer app.

Support & changelog

Before contacting support, please check the Troubleshooting section and run flutter doctor.

When you contact support, include:

Support covers installation questions, bugs and help with the steps in this guide. Customisations (new features, design changes) are not included in support but can be ordered separately. Create a support ticket here.

Changelog

VersionDateChanges
1.0.0October 2026First release: driver app and customer app. Driver: jobs, start / finish with odometer and fuel, photos, agreements with signature, expenses with receipt, earnings, notices, push notifications. Customer: find a company, email / password / SMS sign-in, car search, booking and payment, my bookings, extend, rate, documents, rewards, messages, AI helper, notifications, app lock, own-brand build script.