The Problem: Bad Email Addresses Are Quietly Destroying Deliverability
Email lists decay at roughly 22% per year. People change jobs, abandon addresses, and give fake emails at signup. If you send to a list with 5% invalid addresses, most email service providers will throttle or block your sending domain. Your legitimate emails — order confirmations, password resets, actual customer communication — start landing in spam or bouncing entirely. The damage compounds silently over months before most teams notice.
Existing tools were often expensive for individual users and small teams, and almost none offered convenient one-click verification while you're actively prospecting in a browser tab. I wanted something that worked at the point of use — not just in bulk upload workflows.
Why I Built Qverio
The immediate trigger was a client project: a B2B sales team that had imported 40,000 contacts from LinkedIn into their CRM and wanted to email all of them before a product launch. Running that list through an existing tool returned results, but the interface for reviewing and acting on the results was clunky. More importantly, the sales reps who were adding new contacts daily had no way to verify emails inline — they had to remember to run bulk checks weekly.
I decided to build a verification tool with a good API, a browser extension for real-time lookup, and pricing that didn't penalise individual users doing small volumes.
Technical Architecture
The backend is Laravel, running on a dedicated server separate from the queue workers. This separation is intentional and important — web requests and email verification jobs have completely different resource profiles. A web request must respond in milliseconds. An SMTP verification handshake might take 2–5 seconds per domain on first contact. Mixing them on the same process pool would starve the web tier during verification load spikes.
Verification: Using a Specialist API
Building raw SMTP verification infrastructure from scratch means solving a very deep set of problems: rate limiting at major providers, catch-all domain detection, greylisting, IP reputation management, and more. These are infrastructure problems — not product problems. Solving them well takes months and ongoing maintenance.
The right call was to integrate with a dedicated email verification API for the actual verification step. This gave Qverio access to professional-grade accuracy from day one — including catch-all detection and multi-layer validation — while allowing the engineering focus to go where the real product value is: the SaaS layer built around verification.
That SaaS layer is where Qverio earns its place. The verification API is a commodity; the credit billing system, bulk CSV processing, recurring schedule engine, REST API with API key management, browser extensions, usage analytics, and verification log are not. Those are the features that make Qverio a usable product rather than a raw API call.
The three results every verification returns — Deliverable,Undeliverable, or Risky — map directly to actionable decisions: send, skip, or send with caution. The dashboard and bulk exports are built around these three states to make triage fast.
Queue Architecture: Separating Bulk from Real-Time
Qverio handles two fundamentally different verification workloads. A single-address lookup from the API — used at a signup form, or from the browser extension — must respond quickly because a user is waiting. A bulk CSV upload with thousands of addresses can process asynchronously over several minutes. Mixing these in a single queue lets bulk jobs starve real-time requests.
Laravel's queue system handles this naturally: different job types are dispatched to separate queues with different worker priorities, so a large bulk job never delays an inline API lookup. The bulk verification dashboard shows real-time progress as the job processes — row counts, deliverable/undeliverable/risky tallies, and export availability.
Recurring verification jobs add a third pattern: scheduled re-verification of existing lists on a user-defined cadence. These run at off-peak times to avoid competing with interactive traffic.
Credit Billing: A Lesson in Database vs Stripe
Qverio uses a credit-based billing model — you buy credits, each verification costs one credit. The implementation lesson most people learn the hard way: Stripe is the source of truth for billing events. Your database is the source of truth for credit balances. Never conflate the two.
Credits are stored and decremented in a database column with a database-level transaction that prevents double-spending. Stripe webhooks trigger credit top-ups when payments complete. The user-facing balance is always read from the database, never from Stripe. This gives complete flexibility to issue promotional credits, handle refunds, or add referral bonuses without touching billing infrastructure.
The Browser Extensions
The Chrome and Firefox extensions were built to solve the inline use case: a sales rep in Gmail or LinkedIn who wants to verify an email address without leaving the page. The extension adds a right-click context menu item — "Verify with Qverio" — that sends the selected text to the API and displays the result (Valid / Invalid / Risky / Catch-all) in a small popup. No copy-paste, no tab switching, no uploading a CSV.
Results and Honest Lessons
The queue architecture keeps real-time API lookups snappy while bulk jobs run in the background without contention. The credit billing system gives complete visibility into usage — the verification log shows every check with its result and timestamp, and exports are available for any subset of results.
The lesson that shaped the product roadmap: the browser extensions turned out to be one of the most valuable features for day-to-day users. Being able to right-click any email address and verify it without leaving the current tab — no CSV, no copy-paste, no dashboard tab — is where Qverio earns its place in a daily workflow. Building the extension early, rather than treating it as a future nice-to-have, was the right call.
The credit billing model is deliberately simple: credits never expire, you only pay for what you use, and the Flex Pack gives new users a low-commitment way to test accuracy before committing to a subscription. Track credit balances in your own database with a database-level transaction to prevent double-spending — Stripe is authoritative for billing events, your database is authoritative for balances.