All projects
Mobile App
Live in production

Pakka Logistics — Porter-Style Delivery Platform

Pakka Logistics is a Porter-style delivery platform for India. We built all of it: Android apps for customers and drivers, a business portal, an operations console and the website. The web platform is live; the Android apps are being prepared for Google Play.

For Pakka LogisticsMay–Oct 2026
  • Android customer app
  • Android driver app
  • Pakka for Business portal (web)
  • SuperAdmin console (web)
  • Marketing site
Pakka Logistics home page hero on desktop

Overview

Pakka Logistics Private Limited is a Bengaluru delivery company for parcels and goods, using everything from couriers on foot and two-wheelers to large trucks. CountryDevs built the whole platform: a customer app and a driver app for Android in React Native, two Node.js backends on MongoDB, the Pakka for Business portal and the SuperAdmin console in Next.js, and the public website at pakkalogistics.com.

A customer books a parcel, sees the fare before pickup and follows the driver live on a map; the parcel changes hands against a code at each end. Drivers are matched from the nearest eligible pool, keep their earnings in an in-app wallet, and work either on a prepaid plan with no per-trip commission or on commission. Businesses get bulk, multi-stop and recurring shipments, their own drivers on the same app, monthly GST invoices and an API with signed webhooks.

The web platform has been in production since 31 August 2026. The two Android apps finished a pre-submission QA pass on 14–15 October 2026 and are not yet listed on Google Play. There is no iOS app. The figures on this page come from our own trackers, probes and cost study, not from production traffic.

How we cut the apps' route requests per delivery from 151 to 1

Live tracking in Pakka has two parts. The driver's position streams to the customer over Socket.IO, which costs nothing per update. The road line on the map comes from Google's Directions API through our backend, which caches routes in Redis. Every Directions call is billed.

The bug

The route hook in both apps re-ran whenever the driver moved more than 11 metres, throttled to once every 10 seconds. The server's cache key rounded coordinates to about 1.1 metres, so a moving vehicle missed the cache every time: one billable call every ten seconds per open map, or ₹2.58 a minute. The driver's trip screen is the navigation view and stays open for the whole delivery, so a 30-minute trip billed roughly ₹77 on the driver's phone alone, whether or not a customer was watching. Both call sites carried a comment saying "one fetch per leg". It was not true.

The fix

  • Driver movement alone never fetches a route while a road line is on the map.
  • A route is fetched when the leg changes (pickup to drop) or when the driver is more than 150 m off the drawn line, at most once every 30 seconds so GPS noise at the edge cannot thrash.
  • The ETA is recomputed on the phone from the distance left along the line, and the line is trimmed to the road ahead.

Distance to the line is measured to the nearest segment, not the nearest point. Server polylines are sparse: a driver halfway along a straight stretch can be 500 m from both ends while sitting on the road. A nearest-point check would call that a deviation and bring the cost straight back.

One gap remains, found in October 2026 while capturing the apps against a local backend with no Google key: when Google returns no route at all, the map stays empty, so every position update fetches again and the booking preview retries until the rate limiter answers 429. Failed fetches need the same back-off as successful ones.

How we proved it

The decision logic is one pure function shared by both apps, so the test replays a simulated 25-minute drive and counts calls: 151 position updates, one fetch. A second test makes sure a driver who really leaves the route does trigger a refetch, so "fetches once" cannot pass by never fetching again.

What one delivery costs to run

We traced one booking through the code and priced every third-party call it makes, for a cash-paid trip (an online payment adds the gateway fee).

Step Consumer trip Business trip
Pickup and drop address search ₹2.90 ₹0.00
Route preview ₹0.43 ₹0.00
Map loads ₹2.40 ₹1.80
Live-tracking routes ₹1.72 ₹0.86
Pickup and drop SMS codes ₹0.40 ₹0.40
Proof-of-delivery photo ₹0.01 ₹0.01
Driver matching ₹0.00 ₹0.00
Total ₹7.86 ₹3.07

Google Maps is ₹7.45 of the consumer trip's ₹7.86. Matching a driver costs nothing: it runs on a MongoDB $geoNear query and local distance maths, never on Google. A business trip costs less than half because nobody types an address and the portal draws no map, so what is left is the cost of the delivery itself.

What changed because of it

Cost follows trips, not fare. A two-wheeler runs about 4.7 times as many trips as a large truck to use the same plan allowance, so plans now carry trip caps for two- and three-wheelers, while trucks never reach theirs.

Business quotes were priced on straight-line distance × 1.25. We measured that against 90 real Bengaluru routes: it under-charged on 72 of them, and by 10% on average across all 90. Business quotes now use real road distance from Directions, cached per route, because a 43-paise route call recovers ₹23–67 of fare.

The unit prices are Google's and MSG91's public rates; the study marks them to be checked against a real bill. The ranking of where the money goes does not depend on them.

Driver wallet, prepaid plans and payouts

Every driver has a wallet backed by a ledger. Online fares, tips and UPI collections add to it; commission, plan purchases and the cash a driver is holding count against it. A driver works either on a prepaid plan, which unlocks an amount of business with no per-trip commission while it runs, or on commission. A new driver starts on commission and unlocks plans after a set amount of delivered business.

Plans are paid from the balance

Google and Apple take 15–30% of in-app purchases of digital features, and a driver plan could be read that way; customer fares, a physical service, are exempt. We read both stores' rules, removed the card option, and made a plan come out of money Pakka already owes the driver. The app asks before it spends.

Cash, settle-up and UPI

Commission drivers have a cap on the cash they may hold, and Settle up lets them pay Pakka's share back through Razorpay. A UPI QR on the driver's phone lets a customer pay Pakka directly, so his balance grows instead of his debt.

The books

Every money movement posts a double-entry journal entry, and one whose debits and credits differ cannot be saved. Entries are append-only and corrected by reversal; each stores a SHA-256 hash of itself and the previous entry, so an edit made straight in the database breaks the chain. The books export as Tally XML.

Payouts

A withdrawal debits the balance at once and joins a queue in the console. On approval, a worker in the mobile backend sends it through RazorpayX and webhooks confirm it; a failed payout comes back as a new ledger entry. That path is built and tested against RazorpayX's webhooks but ships switched off, so approved withdrawals are paid by bank transfer from the same queue for now.

Before production, a probe of the money routes found two confirm endpoints that trusted figures sent by the phone. Both now read the plan, the driver and the amount from the Razorpay order itself.

Pakka for Business: dispatch, billing and an API

Pakka for Business is the portal a company's dispatch desk works from. A new company signs up, submits its GSTIN, PAN and billing address, and cannot ship until Pakka's operations team approves the KYC.

Shipping

  • Single and multi-drop shipments from saved addresses. The server prices every vehicle class for the whole route, extra stops included, and marks the classes that cannot carry the load, with the reason.
  • Bulk CSV upload. Every row is validated and priced on the server before anything is booked; a row that breaks a rule is flagged, not booked.
  • Recurring runs. Daily, weekday or weekly schedules create shipments by themselves at a set Indian time.
  • Own fleet. A company adds its own drivers, who use the same Pakka Driver app but are offered only that company's work. A shipment the fleet does not take in time (five minutes by default) overflows to Pakka's pool. Company vans are checked out to a driver, with a trail and geofence crossings.
  • Receiver tracking. Each drop gets a no-login link with status, the driver's first name and vehicle, and progress.

Billing

A daily job assembles draft invoices from delivered shipments for each Indian calendar month. A person issues them, which takes the next gapless serial in the financial-year series and freezes the amounts and both parties' GST details. A shipment can be billed only once; voiding an invoice releases its shipments for re-billing.

Developer API

Companies create live and sandbox keys in the portal and book shipments from their own systems. Keys are stored as SHA-256 hashes so a request is matched by lookup, not by trying every stored hash. Webhooks are signed with HMAC-SHA256 over a timestamp and the body and retried at 1 m, 5 m, 30 m, 2 h, 12 h and 24 h; an endpoint that fails eight times in a row is switched off. Sandbox events never reach a live endpoint, and redirects are not followed.

Launch readiness, measured rather than estimated

We do not report progress from a to-do list. A route-inventory tool lists every operable API route and reads, from a ledger the probes write, whether each one has been driven. On 22 September 2026 it read 260 of 270 routes operated (96.3%), with support and settings fully covered and money at 51 of 52. The tool exists because a hand-kept checklist once read "216 / 216 — 100%" while regenerating it gave 216 of 244: 28 routes had shipped and never been run.

Release ledger

Every APK is recorded with its git tag, commit, sha256, signing certificate and the backend commit it expects. Two builds had already shipped under one version number with different contents, and one build that said BUILD SUCCESSFUL still pointed at the build laptop because Metro had cached the bundle. A verifier script now reads the API address out of the built APK and checks the certificate before anything is shared.

The pre-Play Store QA pass

On 14–15 October 2026 we click-tested and break-tested both apps screen by screen on an Android 16 emulator, the way store testers work: back gestures, killing the app mid-flow, double taps on submit, airplane mode, a stopped server. 28 defects were logged, each with its own root-cause folder, and all 28 were fixed. Two would have blocked release:

  • the apps asked for access to all photos for one-off picks, which Play's photo policy rejects. They now use the system photo picker;
  • a Pay-now booking was offered to drivers before it was paid, so an abandoned checkout could be delivered for free. Online bookings now wait as "awaiting payment" and are searched only once the payment verifies.

Release builds 1.0.13 (customer) and 1.0.14 (driver) were cut on 15 October. The pass continues through the remaining checklist before the apps are submitted to Google Play.

The challenge

A Porter-style business has three sides that each need their own product — the sender, the driver and the business account — and an operations team that has to see all of it. Money is the hard part. Drivers collect cash on some trips and are paid online on others, so the platform has to know at every moment who owes whom. Businesses expect GST tax invoices with serial numbers on a monthly cycle, not a receipt per trip. And Pakka chose prepaid driver plans alongside per-trip commission, which only works if the cost of serving a driver's trips stays below what the plan brings in.

Cost was the second constraint. A delivery app leans on Google Maps for address search, map loads and routes, and each is billed per call. Live tracking can quietly become the biggest line on that bill, and on a low-fare two-wheeler trip a few rupees of Maps cost decides whether the trip makes money.

The solution

We split the system along its real seams. The mobile backend runs everything a phone touches: booking, quoting, tiered driver matching, live trips over Socket.IO, wallets and Razorpay. The web backend runs the business portal, the developer API, invoicing and the SuperAdmin console. Both share one MongoDB database, and the models they share are kept byte-identical and diffed by our tools, so a booking means the same thing on both sides.

Money goes through a double-entry ledger that refuses unbalanced entries, cannot be edited after the fact and exports to Tally. Live tracking streams the driver's position over the socket and fetches a road route once per leg. Business quotes are priced on real road distance with a route cache. Every release is recorded with its git tag, commit and APK checksum, and API coverage is measured by a tool rather than estimated.

The impact

What exists now: pakkalogistics.com, the SuperAdmin console and the Pakka for Business portal at app.pakkalogistics.com, both backends in production since 31 August 2026, and customer and driver app releases 1.0.13 and 1.0.14, cut on 15 October 2026 after a QA pass that found and fixed 28 defects. Pakka's own testers have used signed release builds on real phones since September; the apps are not yet on Google Play.

Before launch, a probe had exercised 260 of the platform's 270 operable API routes (22 September 2026). Checkout, refunds, tips, settle-up and payouts were exercised end to end against Razorpay's test mode. The tracking fix took a 25-minute delivery from about 151 route requests to one, and our cost study puts the third-party cost of a business trip at ₹3.07 against ₹7.86 for a consumer trip.

Features

What we built into Pakka Logistics

Booking from walkers to large trucks

Customers book on-demand, scheduled, multi-drop Bulk (two to five drops on an optimised route) or last-mile jobs across five classes: couriers on foot, two-wheelers, three-wheelers, small trucks and large trucks. A class that cannot carry the parcel is shown with the reason.

Tiered driver matching

The nearest eligible drivers are found with a MongoDB geo query in widening rings (3, 7 and 15 km by default), and the offer rings on their phone through Firebase even when it is locked. If the timed offers lapse, the booking moves to an open board where every eligible driver sees it and the first to accept wins. If nobody accepts, the customer is reminded at 10 minutes and the booking is cancelled at 20.

Live tracking on a socket

The driver's position streams to the customer over Socket.IO. The road route is fetched once per leg, refetched only if the driver leaves it by more than 150 m, and the ETA is recomputed on the phone.

Handover codes and proof photos

Pickup and drop each need a code from the sender or receiver, and a drop needs a photo. A code stops working after five wrong tries, and if photo storage is down a delivery can still be completed under a recorded waiver.

Driver onboarding and verification

Drivers upload their licence, RC, insurance and photo in the app. Operations approve or reject each document in the console, and an unapproved driver is offered no work.

Driver wallet and prepaid plans

Online fares, tips and UPI collections build a wallet balance. Drivers work on a prepaid plan with no per-trip commission or on commission; plans are bought from the balance, and withdrawals go through an approval queue.

Pakka for Business portal

Bulk CSV upload, multi-drop and recurring shipments, a live tracking board, the company's own drivers and vans, receiver tracking links and monthly GST invoices, behind a KYC check.

Developer API with signed webhooks

Live and sandbox API keys, shipment endpoints and HMAC-signed webhooks with a six-step retry ladder, so a company can book and track from its own systems.

Live coverage map on H3 hexagons

Every 60 seconds the web backend places eligible online drivers and unassigned bookings on H3 resolution-8 cells (about 0.74 km² each) and rates each cell from oversupplied to critical. A driver counts in the 37 cells around him, kept just inside the 3 km first dispatch ring. It is a measuring instrument for operations; pricing and dispatch do not read it.

SuperAdmin console

26 admin screens for bookings, trips, drivers, customers, companies, pricing, zones, payouts, invoices, disputes and settings, with an audit log of privileged actions and books that export to Tally.

By the numbers
96.3%
API routes exercised by a probe before launch (260 of 270)
1
Route requests from the apps on a 25-minute delivery after the tracking fix (was about 151)
₹3.07
Estimated third-party cost of a business trip, from the project's cost study (consumer trip: ₹7.86)
28
Defects found and fixed in the pre-Play Store QA pass
Screens

What Pakka Logistics looks like

Pakka send-a-parcel page on desktop
The page for individual senders: a parcel, pallet or full truck booked from a phone, tracked the whole way and handed over against a code, with the fare fixed before pickup.
New shipment form in multi-drop mode with priced vehicle options and estimate panel
Booking a multi-drop run from saved addresses: the server prices every vehicle class for the whole route, including extra-stop fees, before anything is booked.
Bulk upload preview with valid rows priced and one row flagged as an error
A CSV of shipments is validated and priced row by row on the server before booking; rows that break a rule (here a 450 kg parcel on a two-wheeler) are flagged instead of booked.
Multi-drop shipment detail with three pending drops and an in-transit timeline
One vehicle, three drops: per-drop status, the shipment timeline, driver card, cost breakdown with extra-stop fees, and a receiver tracking link per drop.
Public tracking page for an in-transit delivery
The no-login page a business's receiver opens from the tracking link: current status, the driver's first name and vehicle, a progress timeline and the drop address — for their own drop only.
Scheduled logistics page with three recurring dispatch schedules
Recurring dispatch schedules (daily, weekdays, weekly) auto-create shipments at a set IST time; each can be paused or edited without touching shipments already created.
Developers page with production and sandbox API key cards, webhooks panel and quick start code
Self-serve API keys (live and sandbox), signed webhooks and a quick-start request for booking shipments from the company's own systems.
Billing page with credit line card and an issued invoice expanded to its shipments
Credit line usage, the company's rate terms and issued GST invoices with the shipments each one covers.
Pakka SuperAdmin dashboard with KPI cards, driver position schematic, needs-attention list and live activity feed
The operations home shows today's GMV, bookings, live trips and online drivers, a driver-position map (schematic here because no Maps key is configured locally), a needs-attention queue and a live activity feed.
Zones and surge page with coverage schematic, observed H3 cells and zone list
Operating zones with demand tier and surge multiplier, next to H3 cells observed live from driver positions and open bookings.
Verification queue with a selected applicant and per-document approve and reject buttons
New driver applications are reviewed document by document (licence, RC, insurance, photo) with approve/reject per document and the applicant's vehicle details alongside.
Payouts queue with requested and awaiting-transfer payout rows
Driver withdrawal requests move through review, approval and transfer; balances are debited at request time and every action is a ledger entry.
App screens

Inside the mobile app

Pakka customer app map with an On the way pill, a two-wheeler marker heading to the drop pin, a delivery-code hint and the driver card with ETA
Once the parcel is picked up, the customer's booking switches to On the way: the rider's marker moves as positions arrive over the socket, the card shows the rider, plate and ETA, and a hint says the recipient will be asked for the delivery code. No road line is drawn in this local run because no Directions key is configured.
Pakka driver trip requests list with an Open first-to-accept request and Accept button, two Missed requests and earlier accepted ones
The driver's trip-request history for one booking: two timed requests for one booking expired as Missed, and the booking then went onto an open first-to-accept board with 18 minutes left. Earlier requests the driver took sit below.
Pakka driver full-screen New trip request with a 14-second countdown, You'll earn 74 rupees, pickup and drop, and Decline and Accept buttons
A new request takes over the driver's screen with a countdown ring (14 seconds left), what the driver will earn after commission, the approximate duration, pickup distance and trip length; it declines itself if not accepted in time.
Pakka driver trip screen titled On the way to drop with a map, the drop address and recipient, and Arrived at drop and Open in Google Maps buttons
After pickup the trip screen follows the driver on the map toward the drop, shows the recipient with a call link, and offers Arrived at drop and hand-off to Google Maps. No road line is drawn in this local run because no Directions key is configured.
Pakka customer app showing Driver at pickup on a map, an OTP via SMS hint naming the sender's phone, and the driver card
With the driver at the pickup, the booking screen tells the customer that the driver will ask the sender for the pickup code by SMS; the app itself never displays the code.
Pakka vehicle picker listing Walker, Two-Wheeler, Three-Wheeler, Small Truck and Large Truck with prices and reasons on the unavailable ones
One quote prices all five classes, from walker to large truck. For a 25 kg parcel the walker and two-wheeler are greyed out with the weight limit as the reason, and the large truck is marked not available for on-demand. The 14.1 km is straight-line distance in this local run.
Pakka driver At pickup screen with four filled code boxes, a resend timer and a Confirm pickup button
At the pickup the driver enters the 4-digit code the sender received by SMS, and Confirm pickup unlocks once it is complete. The sender here is a seeded test phone, so the backend's test bypass supplied the code and no SMS was sent.
Pakka driver trip screen titled Drop 1 of 3 with a map and a This run list of three numbered drops
A business's three-drop run on the driver app: the current drop with its contact, and a run list showing drop 1 now, drops 2 and 3 waiting, and 0 of 3 delivered.
Pakka driver wallet with available to withdraw, Pay as you go 20% fee card, cash holding limit bar, See plans and Statement
The driver's wallet: the withdrawable balance, the earning mode (pay as you go, 20% per fare, with a nudge toward a plan) and how much more of Pakka's cash the driver can hold before trips pause.
Pakka driver plans screen showing Plans unlock at 2,500 rupees with a progress bar, and a comparison of commission paid against the Basic plan price
Plans stay locked until a driver has delivered a set amount of business (here ₹499.80 of ₹2,500); meanwhile the screen compares the commission paid in the last 30 days with what the Basic plan would cost.
Pakka review screen with pickup, Drop 1 of 2 and Drop 2 of 2 with recipients, package and vehicle, and a fare breakdown including extra stops
A Bulk booking from one pickup to two drops, each with its own recipient, priced as one run with an extra-stop line and GST; in Bulk mode the sender pays cash at pickup.
Pakka review and confirm screen with contacts, a fare breakdown with GST, Pay now and Cash on delivery options, and a note about OTP timing
Before booking, the customer sees the fare broken into base, distance and GST, chooses Pay now or Cash on delivery (selected here), and is told that the pickup and delivery codes are texted only when the driver reaches each stop.
Pakka Delivered screen with booking summary and a sheet to rate the driver and add a tip of 10, 20, 50 rupees or another amount
When the driver completes the drop, the customer's app switches to Delivered on its own, with the booking, route and cash total, then asks for a rating and offers a tip that the driver keeps in full.
Pakka driver statement listing Pakka commission debits and a trip earning credit with running balances
Every credit and deduction with a running balance: 20% commission taken on cash fares, a trip earning paid net of commission, and the balance moving from owed to credit.
Pakka driver Withdraw screen with an In progress card for 166.95 rupees, Approved transfer on the way, and a past withdrawals list
A withdrawal approved in the console: the amount has already left the driver's balance and is shown as approved, transfer on the way, to the bank account ending 5678.
Pakka driver earnings screen with Earned this week total, a weekly bar chart, Available to withdraw and a list of trip earnings
Earnings for the week with a per-day bar chart, the withdrawable balance, the commission mode, and each trip's earning marked as cash. All seeded trips are from the capture day, so only one bar is filled.
Pakka driver Under review screen with Verifying you now, a time-left bar and a list of submitted and not-uploaded documents
A new driver who has submitted a licence, RC, insurance and photo waits under review, with an estimate of the time left; the PAN card and vehicle photos still show as not uploaded. No trip requests arrive until approval.
Pakka customer home with a Driver at pickup banner, Where are you sending card, service grid and saved places
The customer home with a live-booking banner (driver at pickup, with name, vehicle and plate), the booking entry point, the four services (Walkers, Scheduled, Bulk, Last-Mile) and saved places.
Project details
Tech stack
React NativeTypeScriptRedux ToolkitNode.jsExpressMongoDBRedisSocket.IONext.jsGoogle Maps PlatformFirebase Cloud MessagingRazorpayRazorpayXH3AWS S3MSG91
Timeline & team
May–Oct 2026
FAQ

Questions about this project

How are drivers paid out in the Pakka driver app?

Earnings collect in an in-app wallet backed by a double-entry ledger. A withdrawal debits the balance at once and waits in an approval queue in the console; approved payouts go by bank transfer today, and a RazorpayX path that sends and confirms them automatically is built and ready to switch on.

Can a company use its own drivers on Pakka?

Yes. A company adds its drivers in Pakka for Business; they sign in to the same Pakka Driver app but are offered only that company's shipments. A shipment the company's fleet does not take in time, five minutes by default, overflows to Pakka's driver pool.

How does Pakka invoice business customers for GST?

A daily job drafts each company's invoice from shipments delivered in the Indian calendar month. Operations staff issue it, which assigns the next gapless serial number for the financial year and freezes the amounts and GST details; a shipment can only ever be billed once.

Is the Pakka app on Google Play and the App Store?

Not yet. The Android customer and driver apps finished a pre-submission QA pass on 14–15 October 2026 and are being prepared for Google Play; there is no iOS version. The website, business portal and operations console are live.

More work

Other things we shipped

All projects
Storafleet fleet overview with storage totals, trend line, transfers list and per-provider footprint barsFeatured
Saasfor Storafleet

Storafleet — Multi-Cloud Storage Control Plane

Storafleet is CountryDevs' own SaaS control plane for object storage. Teams connect buckets they already own on 50+ providers, including AWS S3, Cloudflare R2, Backblaze B2, Wasabi and MinIO, then browse, migrate, search, secure and cost-check them from one console.

Next.js 15ReactRedux ToolkitNode.js+11
50+Storage providers in the connection roster
Case study
Superadmin stories grid with photo storiesFeatured
Mobile Appfor Slic Solutions Private Limited

LetSlic — Social Media App with Group Chat, Stories and Premium

LetSlic, listed on Google Play as Slic, is a social app for photo posts, 24-hour stories and real-time chat with group moderation. We built it for Slic Solutions Private Limited: the React Native app, two Node.js APIs, the superadmin console and the website, plus Premium and ads.

React NativeTypeScriptReduxNode.js+13
13Months from first commit to handover (Jun 2025 – Jul 2026)
Case study
LeafRanger home page hero with headline 'Your plants have an expert now' and a Herb chat cardFeaturedLaunching
Mobile Appfor LeafRanger

LeafRanger — AI Plant Care App and Plant Marketplace

LeafRanger is CountryDevs' own AI plant-care app. We built the Android and iOS app, two Node.js backends, the admin and vendor consoles and leafranger.com: photo plant ID and diagnosis, light-mapped rooms, weather-aware watering and a multi-vendor plant shop.

React NativeTypeScriptRedux ToolkitKotlin+11
~$0.004Measured cost of one AI vision scan
Case study
Got a project?

Let's build the
next one together

Tell us what you're trying to ship. We'll come back with a scope, a timeline, and a fixed price — usually within 48 hours.

Not ready for a full build? Start with a fixed-price Discovery Sprint, or get a code audit of an app someone else built.

More on what we build from Bangalore for Indian businesses: App Development Company in Bangalore.