Formulario de reservas en Nuxt
Añade un formulario de reservas a tu sitio Nuxt sin ruta de servidor. Recopila una fecha y hora preferidas en un componente Vue, y las solicitudes llegan a tu bandeja de entrada para confirmar. Sin backend propio.
Como construirlo
- Crea un formulario en tu panel de Formpaste y copia su clave de acceso.
- Copia el componente Vue de arriba en una página o componente de Nuxt.
- Reemplaza YOUR_ACCESS_KEY_HERE con tu clave de acceso y despliega.
Prompt para tu agente de programación con IA
Add a Formpaste booking request form to my Nuxt 3 app. Use a Vue 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.O conecta el servidor MCP de Formpaste con Claude Code, Codex, Cursor, Claude Desktop, VS Code o cualquier cliente mcp-remote. Ver la guía de configuración.
Puntos claves de Nuxt
Nuxt te da rutas de servidor, pero para un formulario no necesitas ninguna. Un formulario de Formpaste es un componente de Vue que hace POST directamente a Formpaste, así que no hay handler en server/api ni ruta de Nitro que escribir. Funciona con SSR o con un build estático de nuxi generate.
Sin ruta de servidor
No necesitas un endpoint server/api/ ni un handler de Nitro. El componente hace POST directamente al endpoint de Formpaste, lo que mantiene la app desplegable en cualquier sitio, incluido un build totalmente estático de nuxi generate.
Es un componente de Vue
Nuxt es Vue, así que el formulario es un componente de un solo archivo con v-model y un manejador @submit.prevent. Usa el código de Vue del selector de arriba - funciona igual dentro de Nuxt.
Pinia solo si quieres estado compartido
Para un formulario de varios pasos puedes guardar el estado del paso en un store de Pinia si abarca varias rutas, pero el estado local del componente es más simple para un asistente de una sola página. De cualquier forma, el último paso hace POST una sola vez a Formpaste.
SSR o estático, el mismo formulario
Como el formulario hace POST a un endpoint externo, funciona ya sea que despliegues con SSR o como sitio estático. Ningún código de servidor tuyo se ejecuta al momento del envío.
Que debes acertar
Un formulario solicita una reserva, no gestiona un calendario
Esto recopila una fecha y hora preferidas y te las envía por correo para confirmar. No verifica disponibilidad ni evita el doble reservado. Si necesitas disponibilidad en tiempo real, usa una herramienta de programación y deja que este formulario maneje las solicitudes más simples.
Especifica la zona horaria
Incluye tu zona horaria en la etiqueta o en una nota para que una hora solicitada no sea ambigua. Una reserva con tres horas de diferencia no le sirve a nadie.
Confirma antes de que sea real
Trata cada envío como una solicitud hasta que respondas para confirmar. Configura el reply-to al solicitante para que confirmar sea una sola respuesta.
Cómo funciona
Tres pasos simples para que los envíos de formularios lleguen a tu bandeja de entrada.
Crea tu formulario, apunta la URL de action al endpoint de Formpaste y añade tu clave de acceso.
Crea tu formulario
Regístrate, verifica tu correo y crea una clave de acceso en tu panel.
Copia el código
Pega el fragmento de arriba en tu proyecto. Elige CSS o Tailwind para que combine con tu sitio.
<script setup lang="ts">
import { ref } from "vue";
const status = ref<"idle" | "sending" | "ok" | "error">("idle");
async function onSubmit(e: Event) {
status.value = "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.value = res.ok ? "ok" : "error";
}
</script>
<template>
<p v-if="status === 'ok'">Thanks - your message was sent.</p>
<form v-else @submit.prevent="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">Nombre
<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">Correo electrónico
<input type="email" name="email" placeholder="tu@ejemplo.com" 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">Fecha preferida
<input type="text" name="date" placeholder="YYYY-MM-DD" 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">Hora preferida
<input type="text" name="time" placeholder="ej. 2pm" 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">Notas
<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'">Solicitar reserva</button>
<p v-if="status === 'error'">Something went wrong. Please try again.</p>
</form>
</template>Añade tu clave de acceso
Reemplaza el marcador por tu clave de acceso para empezar a recibir envíos.
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">Formulario de reservas en Nuxt FAQ
Pega un formulario. Recibe envíos.
Al instante, sin configurar ningún backend, servidor ni base de datos. 250 envíos/mes gratis, sin tarjeta de crédito.