SvelteKit-Buchungsformular

Füge deiner SvelteKit-Seite ein Buchungsformular ohne Server-Route hinzu. Erfasse einen bevorzugten Termin in einer Svelte-Komponente, und Anfragen landen in deinem Posteingang zum Bestätigen. Kein eigenes Backend.

So baust du es

  1. Erstelle ein Formular in deinem Formpaste-Dashboard und kopiere den Zugangsschlüssel.
  2. Kopiere die Svelte-Komponente oben in eine SvelteKit-Seite oder -Komponente.
  3. Ersetze YOUR_ACCESS_KEY_HERE durch deinen Zugangsschlüssel, dann deploye.

Prompt für deinen KI-Coding-Agenten

Add a Formpaste booking request form to my SvelteKit app. Use a Svelte component with name, email, preferred date, preferred time, and notes that POSTs as application/x-www-form-urlencoded (URLSearchParams) to https://api.formpaste.com/submit with a hidden access_key input. No server route. This requests a booking, it does not manage a calendar.

Oder verbinde den Formpaste-MCP-Server mit Claude Code, Codex, Cursor, Claude Desktop, VS Code oder einem beliebigen mcp-remote-Client. Zur Einrichtungsanleitung.

SvelteKit-Fallstricke

SvelteKit gibt dir Server-Routen und Form-Actions, aber für ein Formular brauchst du sie nicht. Ein Formpaste-Formular ist eine Svelte-Komponente, die direkt an Formpaste postet, also gibt es keine +page.server.ts-Action und keine +server.ts-Route zu schreiben. Es funktioniert mit SSR ebenso wie mit einem statischen adapter-static-Build.

Keine Server-Route oder Form-Action nötig

Du brauchst weder eine +page.server.ts-Action noch einen +server.ts-Endpunkt. Die Komponente postet direkt an den Formpaste-Endpunkt, wodurch die App überall deploybar bleibt, auch als vollständig statischer adapter-static-Build.

Es ist eine Svelte-Komponente

SvelteKit ist Svelte, also ist das Formular eine Single-File-Komponente mit bind:value und einem on:submit|preventDefault-Handler. Verwende den Svelte-Code aus dem Umschalter oben. Er funktioniert innerhalb von SvelteKit genauso.

Progressive Enhancement ist optional

SvelteKit-Form-Actions mit use:enhance sind großartig für deine eigenen Endpunkte, aber hier ist der Endpunkt Formpaste. Ein einfacher on:submit|preventDefault-fetch ist einfacher und braucht keinen eigenen Server-Code von dir.

SSR oder statisch, dasselbe Formular

Weil das Formular an einen externen Endpunkt postet, funktioniert es sowohl bei einem Deploy mit SSR als auch als statische Seite. Beim Absenden läuft kein eigener Server-Code von dir.

Worauf es ankommt

Ein Formular fragt eine Buchung an, es verwaltet keinen Kalender

Das erfasst ein Wunschdatum und eine Wunschuhrzeit und schickt sie dir per E-Mail zur Bestätigung. Es prüft keine Verfügbarkeit und verhindert keine Doppelbuchung. Falls du Echtzeit-Verfügbarkeit brauchst, nutze ein Terminplanungstool und lass dieses Formular die einfacheren Anfragen übernehmen.

Nenne die Zeitzone

Gib deine Zeitzone im Label oder einem Hinweis an, damit eine angefragte Uhrzeit eindeutig ist. Eine Buchung, die drei Stunden danebenliegt, hilft niemandem.

Bestätige, bevor es verbindlich ist

Behandle jede Einsendung als Anfrage, bis du zur Bestätigung antwortest. Setze Reply-to auf die anfragende Person, damit eine einzige Antwort zur Bestätigung reicht.

So funktioniert es

Drei einfache Schritte, bis Formular-Einsendungen in deinem E-Mail-Posteingang landen.
Erstelle dein Formular, setze die action-URL auf den Formpaste-Endpunkt und trage deinen Zugangsschlüssel ein.

1

Formular erstellen

Melde dich an, verifiziere deine E-Mail und erstelle einen Zugangsschlüssel im Dashboard.

2

Code kopieren

Füge das Snippet oben in dein Projekt ein. Wähle CSS oder Tailwind passend zu deiner Website.

<script lang="ts">
  let status: "idle" | "sending" | "ok" | "error" = "idle";

  async function onSubmit(e: SubmitEvent) {
    status = "sending";
    const form = new FormData(e.target as HTMLFormElement);
    const res = await fetch("https://api.formpaste.com/submit", { method: "POST", body: new URLSearchParams(form as any) });
    status = res.ok ? "ok" : "error";
  }
</script>

{#if status === "ok"}
  <p>Thanks - your message was sent.</p>
{:else}
  <form on:submit|preventDefault={onSubmit} class="mx-auto flex w-full max-w-md flex-col gap-4 rounded-xl border border-gray-200 bg-white p-6 shadow-sm dark:border-gray-800 dark:bg-gray-950">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Name
    <input type="text" name="name" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">E-Mail
    <input type="email" name="email" placeholder="du@beispiel.de" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Wunschdatum
    <input type="text" name="date" placeholder="JJJJ-MM-TT" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Wunschuhrzeit
    <input type="text" name="time" placeholder="z. B. 14 Uhr" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Hinweise
    <textarea name="notes" class="min-h-28 rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100"></textarea>
  </label>
    <button type="submit" class="w-full rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition-colors hover:bg-gray-800 disabled:opacity-60 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-200" disabled={status === "sending"}>Buchung anfragen</button>
    {#if status === "error"}<p>Something went wrong. Please try again.</p>{/if}
  </form>
{/if}
3

Zugangsschlüssel hinzufügen

Ersetze den Platzhalter durch deinen Zugangsschlüssel, um Einsendungen zu empfangen.

<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">

SvelteKit-Buchungsformular FAQ

Formular einfügen. Einsendungen erhalten.

Sofort, ohne Backend, Server oder Datenbanken einzurichten. 250 Einsendungen/Monat kostenlos - keine Kreditkarte.

Andere SvelteKit-Formulare