Skip to content

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 it

Above 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.

Scope and terms

Engagement model
Fixed scope, agreed in writing before work starts. Not a day rate against an open backlog.
Price and timeline
Both are set per project, once the scope is. Quoted together, before anything is built.
What we need from you
One person who can approve decisions, and access to your repository and issue tracker.
Not included
Anything outside the agreed scope. It becomes its own scope rather than a variation order.
Third-party costs
Hosting, licences, API fees and SaaS subscriptions are contracted and paid by you.
Invoicing
Codefacture Yazılım A.Ş., Türkiye. EUR, USD or GBP by bank transfer, with no Turkish VAT on exported services.

Frequently asked questions

Why build rather than use Shopify or a package?
You should not, until the platform is the thing costing you money. The point at which building is cheaper is specific and recognisable: pricing rules the platform cannot express, stock held across warehouses or channels it does not model, or an ERP that has to be the source of truth rather than a downstream copy.
Do you use an e-commerce package?
Where one fits, yes, and we will say so - inheriting a maintained package is cheaper than owning a cart. The packages struggle where the catalogue is unusual, where pricing is contractual rather than listed, or where stock is shared with something outside the shop. Those are the cases we are usually called for.
Who handles card data?
The payment provider, through a hosted field or a redirect, and the application never sees a card number. That is not only a security position but a scope one - it keeps you in the smallest PCI DSS bracket available, and the alternative is an annual audit you do not want to be paying for.
Can it integrate with our ERP or accounting system?
Yes, and on these projects it usually has to. The important decision is made early and in writing - which system owns stock, which owns price, and which owns the customer record. Two systems each believing they own stock is the single most expensive integration fault in commerce.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page