DEV3 Refilo – Water & Gas Delivery Laravel Script with Bottle Deposits, Cylinder Serials & Van Load (Flutter Apps)

A self-hosted water and LPG refill platform on Laravel 12 and Filament 4 with customer and driver Flutter apps: returnable-container deposits, tracked cylinder serials, delivery windows with gas capacity, vans loaded by weight, coupon books and cash on delivery. Installer and demo data included.

by DEV3 TechnologiesVerified Author(0) 0 sales 0 viewsUpdated 05 Nov 2026

Video tour. Pick a section below to browse 115 screenshots in 31 sections.

App & phone tours

Tap play to watch each app. Nothing downloads until you do.

  • Customer app1:10
  • Driver app1:08

Refilo is a water and gas delivery platform that you host yourself, built by DEV3 Technologies on Laravel 12 and Filament 4, with two Flutter apps: one for customers and one for drivers. Households and small businesses order 19-litre water bottles and LPG cylinders on repeat. The hard part is not the order but the containers: every customer holds a counted number of returnable bottles and cylinders, deposits are real liabilities, cylinders have serial numbers and test dates, and a van has a payload, a slot count and a legal LPG limit. The demo business is a fictional Gulf city, Wadi Sarab, priced in dirhams with 5% VAT included and deposits outside VAT.

No live demo: 115 grouped screenshots and a desktop video tour show the marketing site (a flat typographic hero with mock-ups drawn in code, and no photographs), the public product pages, the web account, the admin panel and both apps. Install it with the demo data to try every role on your own server.

Customers

  • A public site with water and gas pages, a deposits page, coupon books, a business page, safety and areas pages, and a web account with a My Supply home, a refill order form with an empties field per product and a quote panel.
  • A customer app whose home is My Supply: your shelf of bottles and cylinders with the estimated days left, always tagged as an estimate, and one big Same again button.
  • Quantity and empties steppers with the deposit change updating as you go: hand back one empty fewer than you receive and the app says you keep a new bottle and shows its deposit. Goods, delivery and stairs are shown apart from the refundable deposit.
  • A gas safety check for the first gas order at a site (ticked questions, a photo and a signature), delivery windows as tiles with open, few left, closed and "no gas capacity" states, and payment by card, wallet or cash on delivery.
  • Tracking with a van on a route and an ETA, counts at the door, the deposit change and a receipt, a review, coupon books with a stamp strip and a refund preview, auto-refill plans with the next three runs and a skip, a deposits screen with account closure and an inspection result, a wallet and an unpaid-balance block for a missing empty.

Drivers

  • A driver app whose home is the Van Bay: a flat rear view of the van's rack with full, empty and gas containers, the weight and slot bars and the next stop below it.
  • Load-out against the depot manifest, a run list and route map, an arrive screen with floor, lift and a stairs badge, and a swap screen with steppers for bottles handed over and empties taken back, the deposit change and the cash due.
  • Cylinder scanning out and in (camera or typed serial) that checks each serial against the register and its test date, refuses a cylinder that is out of test or not in the register, and a first-gas-install checklist with a signature and photo.
  • Cash, pay link and coupon payment, failed stops with a reason and photo, express offers with a countdown ring, an offline queue that replays swaps, failed stops and cash hand-ins without double counting, a return count with variance lines, a cash hand-in, earnings and a cash-out.

Admin panel

  • A dashboard with key figures, delivery charts and a flat Depot Rack showing racks of bottles and cylinders, docked vans with a weight bar and the quarantine cage.
  • A slots board (zones by delivery window, with separate bars for unit slots and LPG), a run map, an express queue, orders by status, order detail with lines ordered against delivered, empties and the deposit change, and failed deliveries.
  • A run builder that ticks orders into a van with a live load by stop and refuses an overweight load, runs, vans with payload and legal LPG limit, drivers with licence and LPG permit expiry, and a load-out desk.
  • A return count desk with variance, a cylinder register with serial history, a test-date queue, quarantine, container accounts, account closures, refill plans, coupon books, deposit liability, remittances, pending refunds and reports.

Deposits, containers and money

  • A deposit is owed on containers held, not on refills. It is a liability outside VAT and outside revenue, and a check compares the deposit liability against the container accounts.
  • Van load is computed by weight, and an LPG window has its own capacity, so a window can be full for gas while water is still open.
  • Delivery totals are recomputed from what was actually delivered and swapped at the door. Card refunds are written in the same transaction as the money, sent after commit and retried. A reconciliation command (refilo:check) checks deposit liability, coupon liability, van stock and every wallet.
  • Every deadline is enforced when a record is read, so nothing waits for the scheduler. Money is stored in the smallest currency unit.

What is included

  • The Laravel application with Composer packages and compiled assets inside (no Node.js or Composer on the server), both Flutter projects in apps/, the shared DEV3 Flutter package, a web installer and a short setup page in Documentation/.
  • Demo data for the fictional Gulf city: about 9,000 orders with stops, container moves, cylinders with serials, coupon books, plans, runs, remittances and delivery windows.

Good to know

  • The buyer guide in the package is a short setup page. Documentation/index.html covers requirements, install, cron, the API addresses and where the settings are. The feature descriptions are on this page, in each app's README and in the OpenAPI description at /api/v1/openapi.json.
  • Payments, SMS and push are simulated by default. The simulated gateway works out of the box, so ordering and paying need no keys. Stripe, Razorpay and PayPal drivers are included but were not run against real accounts. Real push was not exercised.
  • Auto-refill by saved card is not finished for real gateways. Only the simulated charger is complete, so charging a saved card on a real gateway needs developer work. Until you finish it, a plan whose order cannot be charged falls back to cash, coupon or wallet with a pay link.
  • Stripe refunds have no idempotency key yet. A gateway timeout after Stripe accepted a refund can be retried, so retries need buyer review before you go live with real card payments.
  • The apps were not tested on physical devices. They build as debug Android packages and run on the iOS simulator. The cylinder scanner and the location checks were compiled and run on simulators only; typing a serial is always available and goes through the same checks.
  • The driver app has some gaps. It cannot mark a van back (the return count is done by depot staff), there is no reorder-request endpoint, foreign cylinders are always refused in the app, and the swap figure at the door is an estimate until the server answers.
  • Days left is an estimate. Refilo does not measure how much water or gas a household has used, and every days-left figure is tagged as an estimate.
  • Some things are in the apps, not on the web. The web account has no reschedule and no review. In the customer app, site setup picks a zone centre, not a pin on a map.
  • Arabic has not been reviewed by a native speaker. The apps and the home page include Arabic with right-to-left layout.
  • Use MySQL or MariaDB on a live site. The Pest tests run on SQLite, where row locks do nothing; the concurrency checks that prove the locking run on MySQL 8.
  • Name: Refilo is a working name checked by a web search only, not a trademark clearance. A search found names close to it in the same market, so check it before you launch under it.
  • No hosted demo. Every customer, driver and record in the screenshots is fictional. Install it with the demo data to try every role on your own server.

Quality checks

Refilo 1.0.0 passed the seven release gates of the DEV3 Laravel suite on the final code: static analysis (Larastan level 6, 0 errors), 389 Pest tests with 4,215 assertions, a front-end size budget (26.1 KB of JavaScript and CSS gzipped), migrations and seeding on MySQL 8 and SQLite, a headless-browser pass over 95 pages and races with 21 happy paths, an installer test from the zip, and a secret scan. The customer app passed analysis and 368 tests, and the driver app 287 tests, with debug Android and iOS simulator builds. A review of the money, container and load code found 21 issues, all fixed with regression tests. Lighthouse scores were not measured on the final code.

How it's built

Architecture, stack, key decisions and the quality gates DEV3 Refilo passed before release.

The engineering behind Refilo: deposits as a liability checked against container accounts, serial-level cylinder moves, delivery windows with separate gas capacity, a pure load calculator and a fixed lock order.

The problem it solves

A water and gas round is a container problem. Customers hand back fewer empties than promised, a cylinder may be past its test date or not ours at all, a van can be over its legal gas limit, and a window can be full for gas while water is still free. Deposits are money owed back, drivers swap at the door with no signal, and a refund must neither be lost nor sent twice.

Architecture and approach

Refilo is a Laravel 12 application with a Filament 4 admin at /admin, a public website with a customer account and a REST API used by two Flutter apps.

Deposits and containers

A deposit is owed on containers held, not on refills. Pure classes for deposit, load, coupon, cancellation and supply maths are tested against shared vector files, and both apps run Dart ports against the same vectors. A reconciliation command compares the deposit liability with the container accounts.

Cylinders

Every cylinder is a serial with a state, a location and a test date. A swap moves serials between depot, van and customer in one transaction, refuses a cylinder past its test date or missing from the register and has no bypass for typed serials.

Capacity and load

A delivery window reserves unit slots and LPG weight under a row lock, so gas can be full while water is open. The run builder computes the load by stop from product weights and van limits.

One lock order

Every path locks in the same order through one entry point, and deadlines are enforced when a record is read. Card refunds are rows written in the money transaction, sent after commit and retried.

Apps

The customer and driver apps share one API contract with the server, keep swaps, failed stops and cash hand-ins in an offline queue with their own keys, and start in a demo mode that needs no server.

Quality gates and results

Refilo 1.0.0 passed the seven release gates on the final code: 389 Pest tests with 4,215 assertions, 95 pages and races in a headless browser with 21 happy paths, the installer test from the zip and a clean secret scan. The customer and driver apps pass analysis and 368 and 287 tests.

Limits are listed on the item page: payments and push are simulated by default, saved-card auto-refill is not finished for real gateways, Stripe refunds have no idempotency key yet and the package ships a short setup page rather than a full guide.

Tech stack

Area Technologies
Application Laravel 12, Filament 4, Blade, REST API
Delivery Delivery windows with LPG capacity, Run builder with load by weight, Swap at the door, Express offers
Containers Deposit liability check, Cylinder register, Test-date queue, Quarantine
Apps Flutter customer app, Flutter driver app, Shared dev3 Flutter package, Offline queue and demo mode
Quality Pest, Static analysis, Headless browser smoke, Shared test vectors

Inside the build

Refill hero: The headline and refill button beside three flat cards: My Supply with days left, a deposit receipt, and a Van 2 card with its loaded-by-weight bar. Refill hero — The headline and refill button beside three flat cards: My Supply with days left, a deposit receipt, and a Van 2 card with its loaded-by-weight bar.

Four beats: Short cards under the hero that say what Refilo tracks: bottles and cylinders, deposits, tested serials and loaded-by-weight vans. Four beats — Short cards under the hero that say what Refilo tracks: bottles and cylinders, deposits, tested serials and loaded-by-weight vans.

Guides & articles

Practical guides and engineering write-ups for DEV3 Refilo.

Water and gas delivery software: 7 things to check before you pick one

Last updated
Water and gas delivery software: 7 things to check before you pick one: DEV3 Refilo

Water and gas delivery is a container business with a delivery attached. Here are seven things to check before you pick software, with DEV3 Refilo as the worked example.

Refilo home: the headline beside My Supply, a deposit receipt and a van card

1. Does it track empties per customer?

Each customer holds a count of bottles and cylinders. Check that a delivery updates it and that handing back fewer empties changes the deposit.

The deposit counter on the marketing site

2. Are deposits kept apart from revenue?

A deposit is money owed back. Refilo keeps it outside revenue and checks the liability against the container accounts.

3. Are cylinders tracked by serial?

Look for a register with test dates, a queue for cylinders due for a test and a quarantine for those held back.

The cylinder register

4. Can the app refuse a bad cylinder?

A driver scanning a cylinder past its test date, or one that is not in your register, should be stopped with no bypass.

The driver app refusing an out-of-test cylinder

5. Is gas capacity separate?

A delivery window can be full for gas while water is still open, and a van has a legal LPG limit.

6. Are vans loaded by weight?

The run builder should show the load by stop and refuse an overweight van.

The run builder

7. What is not finished?

Ask for the limits in writing. For Refilo: payments and push are simulated by default, auto-refill by saved card is not finished for real gateways, Stripe refunds have no idempotency key yet, and the package ships a full buyer guide in Documentation/index.html.

Video tour of Refilo

Frequently asked questions

The complete source code (version 1.0.0) as a download from your account, with the setup and usage guides shown on this page. You can modify the code to suit your product.

Buying guides: Laravel scripts with Filament panels and a web installer · Next.js or Laravel for a SaaS script?

More from this author

View all

Related in Web Scripts & Software

View all