Docs

Form inbox

Receive contact and booking form submissions from your Astro site. Submissions land in the admin inbox where you can read, reply, and manage them.

How it works

Orbiter exposes a public endpoint that accepts form submissions from your static Astro site. No serverless function or third-party service needed.

POST /api/form/:formId

:formId is any string you choose — e.g. contact, booking, support. Submissions from the same formId appear together as a tab in the admin inbox.

Connecting a form in Astro

Add a fetch handler to any HTML form. The admin server must be reachable from the browser (same domain, or a separate subdomain).

<form id="contact-form">
  <input  name="name"    required />
  <input  name="email"   type="email" required />
  <textarea name="message" required></textarea>
  <!-- honeypot: hidden, left empty by humans, filled by bots -->
  <input name="_honeypot" style="display:none" tabindex="-1" autocomplete="off" />
  <button type="submit">Send</button>
</form>

<script>
  document.getElementById('contact-form').addEventListener('submit', async e => {
    e.preventDefault();
    const res = await fetch('https://admin.example.com/api/form/contact', {
      method: 'POST',
      body: new FormData(e.target),
    });
    if (res.ok) alert('Message sent!');
  });
</script>

The endpoint accepts both multipart/form-data and application/json.

Honeypot spam filter

Add a hidden _honeypot field to your form. Legitimate users never fill it in; bots usually do. If the field is non-empty, Orbiter silently accepts the request without saving it.

Booking forms

Booking requests work exactly like contact forms — just include date, time, and persons fields:

<input name="date"    type="date"   required />
<input name="time"    type="time"   />
<input name="persons" type="number" min="1" />

In the admin, booking submissions get Confirm and Reject buttons in addition to the standard status controls.

Managing submissions in the admin

Go to Tools → Inbox (or press g n in Space Station mode). Each form ID appears as a tab. Submissions are sorted newest first.

Each submission can be:

  • Expanded to read the full field values
  • Marked as read, done, confirmed, rejected, or spam
  • Replied to by email — if the submission contains an email field, a Reply button appears that opens an inline compose panel
  • Deleted permanently

Email notifications

To receive an email when a new submission arrives, configure SMTP in Settings → Email and enable Notify on form submission.

Status values

StatusMeaning
newJust arrived, unread
readOpened (auto-set when you expand a submission)
confirmedBooking or inquiry accepted
rejectedBooking or inquiry declined
doneHandled / archived
spamMarked as spam

API reference

POST   /api/form/:formId           — public, submit a form (no auth)
GET    /api/forms                  — list form IDs with counts (auth)
GET    /api/forms/:formId          — list submissions (auth)
PUT    /api/forms/:id/status       — update status (auth)
POST   /api/forms/:id/reply        — send email reply to submitter (auth)
DELETE /api/forms/:id              — delete submission (auth)
CORS: The public POST /api/form/:formId endpoint has wide CORS (*) so it can be called from any static site. All other /api/forms/* endpoints require a session cookie.