1. What is Andamanly Partner?
Andamanly Partner is the vendor-side mobile app for the Andamanly travel marketplace — a platform that connects travellers visiting the Andaman Islands with the hotels, dive centres, activity providers, ferry operators and vehicle rentals on the ground. The customer-facing side of the marketplace is one experience; this case study is about the other side — the app vendors use to actually run their business inside Andamanly.
One app, four vendor types — hotel, activity, ferry and vehicle. Each vendor sees only the screens and fields that matter to their category, but they all share the same login, onboarding, inventory model, booking pipeline and payout ledger. The brief was simple: give every Andaman vendor a phone in their pocket that fully replaces an admin dashboard.
What vendors do inside the app:
- Onboard with bank details, agreement and profile photo
- Create and manage their inventory (rooms, activities, ferry trips, vehicles)
- Open or close availability on a month-by-month calendar
- Accept or reject bookings with optional reason
- Run discount offers — flat, percentage or early-bird
- See payouts with a per-booking breakdown
- Read reviews with rating and search filters
- Get real-time push notifications when a booking lands
2. The Stack & Why
The build pairs a Flutter mobile client with a Laravel REST API. Auth uses bearer tokens; the token lives in the device's secure storage and is sent on every authenticated request. Material 3 with Poppins on the type side, and an Ocean Blue / Lagoon Teal palette that quietly references the islands the app is built for.
Flutter (Android + iOS)Laravel REST APIBearer-token authFirebase Cloud MessagingMaterial 3 + Poppinsfl_chart for analyticsThe reason for Flutter is the usual one — one codebase, two stores, native-quality performance — and the reason for Laravel is that the marketplace already had a battle-tested Laravel backend, so the partner app could plug into the same domain layer instead of growing a parallel one. Boring on purpose.
3. Architecture Decisions That Mattered
One state object, no Bloc / Riverpod / Provider
All business logic and API calls live in a singleAppState that extends ChangeNotifier. It's exposed to the widget tree via a smallAppScopebuilt on Flutter'sInheritedNotifier. No external state-management package. For a focused, single-user vendor app this stayed ergonomic well past the point where a router or DI library would have been a tax instead of a help.
No router package
Routing is a conditional _RootRouter that walks the user through Splash → Introduction → Auth → Onboarding →VendorShell based on what AppStatesays is true right now. Inside the shell, deeper screens are pushed with plain Navigator.push(MaterialPageRoute(...)). Less indirection, fewer things to keep in your head when you're three folders deep at midnight.
Role-gated UI through a VendorType enum
Every vendor in the system has a VendorType —hotel, activity, ferryor vehicle. Helpers likepagesForVendor() use that enum to filter navigation tabs, dashboard cards, inventory screens and even form fields. The same binary, four different apps depending on who logs in.
Defensive parsing, not paranoid parsing
A small set of helpers — _stringOrNull,_intOrNull, _dateOrNull,_asMap, _asList — wrap the JSON that comes back from the API. They keep response handling consistent without sprinkling try/catches across every model. Once the API surface grew past about 50 endpoints, these helpers stopped being optional.
4. Phase 1 — Foundation
The first phase shipped everything a vendor needs to bea vendor inside the system — sign up, finish onboarding, list inventory, open availability, and see bookings.
The piece I'm proudest of in Phase 1 is the inventory calendar. Vendors don't want to tap each date to open or close it — they want to drag through a date range, optionally set a different price for that range, and move on. So the calendar lazy-loads month by month, supports both single-date and bulk operations, and writes back the price override cleanly when the vendor wants premium pricing for a peak weekend.
5. Phase 2 — Vendor Workflow Completion
Phase 1 was “the app exists.” Phase 2 was “the app is good to actually use every day.” Eight features landed, all aligned to the backend spec:
Booking Detail Sheet
Tap any booking row to slide up a full sheet with inline Accept / Reject buttons and an optional rejection reason.
Forgot Password
Two-step flow: email → OTP → new password, with a 60-second resend countdown so vendors don't spam the OTP API.
Profile Edit
A dedicated edit screen pushed via Navigator, backed by the same multipart upload used in onboarding.
Settings
Change password and notification toggles, persisted in secure storage so preferences survive a reinstall.
FAQs
Single-accordion list backed by anExpansibleController, fetched once and session-cached.
Billing & Payouts
Paginated payout list with a gradient summary card, a payout detail sheet, and the booking references nested inside each payout.
Revenue Analytics
A booking-status PieChart and a monthly-revenue BarChart rendered with fl_chart on the dashboard.
Notification Bell
FCM token registration, an unread badge with a 9+ cap, and a notifications list — the scaffolding Phase 3 would light up.
6. Phase 3 — Real-Time Push Notifications
A vendor app without push is a vendor app vendors check twice a day instead of within seconds. Phase 3 wired up an end-to-end Firebase Cloud Messaging pipeline that does one thing well: when a booking lands, the right vendor's phone vibrates, shows the right banner, and — if they tap — opens directly to that booking's detail sheet.
What the pipeline covers:
- Foreground banners on Android via
flutter_local_notifications - A high-importance Android notification channel for booking alerts
- Background and terminated-app handling, including
getInitialMessage()for cold-start taps - A
bookingIdthreaded from the server payload all the way into the booking detail sheet - Persistence of the most recent notifications across cold starts
- An unread badge on the bell with a 9+ cap
- Server-side dispatch via
kreait/laravel-firebasewith multicast and dead-token cleanup - Booking-created events fired from a Laravel observer, so app code never has to remember to notify
The detail most apps skip is the last mile — what happens after the OS shows the banner. Andamanly Partner carries both a notification block and adata block in the same FCM payload. The OS uses the notification half to draw the banner and the app uses the data half (with a typelike booking_created, booking_updated,payout_processed or promotion) to route the user to the exact screen they expected — even if the app was killed when the notification arrived.
7. Phase 4 — The Offers Module
Once vendors had stable bookings and payouts, the next thing they asked for was a way to compete on price. Phase 4 shipped a full discounts-and-offers module available to all four vendor types, behind its own bottom-nav tab.
Three discount kinds — percentage, flat, and early-bird — modelled as an OfferDiscountType enum. The early-bird type unlocks one extra field, min_advance_days, which the form only renders when that type is selected. Status flows through pending,approved, rejected orexpired and resets to pending on any edit, so the form warns before saving edits to an already-approved offer.
The interesting product detail is the delete behaviour. The API correctly refuses to delete an offer that's already been used by a booking — it returns a 422. Instead of showing the vendor a generic error, the UI inspects the response, switches the “Delete” button to a “Deactivate” toggle, and explains why. It's the kind of small bit of UX that takes ten minutes to write and saves your support inbox a hundred tickets.
8. TAC-Free Tier, Cancellation Policies & Reviews
TAC-Free Tier
Onboarding new vendors is hard if the first thing you take from them is a commission. Andamanly gives every approved vendor a 3-month TAC-Freeperiod — zero commission on bookings during that window. The flag and expiry date surface across onboarding status, the vendor resource, the dashboard stats, and every payout breakdown, so a TAC-Free booking shows a 100% payout split and a “TAC-Free” badge on the booking row.
Two-Tier Cancellation Policies
Cancellation rules are slab-based — “cancel 7+ days before: 0% charge; cancel 3–6 days before: 30%; cancel less than 24 hours before: 100%.” Vendors can set a default policy for their account and override it per service when a particular hotel or activity needs different rules. Each slab carries days_before, acharge_type (percentage orflat), and a charge_amount, and the app renders a clean human-readable summary so the vendor can eyeball what they just configured.
Reviews
Vendors can read reviews of their services with search, rating filters, and pagination, plus a stats block showing average rating and total reviews. The list is scoped to the vendor's own services and stays correct even when a vendor account holds more than one role — a small detail that keeps multi-property hoteliers from accidentally seeing each other's feedback.
9. Engineering Lessons From the Build
10. Frequently Asked Questions
What does the Andamanly Partner app do?
It's the vendor-side app for the Andamanly travel marketplace. Hotel, activity, ferry and vehicle vendors use it to manage inventory, accept or reject bookings, run offers, see payouts, read reviews, and get push notifications in real time.
Why Flutter and Laravel?
Flutter ships one codebase to Android and iOS — about half the cost of two native apps. Laravel was already running the marketplace backend, so adding a partner app on top meant reusing the same domain layer instead of forking it.
How long would a similar vendor app take?
A multi-role marketplace vendor app with onboarding, inventory, calendar, bookings, payouts, push notifications and offers typically takes 4–8 months end to end, depending on how many vendor types you support and how custom the inventory model is.
Can you build this for my Andaman business?
Yes — if you run a hotel network, ferry company, dive centre group, restaurant chain, tour aggregator or rental business in Port Blair or anywhere in the Andamans and you need a vendor portal, partner app, or full marketplace, I can design and ship it end to end.
Need a vendor app or marketplace built for your Andaman business?
Tell me what you're trying to ship and I'll come back with a scope, timeline and price.