DEV3 Lidwick – Subscription Box Laravel Script with Editions, Dunning, Gifts & Deferred Revenue

A self-hosted subscription box platform on Laravel 12 and Filament 4: boxes on monthly editions, cut-offs, skips, pauses, plan changes, gifts, dunning, store credit and deferred-revenue accounting. Web installer and demo data included. No mobile apps.

by DEV3 TechnologiesVerified Author(0) 0 sales 0 viewsUpdated 05 Nov 2026

Video tour. Pick a section below to browse 106 screenshots in 8 sections.

App & phone tours

Tap play to watch each app. Nothing downloads until you do.

  • Mobile web1:06

Lidwick is a subscription box platform that you host yourself, built by DEV3 Technologies on Laravel 12 and Filament 4. A merchant sells a few boxes (Standard and Deluxe) on terms of several months, ships one edition a month, and lets subscribers manage everything themselves. The demo business is a fictional tea, soap and seed-packet shop, Tansy & Finch of Aldermere.

No live demo: 106 grouped screenshots and two video tours show the 3D marketing site, the join wizard, the subscriber account and the admin panel. Install it with the bundled demo data to try every role on your own server. This product has a web application only: there are no Flutter or native apps.

What subscribers get

  • A 3D marketing site where a kraft box lifts its lid and the month's items rise, with a night theme and an Arabic home page.
  • A quiz and join wizard: pick a box and a term, set preferences and allergens, pay by card, and the box is held for 30 minutes if a payment fails.
  • A subscriber account built around a month ring and one next action instead of an order table: skip a month, pause, resume early, change plan, update the card and see credit.
  • Preferences with hard exclusions (nuts, dairy and more) that can never be overridden, re-checked at packing and again at shipping.
  • Plan changes that print the difference on a slip: an upgrade bills the difference, a downgrade becomes store credit, never a card refund.
  • Gifts: three, six or twelve boxes sent on a chosen day with a claim code.
  • Problem reports within thirty days of delivery, store credit, and coupons that apply once, repeat or forever.

Editions, allocation and fulfilment

  • An edition board with dates, capacity and a slots grid (one row per slot, Deluxe-only slots marked). Dates lock once billing has started.
  • Allocation runs with a dry run: each box gets items that fit its slots and the subscriber's exclusions. Boxes that cannot be filled are marked short or needs review for a person to decide.
  • A waitlist that never offers a box on a closed edition, a forecast of capacity against reserved boxes, item stock with allergen tags, and a reveal scheduler.
  • Shipments with carrier and tracking, and shipped editions that move to their own column.

Billing, dunning and money

  • Renewals are billed on each edition's bill time. Failed renewals are retried on days 1, 3, 5 and 7 and then suspended, with a dunning queue, write-offs and goodwill credit capped at a support limit.
  • Card money is applied only when the gateway confirms payment. A sweep job catches captured payments whose invoice is still unpaid.
  • Deferred revenue: every invoice carries its deferred and recognised amounts, each shipped box releases its share, and a nightly check fails loudly if the ledger does not tie out. Finance has a reconciliation page.
  • Early refunds work out paid value minus consumed boxes at the monthly list price, and claim the term first so a refund cannot run twice.

Admin panel

  • One Filament panel with roles for admin, curator, finance, fulfilment and support: dashboard with MRR, active subscribers and the next cut-off, a cycle wheel, retention heatmap by start month, churn, editions, items, subscribers, invoices, coupons, an event trail that cannot be edited, settings, an audit log and roles.
  • A REST API under /api/v1, light and dark themes, and English with a partial Arabic translation (see Good to know).

What is included

  • The Laravel application with Composer packages and compiled assets inside (no Node.js or Composer on the server), a web installer with demo or empty data, and HTML documentation.
  • Demo data for the fictional shop: about 1,400 subscribers, 9,580 box orders, 7,126 invoices and 8,337 charge attempts over eleven months.

Good to know

  • Stored-card charging needs developer work for real gateways. Card payments and renewals work out of the box on the simulated gateway. Charging a saved card for a renewal on Stripe, Razorpay and PayPal is not finished: those chargers are guarded stubs that refuse to run until a developer completes them. Plan this work before you take live renewals.
  • Arabic is partial. Only the home page, the navigation and the account overview are translated and mirrored. The rest of the site and the admin panel are English.
  • No mobile apps. Subscribers use the responsive web account.
  • Rare concurrency edge cases remain. Billing, cancellations and refunds lock rows in one fixed order, and nine race checks on MySQL pass, including Pay now against Cancel. A few unusual paths are known and listed in the documentation: cancelling between a renewal invoice being created and charged does not void that open invoice; a coupon's remaining boxes are not restored when a renewal invoice is voided; two refunds issued at the same instant can both try to refund the same card part; and the capacity forecast can under-count a subscriber who skipped an earlier edition and has no next edition.
  • Live gateways, email and SMS were not tested with real accounts. Run your own sandbox payments before taking real ones.
  • Some 3D scenes need a graphics card. In a browser without hardware acceleration the hero shows a still poster instead of the animation.
  • Databases: MySQL 8 and SQLite were tested for seeding and the checks; MariaDB and PostgreSQL were not.
  • Name: Lidwick is a working name checked by a web search only, not a trademark clearance. Check it before you launch under it.
  • No hosted demo. The brand, people, products and addresses in the screenshots are fictional.

Quality checks

Lidwick 1.0.0 passed the seven release gates of the DEV3 Laravel suite on the final code: static analysis (Larastan level 6, 0 errors), 206 Pest tests with 1,792 assertions, a front-end size budget (10.8 KB of JavaScript and 17.8 KB of CSS gzipped on public pages, with the 3D code loaded only when needed), migrations and seeding on MySQL 8 and SQLite, a headless-browser pass over 175 pages and 35 happy paths with 9 parallel-request race checks on MySQL, an installer test from the package, and a secret scan. The shipped zip is that package with its folder renamed to lidwick/, and it was run through the installer test and secret scan again. Lighthouse scores were not measured.

How it's built

Architecture, stack, key decisions and the quality gates DEV3 Lidwick passed before release.

The engineering behind Lidwick: a recurring-charge seam with a simulated charger, an edition-driven billing run, a fixed lock order, allergen-safe allocation and a ledger that ties out nightly.

The problem it solves

A subscription box looks like a shop with a repeat button until the rules arrive. Subscribers are billed on a schedule, so a failed card needs a retry ladder that does not take the box away on the first miss. Each box ships in a monthly edition with a cut-off, a capacity and a pack lock, so a payment that lands late must not ship a box that was already released. Subscribers skip, pause, change plan and ask for refunds while a renewal is being charged. Allergen exclusions must hold when a box is packed, not only when it is ordered. Finance needs revenue recognised as boxes ship, not when the cash arrives. All of it must stay correct when two requests touch the same subscription at once.

Architecture and approach

Lidwick is a Laravel 12 application with a Filament 4 admin at /admin, Blade pages for the marketing site, quiz, join wizard and subscriber account, and a REST API under /api/v1. It builds on the shared DEV3 Laravel core for settings, roles, wallets, audit and gateways.

One seam for stored cards

The core payment gateway has no stored-card charge, so a RecurringCharger interface is the seam. The simulated charger is complete: one test card pays, one declines, one pays on the third attempt and an expired card returns expired without calling the gateway. Stripe, Razorpay and PayPal chargers exist as guarded stubs that throw until a developer completes them.

Card money is applied on confirmation

A charge attempt row is written first under the invoice lock, and the gateway call runs outside the transaction. Money is applied only when the payment-succeeded event arrives. A settle step that throws is reported and never treated as a decline, and a lifecycle sweep applies captured payments whose invoice is still unpaid.

One lock order

Every path locks in the same order: invoice, subscription, edition, box order, stock, then wallets (the subscriber credit before the platform wallets, platform wallets in id order). A test records the lock order, and a MySQL race runs Pay now against Cancel in parallel.

Editions drive everything

The billing run bills every edition whose bill time has passed. Dunning retries on days 1, 3, 5 and 7. Allocation fills each box from stock for its slots, re-checks allergen tags at pack and at ship, and marks anything it cannot fill short or needs review instead of guessing.

A ledger that must tie out

Invoices carry deferred, recognised and released amounts. A nightly check compares the deferred-revenue wallet with the sum of invoices and every wallet with its entries, and exits with an error if they differ. Finance sees the same check as a reconciliation page.

Quality gates and results

Lidwick 1.0.0 passed the seven release gates on the final code: Larastan level 6 with 0 errors, 206 Pest tests with 1,792 assertions, 175 pages and 35 happy paths in a headless browser, 9 race checks on MySQL, the installer test from the package and a clean secret scan. Public pages ship 10.8 KB of JavaScript and 17.8 KB of CSS gzipped, with the 3D scene loaded lazily. The demo seed holds about 1,400 subscribers, 9,580 box orders and 7,126 invoices, and the ledger check passes on it.

Known limits are listed on the item page: stored-card charging on Stripe, Razorpay and PayPal needs developer work, Arabic covers only part of the site, and a few rare concurrency paths are documented rather than fixed.

Tech stack

Area Technologies
Application Laravel 12, Filament 4, Blade, REST API
Billing RecurringCharger seam, Simulated gateway, Dunning ladder, Deferred-revenue ledger
Concurrency Fixed lock order, Row locks, MySQL race checks
Frontend Tailwind CSS 4, Vite, three.js lid-lift scene
Quality Pest, Larastan level 6, Headless browser smoke, Installer test

Inside the build

Lid lift: A kraft box opens on a paper month ring and tissue unfolds as the month's items rise. Lid lift — A kraft box opens on a paper month ring and tissue unfolds as the month's items rise.

The ring: Each month swaps the items in place, a new edition every month. The ring — Each month swaps the items in place, a new edition every month.

Guides & articles

Practical guides and engineering write-ups for DEV3 Lidwick.

Subscription box software: 7 things to check before you pick one

Last updated
Subscription box software: 7 things to check before you pick one: DEV3 Lidwick

A subscription box is not a shop with a repeat button. Money, stock and dates all move on a monthly clock, and the mistakes show up as angry emails on the 26th. Here are seven things to check before you pick software, with DEV3 Lidwick as the worked example.

Lidwick marketing site: a kraft box opens and the month's items rise

1. Does the month have a cut-off?

Every box ships in an edition with a cut-off date, a capacity and a point after which the contents are locked. Lidwick shows this on an edition board, and editions refuse to change their dates once billing has started.

2. What happens when a card fails?

A decline should not cancel the box on day one. Lidwick retries on days 1, 3, 5 and 7, keeps the box held, shows the subscriber a banner and one button, and suspends only after the last retry. Support can write an invoice off or give goodwill credit up to a limit.

The dunning queue: days since first failure, last stage and next retry

3. Can subscribers manage themselves?

Skips, pauses, resuming early, changing plan and updating the card should all be in the account, with a preview of what each does. A downgrade in Lidwick becomes store credit, never a card refund.

4. Are allergen rules hard rules?

Preferences like "no nuts" must be checked when the box is packed and shipped, not only at sign-up. Lidwick re-checks both times, and a box that cannot be filled is marked for a person to review instead of being filled with a guess.

5. Does the admin explain the money?

Look for deferred revenue: the cash arrives up front, and the revenue is earned as boxes ship. Lidwick keeps that ledger and checks every night that it ties out.

Reconciliation: deferred revenue equals the unrecognised net of every invoice

6. How does it behave under load?

Two things happening at once, such as paying and cancelling, are where subscription software breaks. Lidwick locks rows in one fixed order and runs race checks on MySQL.

7. What is not finished?

Ask for the limits in writing. For Lidwick: charging a stored card on Stripe, Razorpay and PayPal needs developer work (the simulated gateway works out of the box), and the Arabic translation covers the home page, navigation and account overview only.

The admin dashboard in dark mode

Video tour of Lidwick

Frequently asked questions

The complete source code (version 1.0.0) as a download from your account, with the setup and usage guides shown on this page. You can modify the code to suit your product.

Buying guides: Laravel scripts with Filament panels and a web installer · Next.js or Laravel for a SaaS script?

More from this author

View all

Related in Web Scripts & Software

View all