In short: Loop2Tech built a custom point of sale system with a connected online storefront for an electronics retail and repair business in Karachi. One inventory table serves the counter and the website, repair jobs move through a tracked workflow instead of a paper diary, and the storefront runs on the same Laravel application rather than a separate platform that needs syncing. The system is live at pos.loop2tech.com.
The client ran two operations out of one shop: selling parts and accessories over the counter, and repairing phones and laptops. Those two operations were tracked in completely different places, and neither talked to the other.
Counter sales were recorded in a spreadsheet. Repair jobs lived in a notebook. Stock counts were done by eye. When a customer called to ask whether a screen was in stock, somebody walked to the shelf. When a repair needed a part, nobody knew whether taking it off the shelf would break a sale that had already been promised to someone else.
They also wanted to sell online. Every off-the-shelf option they had looked at solved one half of the problem: an e-commerce platform that knew nothing about repairs, or a repair ticketing tool that could not take a payment. Running both meant maintaining two stock figures and reconciling them by hand every evening.
The deciding factor was the shared inventory. A part on the shelf can be sold to a walk-in customer, sold through the website, or consumed by a repair job, and all three routes draw down the same physical unit. No packaged product we evaluated modelled that third route.
Bolting a repair module onto a standard e-commerce platform would have meant a nightly sync between two databases, and a nightly sync means a window in which the website sells something the technician already used. For a business with single units of many parts, that window is where the customer complaints come from.
We wrote about how to make this call in general terms in our guide to custom software versus off-the-shelf. This project is the case where custom wins clearly: the workflow is genuinely unusual, and the cost of getting it wrong is visible to customers.
The whole system is one Laravel application with three interfaces sharing one database, so there is no synchronisation layer to fail.
| Interface | Who uses it | What it does |
|---|---|---|
| Counter POS | Shop staff | Barcode scan, cart, split payment, receipt, returns |
| Storefront | Customers | Category browsing, brand filters, wishlist, cart, checkout |
| Admin back office | Owner and manager | Stock, purchasing, repair jobs, pricing, reporting |
A single stock ledger (an append-only record of every movement in and out of inventory) sits underneath all three. Nothing writes a stock figure directly. Every sale, return, purchase, repair consumption, and manual adjustment appends a row, and the current quantity is derived from the ledger. That design makes the count auditable: when a number looks wrong, you can read the history that produced it rather than guessing.
A repair job in this system carries a customer, a device, a reported fault, a technician, a status, and a parts list. When a technician assigns a part to a job, the stock ledger records the movement immediately, which removes that unit from what the storefront can sell.
Job status moves through a fixed sequence so the counter staff can answer "is it ready?" without walking to the workshop. Statuses are visible at the counter and drive the customer notification, which was the single change the client noticed most: the phone stopped ringing with status questions.
Karachi retail runs through power and connectivity interruptions. A POS that stops taking money when the line drops is worse than a paper receipt book.
The counter interface holds an in-progress sale in local browser storage and only clears it once the server confirms the write. If the connection drops mid-sale, the cart is still on screen when it returns. This is unglamorous engineering that never appears in a feature list, and it is the part of the build the staff actually rely on.
The public storefront was treated as a search asset from the first sprint rather than something to optimise after launch, because retrofitting structure into a live catalogue costs more than building it correctly.
Product images arrive from staff phones at full resolution. On the first build, a single uploaded photo could be several megabytes, which would have destroyed Largest Contentful Paint on every page it appeared on.
We moved resizing and WebP conversion into the upload pipeline itself rather than relying on staff discipline. The original is kept, derivatives are generated on upload, and the storefront never serves the raw file. This is the fix we recommend in almost every audit, and it is the one clients most often skip because it is invisible until the catalogue is large.
A custom POS is the right answer when your operation has a workflow that packaged software does not model, and the wrong answer when it does not. Retail with an attached service arm, businesses where one stock pool feeds several sales channels, and operations where the reconciliation work between two systems has become somebody's daily job are the three patterns where the maths works.
If you sell standard products through standard channels, a configured Shopify store will serve you better and cost far less. We say so regularly, including to clients who arrived asking for custom work.
If you are weighing this up for your own business, our custom web solutions service starts with a scoping engagement that produces a written recommendation, including a recommendation not to build when that is the honest answer. Tell us about your operation and we will map the workflow before quoting anything.
Yes, and the strongest version does not connect two systems at all. In this Loop2Tech build, the counter POS and the online storefront are two interfaces on one Laravel application reading a single stock ledger, so there is no sync interval and no window in which the website can sell stock that has already been consumed by a repair job. Integrations between separate systems are possible but always carry a lag, and that lag is where overselling happens.
A retail POS with a connected storefront is a twelve to twenty week build depending on catalogue complexity, payment requirements, and how many workflows beyond selling need modelling. Loop2Tech runs these in two-week cycles with a staging link open throughout, so the client sees the counter interface working with their own product data well before launch rather than at a final reveal.
The counter interface in this system holds an in-progress sale in local browser storage and clears it only after the server confirms the write, so a dropped connection leaves the cart intact on screen rather than losing the transaction. Any POS built for a market with unreliable connectivity needs this behaviour designed in from the start, because it cannot be added convincingly afterwards.
For a straightforward retailer selling standard products, Shopify POS is the better choice and Loop2Tech recommends it regularly. Custom becomes the better option when the business runs a workflow the packaged product does not model, such as a repair operation drawing parts from the same inventory the storefront sells, or when reconciling two separate systems has become a daily manual task.
On every Loop2Tech custom build the client owns the source code, the database, the hosting accounts, and the documentation outright. This is written into the engagement rather than assumed. Any arrangement where the agency retains ownership of the application is a lock-in clause, and it is worth reading a contract specifically to check for it before signing.
Confidential (electronics retail and repair, Karachi)
28 August, 2026