All Day Disc Golf · 2026 · 6 months
A custom storefront for a Portland disc golf shop — built on Laravel, integrated with Clover POS, and shipped through a security pass that closed eight P0 issues before launch.
A typical small-shop e-commerce build is "pick a platform, theme it, plug in payments." That works until the business operates on two surfaces — in-person at the counter and online for the same inventory — and the platform's idea of "inventory" disagrees with the point-of-sale's idea of "inventory."
A bag-and-bucket disc golf shop with foot traffic, league nights, and an online catalog can't run on a stock storefront. Stock at the register has to be the stock on the site, the same SKU has to mean the same disc in both places, and the moment a customer buys a Destroyer in-store, the next online visitor has to see one fewer Destroyer in their cart options. The shop already runs a Clover POS — replacing it isn't on the table.
So we built around Clover instead of in spite of it.
A Laravel 11 storefront, custom Blade UI, MySQL, with the POS as the source of truth for inventory and the storefront as the source of truth for online presentation:
A pre-launch security pass identified eight critical items — input validation gaps, session handling tightening, file-upload hardening, and CSP. All resolved before the storefront went live.
The Laravel base template (a Terrabyte in-house starter) ships with 750+ feature + unit tests covering auth, payments, and the shop pattern; ADDG inherited the suite and added shop-specific cases for the Clover sync path.
A single source of truth for inventory — Clover, with its webhook stream piped into Laravel. The storefront reads, the POS writes. No reconciliation jobs. No "what's actually in stock" guessing.
Most shop-builds treat the POS as a peripheral — "we'll sync nightly." That works until a customer walks in and buys the last item that an online customer has in their cart. We went the other direction: Clover's webhooks are the inventory event stream, Laravel listens, and product pages show real numbers in real time.
The storefront never owns inventory. Inventory belongs to the register. Laravel models the catalog (titles, descriptions, photos, categories, SEO) and treats stock counts as a derived signal from the POS. Out-of-stock is detected the moment the register fires the sale event — no nightly reconciliation, no stale counts.
The cost is that the storefront fails closed if Clover is unreachable — a product page shows "currently unavailable" rather than guessing. That's the correct failure mode for the shop's reputation: better to show a delay than to oversell a Buzzz the in-store player is holding.
ADDG isn't the only shop-shaped client a solo studio sees. The build sits on top of a Terrabyte in-house Laravel template — the same base that powers a print-on-demand storefront and a nonprofit fundraising platform. Reusing the base means auth, payments, admin scaffolding, and the test culture come "for free"; the project budget goes to the Clover sync and the storefront UX, not to rebuilding the parts every Laravel app needs.
The pre-launch security pass — eight P0 items resolved before public traffic hit the site — was non-negotiable. The class of bug that lives in a shop checkout flow (input validation, session handling, file upload, CSP, secrets handling) is the class of bug that ends up in a security-incident write-up if you ship it. The pass added two weeks to the timeline and was worth every day.
Final pre-launch QA at time of writing. The storefront is feature-complete, the Clover integration is running against the shop's real register, and the security pass is closed. Public launch lands in the days after this case study publishes.
A custom Laravel + Clover storefront for a Portland disc golf shop, with the POS as the inventory source of truth, 750+ tests inherited from the in-house Laravel base, and a documented pre-launch security pass that closed eight P0 issues before public traffic. The build proves the Terrabyte Laravel base accelerates serious shop work without compromising the security or testing culture that makes it shippable.
Post-launch: a small admin layer for the shop owner to schedule banner content and event listings without engineering involvement, a tightening of the search experience for the disc catalog (faceted by flight numbers, plastic, manufacturer), and an evaluation of whether the same template should power additional Portland-area independent shops on a multi-tenant footing.