Two sales channels running off one physical shelf — a card-payment
storefront and an eBay store. The whole system turns on separating stock
from the things that sell it: a sellable is assembled from stock units, so
availability is computed from its components rather than stored, and a
matching set and the single piece built from the same unit draw each other
down automatically. Both channels call one stock service, which debits the
shelf and re-pushes availability to every affected eBay listing. Built end
to end on Laravel with a Filament back office.
- Stock engine. An append-only movement ledger where every
entry carries an idempotency key built from the order and line, so a
re-synced eBay order or a retried payment webhook cannot double-count.
Editing a count by hand moves through the same path as a sale and reaches
eBay like any other change.
- eBay Sell API integration. OAuth, inventory publishing,
multi-variation listing groups, availability and sold-count read-back,
importing listings created outside the app, plus category taxonomy and
business policies. A refusal from eBay is treated as an ordinary outcome
that lands on the item for a human; only transport failures retry.
- Pre-publish validation. A chain that checks the listing
against eBay's own category rules before publishing — required item
specifics, allowed values, length limits, cross-aspect constraints, numeric
aspects — so the seller reads the problem in the app instead of a
refusal a minute later.
- Variation editing. A combinations grid generated from the
attributes a listing varies by, matching already-filled rows on an
order-independent signature so regenerating adds what is missing instead of
discarding SKUs, stock and photos that live eBay offers depend on.
Reorderable, because option order is the order a buyer picks from.
- Storefront and checkout. Blade and Tailwind shop with a
session basket that re-resolves price and availability on every read, so a
basket left open overnight cannot charge yesterday's price. Card details
never reach the application; the signed webhook is the only thing that marks
an order paid, and it debits stock once per line.
- Back office. Filament panel over inventory, the shelf,
eBay and web orders, shipping and tracking, refunds with stock reversal,
reusable listing prefills and storefront pricing.
- Background work. Queued publishes and availability pushes
that collapse a burst into a single call and read live counts when they run,
scheduled listing and order syncs, a buyer-data retention scrub, and a
reconciler that asks the processor what became of any pending order the
webhook never reported.
- Deployment and tests. Provisioning and deploy scripts
that never touch the live database, photos or environment, and a suite of
223 tests with eBay and payments faked at their seams so no HTTP leaves the
test run.
- Scope
- Full build, both channels
- Stack
- Laravel, Filament, Tailwind, Stripe, eBay Sell API
- Sector
- Resale & apparel
- Status
- Live, ongoing