Blueprints/Launch a micro-SaaS in a weekend

Launch a micro-SaaS in a weekend

Auth, a request form, and a dashboard. No backend code. Ship Saturday, validate Sunday.

Updated March 2026

You have an idea. You do not want to spend weeks on a backend before you know if anyone cares. So: Clerk for login, Sutrena for the data, Neon if you need a database for anything extra. Users sign in, submit requests through a form, and you watch the dashboard. Start free, upgrade to $9/month on Builder or $29/month on Pro when it works. An agent can set this up end-to-end: create the request form with Clerk user tracking, build the admin dashboard with priority breakdowns.

Architecture

ToolRoleCost
ClerkAuthentication (user identity)Free (50K MAU)
NeonPostgreSQL for custom data (optional)Free (0.5 GB)
SutrenaRequest form, submission storage, dashboard$0 (free) / $9/mo (Builder) / $29/mo (Pro)

Total cost: $0-$29/mo

Builder starts at $9/month for 50 projects. Pro at $29/month covers 200 projects and all your other work too. Build five blueprints on Pro and it is still $29/month. That is where the value is — at scale.

Clerk handles signup and login. When a user submits a request, your frontend injects their Clerk user_id as a hidden field and POSTs to Sutrena. The admin dashboard shows requests by priority, a timeline, and a full list.

Neon is optional. If you need user profiles, billing state, or custom logic, put that in Postgres. But for the core request workflow, Sutrena alone is enough. Start with the free plan, then $9/month on Builder for a single project or $29/month on Pro if the idea grows.

Form Definition

Hidden user_id from Clerk, a free-text request, and a priority picker. The user_id lets you trace requests to specific users in Clerk.

{
  "name": "Customer Requests",
  "fields": [
    {
      "name": "user_id",
      "type": "hidden"
    },
    {
      "name": "request",
      "label": "Your Request",
      "type": "textarea",
      "required": true
    },
    {
      "name": "priority",
      "label": "Priority",
      "type": "select",
      "options": [
        "Low",
        "Medium",
        "High"
      ],
      "required": true
    }
  ]
}

Dashboard Definition

Total requests, a bar chart by priority, a daily timeline, and a table with user IDs, request text, and priority.

{
  "version": 1,
  "widgets": [
    {
      "type": "metric_card",
      "title": "Total Requests",
      "value": "count(*)"
    },
    {
      "type": "bar_chart",
      "title": "Requests by Priority",
      "groupBy": "priority"
    },
    {
      "type": "line_chart",
      "title": "Requests Per Day",
      "groupBy": "$submitted_at:day"
    },
    {
      "type": "data_table",
      "title": "All Requests",
      "columns": [
        "user_id",
        "request",
        "priority"
      ],
      "limit": 50,
      "sortBy": "$submitted_at",
      "sortOrder": "desc"
    }
  ]
}

Frontend Integration

A React form that reads the user_id from Clerk and sends it along with the request. Replace frm_YOUR_FORM_ID with yours.

"use client";
import { useUser } from "@clerk/nextjs";
import { useState } from "react";

const FORM_ID = "frm_YOUR_FORM_ID";

export function RequestForm() {
  const { user } = useUser();
  const [status, setStatus] = useState<"idle" | "sending" | "sent">("idle");

  async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();
    if (!user) return;
    setStatus("sending");

    const fd = new FormData(e.currentTarget);
    const res = await fetch(
      `https://sutrena.com/api/forms/${FORM_ID}/submit`,
      {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          user_id: user.id,
          request: fd.get("request"),
          priority: fd.get("priority"),
        }),
      }
    );

    setStatus(res.ok ? "sent" : "idle");
  }

  if (status === "sent") {
    return <p>Request submitted. We will get back to you soon.</p>;
  }

  return (
    <form onSubmit={handleSubmit}>
      <textarea name="request" placeholder="Describe your request..." required />
      <select name="priority" required>
        <option value="">Select priority</option>
        <option value="Low">Low</option>
        <option value="Medium">Medium</option>
        <option value="High">High</option>
      </select>
      <button type="submit" disabled={status === "sending" || !user}>
        {status === "sending" ? "Submitting..." : "Submit Request"}
      </button>
    </form>
  );
}

FAQ

Do I really need Neon?

Probably not at first. If your MVP is just a request form and dashboard, Sutrena handles it. Neon becomes useful when you need user profiles, settings, or business logic that does not fit the form model. Add it when you need it, not before.

How do I go from MVP to production?

Gradually. Move request handling to your own backend when you are ready. Sutrena's CSV export lets you migrate data out. The form and dashboard keep working while you build the replacement. No rush.

Can I add status tracking to requests?

Sutrena forms collect data -- they do not track state. For status tracking, use a Neon table with a status column. Wire up a Sutrena webhook to sync new requests to your database. Different tools for different jobs.

What are the free plan limitations?

10 projects (forms, pages, and dashboards combined), 500 submissions per form, 1 webhook. No expiry. Enough to validate an idea over a weekend. Builder is $9/month after that, or Pro at $29/month if you need more projects.

What is Sutrena?

Sutrena is the web runtime for AI agents. Three primitives — pages, forms, and dashboards — accessible through one API. Your agent creates web artifacts, humans interact with them, and your agent gets the data back. Framework-agnostic. Works from any MCP client or HTTP client.

Get started in two API calls

1. Get a trial key (no auth, no signup)

curl -X POST https://sutrena.com/api/trial

2. Create a form + dashboard from a template

curl -X POST https://sutrena.com/api/forms \
  -H "Authorization: Bearer st_trial_xxx" \
  -H "Content-Type: application/json" \
  -d '{"templateId": "waitlist", "createDashboard": true}'

Ready to build?

Get a trial API key instantly with no signup, or create an account for the full experience.

Launch a micro-SaaS in a weekend — Sutrena | Sutrena