Customer App
Sellino – Flutter Shopping App (Android & iOS)
/api/v10/*Developed By: BugBuild Labs
Introduction
The Sellino Customer App is a native mobile shopping app built in Flutter for Android and iOS. It connects to your Sellino backend through the REST API (/api/v10/*), so the app works as long as your backend is running.
What customers can do:
- Browse categories, brands, deals and product feeds
- Search, view product details, ratings and seller profiles
- Add to cart/wishlist, apply coupons and check out
- Pay online or cash on delivery, with multiple saved addresses
- Use the wallet, reward points and affiliate program
- Track orders, chat with support and manage their profile
- Switch app language (multi-language & RTL support)

Requirements
To build and customize the app you need a working Flutter development environment.
- Flutter SDK (stable channel) and Dart
- Android Studio (Android SDK) and/or Xcode (for iOS, macOS only)
- A running Sellino backend with the API reachable over HTTPS
- A device or emulator/simulator for testing
Verify your setup with flutter doctor — resolve any reported issues before building.
Package & Source Code
Download Main_Files.zip from your CodeCanyon downloads and extract it. The full Flutter source of this app lives in the CustomerAppCode folder (alongside WebSourceCode for the Laravel backend and SellerAppCode for the merchant app). Open CustomerAppCode in Android Studio or VS Code to build and customize the Customer App.
App Configuration
The most important step: point the app at your backend.
- Open the
CustomerAppCodefolder in your IDE and runflutter pub getto fetch dependencies. - Set your API base URL in
lib/core/env/prod_env.dart(release builds) orlib/core/env/dev_env.dart(debug builds). Everything else —ApiUrls, image URLs, the websocket scheme — is derived from it. - Paste the App API key into the same file (see below). Skip it and the app gets 401 on every screen if your backend has a key configured.
- Image URLs resolve automatically against the API origin (
lib/core/utils/media_url_resolver.dart) — no separate media URL to set in most cases. - Make sure the same backend has the mobile features enabled and the API is active.
- Configure push notification keys if you use them (the backend's Mail / SMS / Push settings drive sending).
// lib/core/env/prod_env.dart → used by RELEASE builds
class ProdEnv implements Env {
static const String kBaseUrl = 'https://yourdomain.com/api/v10'; // your API root
static const String kAppApiKey = 'PASTE-KEY-FROM-ADMIN-PANEL'; // Settings → API Security
static const String kReverbAppKey = '...'; // Settings → Realtime, else .env REVERB_APP_KEY
static const String kReverbHost = 'yourdomain.com';
static const int kReverbPort = 443; // 443 behind HTTPS
}
// Image URLs, ApiUrls and the websocket scheme all derive from kBaseUrl — nothing else to set.
Real-time chat: the Reverb key/host/port must match what the backend actually uses. If credentials are saved in Dashboard → Settings → Realtime (Websocket) those win over .env — copy them from that page. Setup details: Real-time Chat (Reverb).
Tip: Use an HTTPS URL. Self-signed/HTTP endpoints are blocked by default on modern Android/iOS and will cause network errors. Languages are loaded from the backend (default English, with automatic RTL) — manage them in the admin's Languages settings.
App API key (X-App-Key)
The backend can require a shared key on every API call. Copy it from the admin panel — Settings → API Security — and paste it into the app's env files, then rebuild.
lib/core/env/prod_env.dart → RELEASE builds (kAppApiKey = your production key) lib/core/env/dev_env.dart → DEBUG / PROFILE builds (your local backend's key)
- Release builds always take
ProdEnv, so a release APK/IPA can never ship your dev URL or dev key. - An empty
kAppApiKeymeans the header is simply not sent — correct only when the backend has no key configured. - The key must match the backend this build points at. Wrong or missing key → 401 Unauthorized on every request.
- Built-in guard: a release build refuses to start if the key is still empty or the URL still points at a dev host (
localhost,127.0.0.1,.test…), so a forgotten swap fails on your desk, not on a customer's phone.
Never regenerate the key after release unless it leaked — apps already installed on phones stop working until users install a rebuilt version. See Security → App API Key.
Notifications — in-app & push (Firebase)
Two layers work together:
- In-app notifications (the bell icon + list) — always work, no setup. The app pulls them from the backend over the API.
- Push notifications (Firebase / FCM) — deliver to the phone even when the app is closed. These need Firebase configured.
Firebase is shared by the backend, this app and the Seller App, so the full procedure is documented once in Common Setup → Push Notifications (Firebase). For this app you place google-services.json in CustomerAppCode/android/app/ and, for iOS, GoogleService-Info.plist in CustomerAppCode/ios/Runner/ — register both against this app's own package/bundle id.
iOS: Android works once the config file is in place, but iOS delivery will not work until the APNs Auth Key is uploaded to the Firebase console. Do not skip that step.
App Name & Icon
Rebrand the app to your store before publishing. It ships as "Customer App" with the application id com.sellino.customer (Android and iOS) — change the name and id to your own.
- App name — Android:
android:labelinandroid/app/src/main/AndroidManifest.xml(it reads@string/app_nameinandroid/app/src/main/res/values/strings.xml). iOS:CFBundleDisplayNameinios/Runner/Info.plist. - Package / Bundle ID — Android
applicationIdinandroid/app/build.gradle.kts; iOSPRODUCT_BUNDLE_IDENTIFIERin the Xcode project.
Generate the launcher icon
The app uses the flutter_launcher_icons package (already in pubspec.yaml) with settings in flutter_launcher_icons.yaml. To rebrand:
- Replace the source images in
assets/branding/(keep the same file names):app_icon.png— the main icon, a 1024×1024 PNG (no transparency; used for iOS and the Android legacy icon).app_icon_foreground.png— the Android adaptive foreground (transparent background, artwork centered with safe padding).app_icon_monochrome.png— the Android 13+ themed icon (single-colour silhouette on transparent).
- Optionally adjust
flutter_launcher_icons.yaml(e.g.adaptive_icon_backgroundcolour). - Generate all Android + iOS icon sets:
flutter pub get dart run flutter_launcher_icons
This overwrites the Android mipmap-* icons and the iOS AppIcon set from your source images. Rebuild the app afterwards (flutter run or a release build) to see the new icon.
Build, Signing & Release
Android — generate a release keystore
Create your own upload keystore once with keytool (ships with the JDK):
keytool -genkey -v -keystore ~/sellino-release.jks \ -keyalg RSA -keysize 2048 -validity 10000 -alias upload
Android — key.properties
Copy android/key.properties.example to android/key.properties and fill in your values:
storePassword=your_store_password keyPassword=your_key_password keyAlias=upload storeFile=/absolute/path/to/sellino-release.jks
The release signingConfigs block is already wired into android/app/build.gradle.kts — it reads key.properties automatically and signs the release build with your keystore. If the file is absent it falls back to debug signing so flutter run --release still works during development. Never commit key.properties or the .jks file (both are in .gitignore).
Android — build
- Testing APK:
flutter build apk --release - Play Store bundle:
flutter build appbundle --release→ upload the.aabto the Google Play Console.
iOS — signing & distribution
iOS builds require a Mac with Xcode and a paid Apple Developer account.
- Open
ios/Runner.xcworkspacein Xcode. - Under Signing & Capabilities, select your Team and set a unique Bundle Identifier.
- Let Xcode Automatically manage signing (creates the signing certificate and provisioning profile), or add them manually from the Apple Developer portal.
- Create the app record in App Store Connect using the same bundle id.
- Build with
flutter build ipa, then upload via Xcode Organizer or the Transporter app.
Heads-up: a paid Apple Developer account (App Store) and Google Play developer account are required to publish, and are not included in this item.
Sign Up & Login
Customers create an account or log in to sync their cart, wishlist, wallet and orders across devices.
- Register with name, phone/email and password, verified by a 4-digit OTP with a resend timer (email OTP, mobile OTP or neither — the admin decides).
- Login with email or phone — the app checks the account first, then asks for the password on a dedicated step, plus social login via a secure web view.
- One identifier box — the same field takes an email or a phone number. Phone entry uses an international picker (flag + dial code), and the number is stored in one canonical form, so typing
01811843300or+8801811843300always reaches the same account. - Forgot password resets via an emailed/SMS code; Change password from the account area.
- Guest browsing is supported; an account is required at checkout for order history.


Home & Navigation
The Home screen mirrors your storefront — sliders, featured categories, deals and product sections you control from the admin's Website & Content tools. A bottom navigation bar gives quick access to Home, Categories, Cart, Wishlist and Account.

Browse & Search
- Categories & Category Products — drill from a category into its products.
- Brands — shop by manufacturer/brand.
- Deals — current flash sales and discounted items.
- Product Feed — an endless, filterable list of products.
- Search — find products by name, with filters and sorting.
- Recently Viewed — quickly return to products you opened.

Product Details & Seller Profile
The Product Details screen shows images, price, variations (size/color), description, FAQ, ratings & reviews and a Q&A section. Customers can add to cart or wishlist, choose a variation and quantity, and ask a question.
Tapping the seller opens the Seller Profile (in multi-vendor mode) with the vendor's other products and rating; the Sellers screen lists every vendor and lets customers follow their favourites.


Wishlist, Recently Viewed & Followed Stores
Customers save products to a Wishlist (favourites) for later and move them to the cart in one tap. Recently Viewed keeps a quick trail of the products they looked at.
Multi-vendor Followed Stores — a Follow button on every seller profile, and a Followed Stores screen in the Account area that lists them all, with unfollow behind a confirmation so nobody drops a store by mis-tap. The same list appears on the website, so following on one surface shows on the other.


Blogs
The app surfaces your store's Blog content — a scrollable list of posts and a full article view with images and formatted text. Posts are pulled live from the backend, so publishing or editing a blog in the admin updates the app instantly, with no rebuild needed.


Cart & Coupons
The Cart lists chosen items with quantity controls and a live total. Customers can apply a coupon code for a discount and see the breakdown (subtotal, discount, delivery) before checkout.
Vacation mode — when the store is on a scheduled break, the app shows your notice on the home, product and cart screens and blocks add-to-cart and order placement, while browsing and search keep working. Turn it on or off from the admin panel; the app picks it up with no rebuild.


Address & Checkout
- Choose or add a delivery address (multiple saved addresses, with a hierarchical country → state → city location picker).
- Select a delivery option and see the charge.
- Pick a payment method from the backend's method list — online gateway, wallet, or cash on delivery.
- Confirm to place the order; a confirmation and order number are shown.
Checkout uses a draft-order flow and the same gateways configured in the admin. Online payment opens the gateway in a secure web view with success / failure / cancel handling, and Cash on Delivery is available when enabled.
- Gateways — the list comes from the admin panel: SSLCommerz, bKash, Nagad, EPS locally, and Stripe or PayPal for international cards.
- Converted amount shown up front — an international method displays the approximate amount that will actually be charged in the gateway's currency (e.g. "≈ $12.40") before the customer commits, using the rate set in the admin.
- Returning to the app — after paying, the app is brought back automatically and lands on the order confirmation; cancelling in the gateway returns to checkout with the cart intact.


Wallet & Reward Points
The Wallet is a prepaid balance customers can recharge, pay with at checkout, and receive refunds into. They can withdraw funds and browse the full transaction history.
Reward Points are earned on purchases and redeemed for discounts or converted to wallet balance, per the rules you set in the admin.





Affiliate
Customers join the Affiliate program to share their referral link/code and earn a commission on referred sales. The app shows their earnings, lets them convert commission to wallet balance, and request withdrawals.




Orders & Reports
From the Account area customers track their orders end to end — status (pending, confirmed, delivered), items, payment and delivery details — and clear any due payment from a quick bottom sheet. Summary reports show their spending and activity.
While an order is still pending, customers can edit it (change items/quantities) or cancel it; after delivery, each item offers Return, Replacement and Write a review actions (see below). The details screen also shows shipment tracking and the estimated delivery time.




Returns, Replacements & Reviews
After an order is delivered, customers can act on any item right from the order:
- Return — request a return, pick a reason, and choose how they want the refund: Wallet (instant store credit), Cash, or Bank transfer. They can follow the request status until it's resolved.
- Replacement — ask for the item to be swapped instead of refunded.
- Write a review — rate and review a purchased product; reviews feed back into the store and product pages.
Deep-links are built in — tapping Return or Replacement from an order pre-selects that exact order, so there's nothing to look up. The Return Policy page (managed in admin) is available from Settings.
Profile & Address
The Account hub links every customer tool in one place. From here customers manage their profile (name, photo, contact), maintain a list of delivery addresses, and change their password.




Chat & Support
Built-in Chat connects customers to a seller in real time straight from the product page (powered by the backend's live chat). A Contact Us screen provides your store's contact details and an inquiry form, and the Help Center answers common questions. Customers can also send suggestions/feedback to the store — these appear in the admin's Customer Suggestions for you to act on.
.jpg)


Settings & Legal
The Settings screen covers language, notifications and account options. When you've set up Firebase in the admin panel, the app receives push notifications for order, delivery and return/refund updates. Legal/info pages are pulled from your admin content:
- About Us
- Privacy Policy
- Terms & Conditions
- Return Policy
Editing these pages in the admin updates them in the app — no rebuild needed.



Changelog
Version 1.0.0
- Stripe & PayPal checkout in the payment web view, with the approximate charged amount shown in the gateway's currency and automatic return to the app.
- Vacation mode — the store's break notice on home, product and cart screens, with ordering paused while browsing stays open.
- Followed stores — follow seller stores and manage them from a dedicated Account screen, with unfollow confirmation.
- One identifier field — email or international phone in a single box for login, signup, OTP and password reset; 4-digit OTP codes.
- New home sections mirrored from the website — deals countdown, featured categories, shop-by-category and app-download blocks; category icons on the category grid.
- Order list filtering with inline loader, FAQ / How-it-works content screens, and YouTube video support on product details.
- Initial release of the Sellino Customer App (Flutter, Android & iOS).
- Browse categories, brands, deals, product feed, search and recently viewed.
- Product details with variations, reviews, Q&A and seller profiles.
- Cart, wishlist, coupons and checkout with multiple addresses and location picker.
- Online payment (SSLCommerz) and cash on delivery, wallet, reward points and affiliate.
- Order tracking, pending-order edit/cancel, and shipment ETA on the order.
- Returns, replacements and refunds (wallet / cash / bank) with per-item product reviews.
- Push notifications (Firebase) for order, delivery and return/refund updates.
- Real-time chat support, profile management and blogs.
- Multi-language with RTL support; secure (encrypted) auth-token storage.
FAQ
Q: Does the app need the website to be live?
No. It only needs the backend's API to be reachable.
Q: Where do I set my server URL?
In lib/core/env/prod_env.dart (release builds) — set kBaseUrl to https://yourdomain.com/api/v10. Debug builds read dev_env.dart.
Q: Why do I get network errors?
Almost always an HTTP (non-HTTPS) or unreachable API URL, or CORS/SSL issues. Confirm the URL opens in a browser and is served over valid HTTPS.
Q: Can I change the app name and icon?
Yes — see App Name & Icon. Set a unique package/bundle id too.
Q: Do content and products update without an app update?
Yes. Products, banners, categories, blogs and legal pages come from the backend live.
Q: Which payment methods work in the app?
The same gateways you enable in the admin (e.g. SSLCommerz, bKash), plus wallet and cash on delivery.