Docs

Dorna Chats is a separate product from Dorna Forms and Dorna Ads Manager. Later we can optionally forward conversations into Dorna’s lead inbox — that is not built here.

Two hostnames

  • chats.dorna.dev — public website and API. Host the SDK and conversation endpoints. Map this name to Cloud Run.
  • notifications.dorna.dev — mail identity only. Emails are sent from <chats@notifications.dorna.dev>. Do not point this name at the app.

Paste the snippet

HTML
<script
  src="https://chats.dorna.dev/v1/sdk.js"
  data-site-key="pk_…"
  data-inbox="inbox_…"
></script>

Sites console

Open /admin to add, change, or remove sites. Sign in with Google; only allowlisted owner emails can get in. Creating a site also creates a Website chat inbox and a public key for the snippet.

Create a site

Admin API
curl -s https://chats.dorna.dev/v1/admin/sites \
  -H "authorization: Bearer $CHATS_ADMIN_KEY" \
  -H "content-type: application/json" \
  -d '{
    "name": "Dorna Studio",
    "allowed_origins": ["https://studio.dorna.dev"],
    "notify_emails": ["hello@studio.dorna.dev"]
  }'

Then create an inbox under that site. Modes: hybrid (default), ai, human.

Public API

  • POST /v1/conversations
  • POST /v1/conversations/:id/messages
  • GET /v1/conversations/:id/messages
  • POST /v1/conversations/:id/handoff
  • GET /v1/sdk.js
  • POST /v1/webhooks/resend
  • GET /health

DNS for Resend

Reuse the domain already verified for Forms: notifications.dorna.dev. Add the chats@ sender. SPF, DKIM, and DMARC stay on that name. Keep chats.dorna.dev DNS-only on Cloudflare so Google can issue the Cloud Run certificate.

Cloud Run

us-central1, min instances 0, max 2, 512Mi, 1 CPU. Secrets in Secret Manager: CHAT_AI_API_KEY, CHAT_AI_MODEL, RESEND_API_KEY, TURNSTILE_SECRET, TURNSTILE_SITE_KEY, RESEND_WEBHOOK_SECRET. Firestore via the service's attached service account. All secrets are required; the service fails closed when one is missing.