When we set out to create QR-Kode.no, we didn’t start entirely from scratch. We began with an existing SaaS codebase, a functional but fairly generic QR code generator. It worked, but it lacked flexibility, scalability, and a modern developer experience.
Instead of reinventing the wheel, we decided to customize, optimize, and expand it into something far more powerful. Our goal was to turn a simple generator into a platform that businesses, marketers, and developers could rely on for real-world use cases — from payments and menus to analytics and API integrations.
In this post, I’ll share how we transformed that base code into a feature-rich platform, the architecture decisions behind it, and what we learned about building and scaling a SaaS product efficiently.
Starting from an existing foundation
The original SaaS system had a solid core: a working QR generation engine, basic templates, and user authentication. But most of the logic was monolithic and front-end heavy. It also lacked proper support for modern features like dynamic QR codes, custom branding, analytics, and developer APIs.
Our first step was to modularize the architecture — separating code generation, analytics tracking, and user management into distinct services. This allowed us to scale each independently and prepare for heavier usage without breaking the app.
We also rebuilt the front end with a cleaner UI/UX, better accessibility, and clearer feature grouping. The goal was that anyone, even without technical experience, could generate a QR code in seconds — while developers could integrate the system through an API.
Core features we implemented
We focused on three user types: everyday users who need quick static codes, professionals who want analytics and dynamic control, and developers who prefer API access.
1. Free basic generation:
Anyone can create static QR codes instantly — no signup, no limits. It covers all standard types: URLs, text, vCards, Wi-Fi, events, and more.
2. Design customization:
We added color controls, gradient support, logo uploads, rounded shapes, and preview checks for scan reliability. Users can download high-resolution PNG, JPG, SVG, or EPS files suitable for print.
3. Dynamic QR codes:
These use redirect URLs stored in the database, allowing users to change destinations later. They also support analytics, password protection, and expiry dates. The system handles redirects via a lightweight API endpoint optimized for high throughput.
4. Analytics and tracking:
We track total and unique scans, country, device type, and timestamps. For scale, raw scan logs go through a queue before aggregation. We use cached summaries so dashboards load fast even under heavy load.
5. BioLink and digital business cards:
We introduced simple landing pages where users can collect multiple links under one QR code. This helps with marketing and social campaigns while reducing the need for external link-in-bio tools.
6. Developer API:
One of our most requested features was programmatic QR generation. We built a REST API for static and dynamic code creation, editing, and analytics access. Token-based authentication makes it easy to integrate with third-party systems.
Making it scalable
One of the challenges with QR generation is that users can create and download large image files at once. To handle this:
- We made the QR generation process stateless and ran it as a microservice.
- Each request triggers an on-the-fly render using optimized libraries for vector and raster output.
- Images are cached temporarily via CDN for repeated downloads.
- Analytics data is processed asynchronously using a queue-consumer model.
This approach allowed us to scale horizontally without rewriting the whole stack. The microservice can run multiple instances behind a load balancer and auto-scale based on demand.
Building a better front-end experience
The UI was built with a focus on instant feedback and minimal friction. The preview updates in real time, and the design parameters are validated to prevent unscannable codes. We used clear color contrast warnings and scan simulations to maintain usability.
A big UX decision was reducing “form fatigue.” Instead of overwhelming users with fields, we show only relevant options based on the QR type. If you choose “Wi-Fi,” for example, only SSID, password, and network type fields appear. Small things like this make the app feel smoother.
Developer features and API use cases
For developers, the API is the real power tool. It lets teams integrate QR generation directly into their workflow — for example:
- Automatically generating QR codes for invoices or tickets.
- Creating dynamic marketing campaigns with redirect tracking.
- Generating personalized codes for user accounts or referral programs.
Endpoints support JSON payloads, token authentication, and batch creation. We also implemented rate-limiting and logging to prevent abuse and monitor usage. Future updates include webhook callbacks for scan events, which would allow real-time automation.
Lessons learned
Building on an existing SaaS codebase saved months of work, but it also came with technical debt. Here are a few lessons from the process:
- Understand the original structure before refactoring. Changing too much at once breaks stability.
- Modularize early. Separate concerns so new features can evolve without touching core logic.
- Optimize for the 80%. Most users need fast static generation first — analytics and dynamic features can come later.
- Always test scan reliability. Custom designs look great, but readability under poor lighting or small sizes is the true test.
- Add analytics sooner than later. It’s easier to track usage from day one than to retrofit metrics later.
- APIs multiply value. Once developers can connect programmatically, your tool becomes part of their ecosystem.
Future improvements
We’re currently expanding support for teams and multi-user organizations, adding more file types (PDF, WebP), and integrating webhook alerts for scan events. There’s also work underway to support white-label custom domains for enterprise clients.
We’ve also been exploring smarter features like auto-generated short links, QR design templates, and integration with AI-based logo placement for better layout detection.
Final thoughts
Building QR-Kode.no taught us that improving an existing SaaS product can be just as creative as building one from scratch. The foundation was there, what mattered was structure, performance, and user experience. By focusing on modular architecture, developer access, and thoughtful UX, we turned a simple QR generator into a scalable platform that supports thousands of users and millions of scans.
If you’re working on a similar transformation project, start small, measure everything, and don’t underestimate how far solid customization and architectural cleanup can take you. Sometimes the best way to innovate is not to start over, but to make something existing genuinely excellent.
Top comments (0)