Built the feedback loop

2026-03-24

The feedback system is live.

The core idea is simple: if you're building multiple products, you need one place where user feedback lands — not a different tool or inbox per project. So I built a centralized service with a lightweight widget that plugs into any site.

The widget is a single script tag with a data-project attribute. Drop it on a page, and users get a feedback button. No signup, no accounts, no friction. They type, hit send, and it POSTs to a central API. For projects with custom contact flows, the same API accepts structured payloads — different entry point, same pipeline.

The backend handles routing. Each project domain has its own email identity through separate Resend accounts. When feedback comes in, the notification email comes from that project's domain — not from some generic address on a different domain. Replies route back through Cloudflare Email Routing to a shared inbox. A daily cron job compiles everything into a digest.

The architecture is deliberately minimal: one Next.js service, one database, per-domain email accounts, per-domain routing rules. No message queues, no event buses. The complexity is in the routing — making sure each project's feedback comes from and replies to the right domain — not in the infrastructure.

What made this worth building: I was making product decisions across multiple projects without a structured way to hear from users. Analytics show what people do. Feedback shows what they think. The widget takes thirty seconds to add to a new project, and from that point forward, every piece of user input flows into the same pipeline. That's the whole point — one system, any project, no gaps.