E-commerce development
Laravel E-commerce Development
Custom commerce backends for businesses a platform no longer fits - stock that cannot oversell, an order state machine, tax that survives an audit, and payment webhooks that arrive twice.
Most businesses should not build their own shop. A hosted platform is cheaper than a codebase for as long as the business fits inside it, and the honest advice for a catalogue of two hundred simple products is that it fits.
The work below starts where it stops fitting - and it usually stops fitting in the back office rather than the storefront.
Where a platform actually runs out
Pricing that is a rule, not a number. Contract pricing per customer, tiered quantity breaks, a trade account with different terms per product group. Most platforms model a price and a discount, and everything past that becomes a spreadsheet somebody maintains by hand.
Stock that lives in more than one place. Two warehouses, a physical shop, a marketplace channel and a supplier drop-ship route. The question "how many can we sell" stops having a single answer, and the platform's answer is the one that oversells.
An ERP that is the source of truth. When the accounting system owns price and stock, the shop is downstream of it. A platform that assumes it owns those fields will fight the integration for the life of the project.
Fulfilment that is a workflow. Partial shipments, backorders, a picking step, a manufacturing lead time. An order that is not simply paid-then-shipped is where platform workflow engines end.
The parts we build carefully, because they are where money is lost
Stock that cannot oversell. Reading a stock level and then decrementing it is a race, and under a flash sale it is a race that runs hundreds of times a second. The decrement is a conditional update the database decides:
$claimed = Inventory::where('variant_id', $id)
->where('available', '>=', $qty)
->decrement('available', $qty); // 0 means somebody else took itAbove that sits a reservation with an expiry - stock held while a checkout is in progress and released if it is abandoned - because the alternative is either overselling or holding stock forever for carts nobody completed.
An order as a state machine, not a status column. Which transitions are legal, which are irreversible, and what each one is allowed to touch. A status column set from four different controllers is how an order ends up shipped and refunded and still awaiting payment.
Payment webhooks that arrive twice, late, or out of order. Every provider sends duplicates, and the capture notification can arrive before the redirect that was supposed to precede it. Webhooks are verified, stored raw, and processed idempotently against a provider reference, so a repeat is a no-op rather than a second fulfilment.
Tax computed once, at the right moment, and recorded. The rate that applied on the day of the order is part of the order, not a lookup performed again when someone opens the record a year later. Where you sell across borders, place of supply and the customer's registration status change the answer - and the rule that produced each line has to be stored beside the amount, because that is what an audit asks for.
Money as integers, always. Minor units, with the currency and its exponent stored. Floating point in a commerce system produces a ledger that never balances and a reconciliation nobody can close.
The integrations that decide the project
Commerce projects are rarely one system. They are a shop, an ERP or accounting package, a payment provider, a carrier, sometimes a PIM and a marketplace.
What makes them succeed is deciding ownership before writing code: which system owns the stock number, which owns the price, which owns the customer. Every integration disaster we have been called into started with two systems both believing they owned the same field, and resolved by nightly jobs overwriting each other in alternating directions.
Then the mechanical part, which is the same discipline as any integration work: retries with backoff, an outbox so nothing is lost when the other end is down, and a log of what was sent that a human can read when a customer asks where their order is.
The admin side, which is most of the actual usage
The storefront gets the attention and the back office gets the hours. Order search that works on a partial reference, a customer's full history on one screen, a refund that is one action rather than four, and a stock adjustment that records who made it and why.
We build these on an admin panel rather than from scratch, because a bespoke CRUD screen is not where the value is - and because the people using it eight hours a day would rather have something conventional than something clever.
How an engagement runs
The first conversation is about money rather than code. Where orders are lost today, what the admin side costs in staff hours, and which integration everybody is afraid of.
From that we write the scope: the phases, the integration list, what happens to your existing URLs, and the price. Nothing is built before that document is signed, because in a store the expensive mistakes are made in week one and found in month six.
The build then runs in phases that each end deployed. Checkout is never the first thing we touch and never the last thing we test.
What you get
A commerce backend with the rules written down and enforced in one place, an order model that can explain its own history, integrations with an owner per field, and a test suite covering the paths that move money - checkout under concurrent stock pressure, duplicate webhooks, partial refunds, tax at the boundaries.
If you are not yet sure whether building is the right answer, it usually is not, and an audit of what you have now will say so faster and more cheaply than a proposal will.
