Contact / feedback form

Last updated: Nov 1, 2026Section: Integrations

Use a Contact / feedback form integration to collect messages from your site (contact, support, feedback). Each submission creates a message in Mailoo and a linked feedback record with structured fields.

:::: important ::: title Important :::

Server-side only: Post from your backend or BFF; call Mailoo with X-API-Key from environment variables. Do not expose the key in browser JavaScript or public bundles. ::::

:::: note ::: title Note :::

Legacy: Calling the feedback webhook directly from the browser can work if CORS and allowed origins match, but it exposes the API key. Use a backend or BFF for new integrations. ::::

Quick start

  1. In the dashboard, open your project → Create New Integration → Contact / feedback form.
  2. Optionally set allowed origins (Origin allowlist). Leave empty to skip Origin checks; the API key remains required. A BFF may forward the browser Origin, so a filled list still applies.
  3. Create an API key with scope Feedback form submissions (webhook.feedback-submission) if you use a RESTRICTED key, or use Full Access. Store the key on the server only.
  4. From your server, POST to the feedback webhook (see API reference below).
  5. View submissions under Messages for that integration.

Outbound SMTP (dashboard)

On the integration Connection & settings tab, Outbound email (SMTP) lets you configure mail for subscriber flows and operator replies that use integration-level SMTP (see outbound-smtp{.interpreted-text role="doc"}). Use Send test email to verify the current SMTP fields; the test is delivered to your Mailoo account email and does not auto-save the form.

API reference

Endpoint

POST /api/v1/webhooks/feedback/{projectUid}/{integrationId}

Headers


Header Required Description


Content-Type Yes application/json

X-API-Key Yes Project API key with webhook.feedback-submission (or FULL)

Origin No When allowedOrigins is non-empty, must match an entry. Omit or leave allowlist empty to skip Origin checks (API key still required).

JSON body


Field Required Description


email Yes Sender email

message Yes Message body (plain text)

name No Sender name

subject No Subject line (defaults to a generic title if omitted)

metadata No Object with extra key/value data (stored with the submission)

Optional template

Pass templateId (a campaign id on this integration, the same id transactional send accepts) to render that campaign's email template into the inbound message. idempotencyKey is then required (1--256 characters, unique per integration). locale and vars are optional and use the same limits as transactional send. message and subject are ignored. Mailoo does not send SMTP and does not create a subscriber. The first success is 201 with idempotentReplay false. The same key returns 200, the same ids, and idempotentReplay true. Missing required template variables return 400 MISSING_REQUIRED_VARS and do not store the key. A request without templateId is unchanged, including the 200 body below.

An operator can forward the message to email by replying with subject and text or html. A reply with no body still uses the ON_EVENT template and requires eventType.

Success response (200)

{
  "success": true,
  "messageId": "...",
  "feedbackId": "...",
  "message": "Feedback submission processed successfully"
}

Dashboard

Open Project → Integration → View Messages to list and open individual messages. The page uses the same Inbox, Outbox, and Sent folders as a newsletter form. Subscriber and campaign tabs are shown on FORM integrations only.

Integrating from your Next.js app

Wire a BFF route with @mailoo/forms so the browser never sees the API key. Full walkthrough, env options, and client patterns: feedback-form-nextjs-example{.interpreted-text role="doc"}.

See also

  • feedback-form-nextjs-example{.interpreted-text role="doc"} --- Next.js BFF, optional allowlist, client submit
  • outbound-smtp{.interpreted-text role="doc"} --- integration outbound SMTP, dashboard test email, MAIL_SMTP_ENCRYPTION_KEY
  • ../index{.interpreted-text role="doc"} --- other integration types
  • OpenAPI: https://api.mailoo.app/docs/v1 --- API keys and allowedOperations