June 2026

Expiry Product Track

Expiry Product Track

This project came from a real incident. I was grilling with friends, and one of them brought expired sauce from his own daily-needs store. We laughed first (and roasted him a bit too πŸ˜…), but it exposed a real problem: expiry checks were still too manual and too easy to miss.

So I built Expiry Product Track to make that workflow practical, not fancy. It helps admins/staff manage batches, track expiry status, and get alerts before products become a customer problem. The frontend is intentionally fully in Indonesian because the first target users were my friends in Indonesia, so they could use it immediately without translating terms first.

Built with Laravel 13 + Inertia React, it includes batch-based purchase history, barcode-assisted stock input, expiry monitoring, and automated cron alerts (dashboard + email). A technical choice I really like is using model scopes plus anti-spam daily bulk notifications, so reminders stay consistent without inbox jumpscares every hour πŸ“¬. I don’t publish or sell this repo publicly, but if your use case matches, I’m happy to share it for free πŸ™Œ

Here's a quick look at how it works in practice:Features:

  • Product & category management with soft deletes and full restore
  • Batch-based stock input with invoice number, quantity, and expiry date
  • Barcode scanner for fast product lookup and stock entry
  • Expiry monitoring dashboard (Expired / Expiring Soon / Safe)
  • Daily consolidated bulk email alert + CSV export (no per-item spam)
  • Mark-as-done flag per batch to suppress future alerts
  • Role-based access control: Administrator & Staff (Spatie Permission)
  • Full activity log audit trail (Spatie Activity Log)
  • Tag-based caching across service layer with auto-invalidation
  • Configurable settings: timezone, reminder threshold days, app name & logo
  • PWA support for mobile installation

Tech Stack:

  • Backend: Laravel 13, PHP 8.3, Spatie Laravel Permission, Spatie Activity Log
  • Frontend: React 18, Inertia.js v2, Tailwind CSS v3, shadcn/ui, Lucide React
  • Build: Vite 8, vite-plugin-pwa
  • Testing: Pest v4

In short: this project is about reducing human error in inventory handling with a simple system people can actually maintain. 

Built With

Laravel 13Laravel 13
Inertia-JSInertia-JS
TailwindCSSTailwindCSS
React JSReact JS