A few weeks ago, I challenged myself to build another micro SaaS.
Instead of creating another AI-powered tool, I wanted to solve a simple, real-world problem.
Restaurant owners still spend time and money printing menus every time prices change or new dishes are added.
The solution seemed straightforward: build a QR Menu Builder that lets restaurants manage their menu online and generate a QR code for customers.
The idea was simple.
Building it wasn't.
In this article, I'll share some of the architectural decisions, challenges, and lessons I learned while building it with Laravel 12, React, Inertia.js, and Tailwind CSS.
The Tech Stack
I wanted a stack that I already trusted.
Backend
Laravel 12
PHP 8.4
MySQL
Frontend
React
Inertia.js
Tailwind CSS
Vite
Laravel remains my first choice because it allows me to move quickly without sacrificing code organization.
React + Inertia gives me a modern SPA experience without maintaining separate frontend and backend applications.
For a solo developer building multiple micro SaaS products, this combination has been extremely productive.
Designing the Database
One mistake I've made in previous projects was coupling everything together.
This time I kept the database simple and modular.
restaurants
├── categories
│ └── menu_items
│
├── qr_codes
│
└── scans
The relationships are straightforward.
Restaurant
hasMany Categories
Category
hasMany MenuItems
Restaurant
hasMany Scans
Keeping the hierarchy shallow made queries easier and reduced unnecessary joins.
Why I Didn't Store Everything in JSON
It can be tempting to store the entire menu in a JSON column.
Something like this:
{
"categories": [
{
"name": "Starters",
"items": [...]
}
]
}
While this works for small applications, it quickly becomes difficult when you need:
search
analytics
ordering
filtering
reporting
Using proper relational tables makes future features much easier to implement.
Generating QR Codes
QR generation turned out to be one of the easiest parts.
Using Laravel packages, generating a QR code is surprisingly simple.
$url = route('restaurant.menu', $restaurant->slug);
QrCode::format('svg')
->size(300)
->generate($url);
I chose SVG instead of PNG because:
smaller file size
scales perfectly
looks sharper when printed
easier to embed
Routing the Public Menu
One decision I made early was separating the public menu from the dashboard.
Instead of URLs like
/restaurant/25/menu
I switched to
/menu/the-coffee-house
Using slugs provides cleaner URLs and is much better for SEO.
Laravel makes route model binding with slugs incredibly easy.
Route::get('/menu/{restaurant:slug}', ...);
Building the Dashboard
The dashboard only has a few sections.
Restaurant
Categories
Menu Items
QR Code
Settings
Analytics
I intentionally avoided adding dozens of menus and settings.
Restaurant owners don't want complicated software.
They just want to:
update prices
add dishes
hide unavailable items
print their QR code
Sometimes fewer features create a better product.
Mobile First
One lesson I've learned from previous SaaS projects:
Never treat mobile as an afterthought.
Restaurant owners often update their menu from their phones.
Every page was designed to work comfortably on smaller screens.
Tailwind CSS made responsive layouts much easier than my previous Bootstrap projects.
Performance Considerations
Even a simple menu can contain hundreds of items.
To keep loading fast, I:
eager loaded relationships
optimized database indexes
cached public menus
optimized images
lazy loaded admin components
The public menu should feel almost instant because customers scan it while sitting at a table.
SEO Matters More Than I Expected
Initially, I treated this like a typical SaaS landing page.
Then I realized most restaurant owners search for phrases like:
Free QR Menu
QR Menu Builder
Digital Restaurant Menu
Restaurant QR Code Menu
So I spent time improving:
semantic HTML
structured headings
FAQs
landing page content
internal linking
metadata
Good SEO takes longer than building features—but it's worth the investment.
What I'd Do Differently
If I started again, I'd probably build:
multi-language menus from day one
menu templates earlier
image optimization pipeline
analytics dashboard sooner
Building real software teaches you things that planning never will.
What's Next?
Some features I'm currently working on include:
📊 Scan analytics
📱 WhatsApp ordering
🍽️ Multiple menu templates
🌍 Multi-language support
📅 Pre-order menus
⭐ Featured dishes
I'm trying to keep the product simple while solving genuine problems for restaurant owners.
Final Thoughts
Building small SaaS products has become one of my favorite ways to learn.
Every project forces me to think about architecture, UX, SEO, performance, and deployment—not just writing code.
This QR Menu Builder started as a weekend idea and has grown into a practical project where I can experiment with Laravel, React, and product development.
If you're building your own micro SaaS, I'd love to hear how you structure your projects and what stack you're using.
You can also check out the project here:
👉 https://www.smarteyeapps.com/qr-menu
Tags:
Top comments (0)