Form Integration

A Meku contact form that sends on day one

Meku can take you from a prompt to a published React and Tailwind site in one sitting, but the contact form it draws has nowhere to send. Point it at a Formbold endpoint. Each message is stored, spam-checked and emailed, and you don't need a Supabase table or a server for it.

Contact Form for Meku

What does the Meku contact form look like when it works?

Meku projects are React and Tailwind on Vite, with components in src/components as .jsx files. This is the shape to expect after the prompt. Replace FORM_ID with your own.

meku.tsx
// src/components/ContactForm.jsx  (Meku projects are React + Tailwind on Vite)
import { useState } from "react";

const FORMBOLD = "https://formbold.com/s/FORM_ID";

export default function ContactForm() {
  const [phase, setPhase] = useState("idle"); // idle | sending | sent | error
  const [errorText, setErrorText] = useState("");

  const onSubmit = async (event) => {
    event.preventDefault();
    const form = event.currentTarget;
    setPhase("sending");
    setErrorText("");

    try {
      const res = await fetch(FORMBOLD, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Accept: "application/json",
        },
        body: JSON.stringify(Object.fromEntries(new FormData(form))),
      });

      if (res.ok) {
        form.reset();
        setPhase("sent");
        return;
      }
      const data = await res.json().catch(() => ({}));
      setErrorText(data.message || "Formbold rejected the request.");
      setPhase("error");
    } catch {
      setErrorText("No connection. Please try again.");
      setPhase("error");
    }
  };

  if (phase === "sent") {
    return (
      <div className="rounded-2xl bg-emerald-50 p-6 text-emerald-800">
        Thanks for reaching out. Your message is in our inbox.
      </div>
    );
  }

  return (
    <form onSubmit={onSubmit} className="flex flex-col gap-4 rounded-2xl bg-white p-6 shadow">
      <input name="name" required placeholder="Name" className="rounded-xl border px-4 py-3" />
      <input name="email" type="email" required placeholder="Email" className="rounded-xl border px-4 py-3" />
      <select name="topic" className="rounded-xl border px-4 py-3">
        <option>General question</option>
        <option>Project quote</option>
        <option>Support</option>
      </select>
      <textarea name="message" rows={5} required placeholder="Tell us a bit more" className="rounded-xl border px-4 py-3" />
      <button disabled={phase === "sending"} className="rounded-xl bg-slate-900 py-3 font-medium text-white disabled:opacity-60">
        {phase === "sending" ? "Sending..." : "Send message"}
      </button>
      {phase === "error" && <p className="text-sm text-red-600">{errorText}</p>}
    </form>
  );
}
How it works

From endpoint to live Meku site

Copy an endpoint, prompt Meku, publish. The whole thing fits in a coffee break.

1

Get your endpoint

Create a form in the Formbold dashboard and copy its endpoint from Form Setup. It looks like https://formbold.com/s/FORM_ID.

2

Paste this into the Meku chat

"Make the contact form on the Contact page send real messages. In src/components/ContactForm.jsx, POST the fields as JSON with fetch to https://formbold.com/s/FORM_ID, with Content-Type and Accept set to application/json. Give every field a name attribute (name, email, topic, message). While sending, disable the button. On success, replace the form with a thank-you panel. On error, show the message Formbold returns. Keep the current Tailwind styling and do not use Supabase for this form."

3

Publish and test live

Publish to your free meku.app subdomain or your own domain, send one message, and check Submissions in Formbold.

Features

Meku builds the site, Formbold takes the messages

Meku handles pages, hosting and SSL. Formbold covers what happens after someone clicks Send.

Works on meku.app and custom domains

The form posts from the browser, so it behaves the same on a free meku.app subdomain, your own domain or an exported build on Vercel or Netlify.

Survives export

Download the ZIP or push to GitHub and the form still works, because there is no Meku-only backend involved.

Leave Supabase for app data

Meku connects to Supabase for sign-in and databases. Keep that for your app and let Formbold handle contact messages.

Messages in your inbox

Each entry is emailed. Spam goes to its own folder, and you can star or export the rest from the dashboard.

Telegram on your phone

On Starter and higher, send each entry to Telegram, Slack, Notion, Google Sheets or HubSpot, or to a webhook.

FAQs

Meku and forms

Built-in integration status, exports and uploads.

Not yet. Meku lists a Formbold integration as in progress on its integrations page. Until it ships, the prompt above wires the form in about a minute.

Still have a question?

The docs cover setup, framework guides, integrations and spam protection, step by step.