Skip to main content
Back
Own product · SaaS in production

I turned the contact form into a conversation that closes

Rivelko generates AI conversational forms, embeds them on any site with one line of code, and works every captured lead through pipelines, deals and tickets.

Next.js 16Hexagonal architectureMulti-tenantStripeMCP

What is Rivelko?

Rivelko is an AI conversational form builder that turns a static contact form into a conversation that captures more leads. Every captured lead continues inside the same product —pipelines, deals and tickets— so nothing you capture goes cold.

01 / At a glance

Four numbers that sum up the product

Verifiable in the product's repository.

13KB
Widget over the wire, gzipped and isolated with Shadow DOM
<2 min
From describing the business to a live form
1 line
Of code to embed it on any site
655
Automated tests across 102 files
02 / The problem

A contact form asks for data from someone who hasn't decided anything yet

And the lead it captures usually dies in an inbox.

Six cold fields are a barrier for someone still deciding whether you're worth it. And even when they fill them in, the lead lands in an email nobody opens again. Rivelko attacks both halves of the problem with two product decisions.

Capture is a conversation

Asking one question at a time, in the tone of the sector and adapting to what the person already said, converts better than a long form shown all at once.

The close lives where the capture happened

That's why the CRM is inside the product rather than integrated with a third party: the jump between tools is exactly where leads get lost.

03 / Technical decisions

The five decisions holding the product up

Expand each one for the reasoning.

Genuinely hexagonal

The domain depends on nothing, and infrastructure is the only layer touching the outside world.

The domain layer imports nothing; use cases depend only on port interfaces; and infrastructure —Prisma, Stripe, Resend, the AI SDK— is the only layer that talks to the outside. A use case importing the Prisma client directly has broken the architecture, and that's the rule the directory tree can't teach on its own. Today it's 20 use-case modules.

The widget is a separate bundle

Built with esbuild, served as an IIFE and mounted in a Shadow DOM.

The widget cannot import from the application: it is an independent bundle. That constraint is what keeps it at 13KB gzipped and what stops the host site's styles from deforming it, because it lives inside a Shadow DOM. It embeds with a single script tag and behaves the same on WordPress, Shopify or hand-written HTML.

Two hosts, one deployment

Marketing and app are served from the same project, with a single source of truth for routes.

rivelko.com serves the marketing site and app.rivelko.com the dashboard and API, both from a single Vercel project. A domain routes module is the source of truth, and a test fails if the configuration drifts. The critical invariant: the API is never redirected. A 308 on a preflight request or on a POST would break every embedded form, and the browser would report it as a CORS error, not a redirect.

Multi-tenant, and tested as such

The tenant boundary is enforced in the use cases, and a pentest suite guards it.

Looking up by id deliberately doesn't filter by tenant: the ownership check lives in the use-case layer, where the resource is read and then verified to belong to the caller. So that this doesn't depend on anyone's memory, a pentest suite walks the routes with an id parameter and fails if any of them skips the check. It's the defence against the first risk in the OWASP API Security Top 10.

Open to AI agents

An MCP server lets an agent operate the account, with a brake on destructive actions.

Rivelko exposes an MCP server so an AI agent can create forms, query conversations and move deals. Destructive operations aren't available by default: an explicit window has to be opened before anything can be deleted, and the ordering between checking scope and opening that window is pinned by tests.

OWASP API Security Top 10 — API1:2023 Broken Object Level Authorization

04 / Stack

What it's built with

Chosen to ship fast without mortgaging maintenance.

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind v4
  • Prisma + Neon
  • AI SDK v6
  • Stripe
  • NextAuth
  • Resend
  • esbuild
  • Vercel
05 / My role

What I actually built

A complete product, from idea to deployment, solo.

Rivelko isn't client work: it's my own product. That means every decision —what to build, what not to, how to charge for it and how to sustain it— is mine, and the result can be audited end to end.

  • Product and design
  • Architecture
  • Frontend
  • Backend and API
  • Embeddable widget
  • Billing and plans
  • Infrastructure and deployment
06 / FAQ

What people usually ask me about Rivelko

What is Rivelko?

Rivelko is an AI conversational form builder. It turns a static contact form into a conversation that captures more leads, and then works every lead through pipelines, deals and tickets inside the same product.

How is it different from a classic contact form?

A classic form shows every field at once and hands the result to an inbox. Rivelko asks one question at a time, adapts the tone to the sector, and drops the lead on a board where it's followed through to the close. It also offers classic forms when that's the better fit.

How do you embed it on a site?

With a single script tag. The widget weighs 13KB gzipped, mounts in a Shadow DOM so the host site's styles can't affect it, and only runs on domains that have been authorised beforehand.

Who built Rivelko?

Ray Martín, fullstack product developer. It's an own product, built solo end to end: product, architecture, frontend, backend, widget, billing and infrastructure.

This is what I build when I'm the client.

If you have a product in hand and want it shipped to production at this level of finish, let's talk.