Framer
Envía un formulario de Framer a Ikiform mediante su destino de webhook sin código, o renderiza tu propio formulario con un code component que envía desde el navegador.
Los formularios de Framer no pueden enviar a una URL de action externa, pero sí pueden mandar cada envío a un webhook. Eso da dos opciones: conservar el formulario de Framer y añadir Ikiform como su webhook, o colocar un pequeño code component que envía desde el navegador del visitante.
| Item | Formulario de Framer con un webhook | Code component |
|---|---|---|
| Quién hace el envío | Los servidores de Framer | El navegador del visitante |
| Código | Ninguno | Un archivo de React |
| Dominios permitidos | Déjalos vacíos: los envíos desde servidor no llevan Origin | Se comparan con tu dominio de Framer |
| Honeypot | No disponible | Incluido |
| Los límites de frecuencia cuentan | Las direcciones de los servidores de Framer | Cada visitante |
| Verificación antispam de Ikiform | Desactivada | Desactivada |
Formulario de Framer con un webhook
Ponles nombre a los inputs
Framer envía JSON con el nombre de cada input como clave, así que los nombres que les des a los inputs se convierten en los nombres de campo en Ikiform. Usa ids en minúsculas como
emailymessage, y haz que coincidan con tu definición de campos si tienes una.Añade Ikiform como webhook
Selecciona el formulario en el lienzo. Junto a Send To, en la barra lateral derecha, elige Add… > Webhook y pega tu endpoint. Framer exige una URL
https://, y el endpoint ya lo es.Webhook URL https://ikiform.com/f/frm_xxxxxxxxxxxxxxxxFramer puede firmar las peticiones con un secreto. Ikiform no comprueba la cabecera
Framer-Signature, así que aquí el secreto es opcional.Ajusta la configuración del formulario de Ikiform
- Deja Allowed domains vacío. Framer envía desde sus servidores sin cabecera
Origin, así que con dominios configurados cada envío se marca como spam conorigin_mismatch, o se rechaza con Reject. - Deja desactivada la verificación antispam. Un envío JSON sin token recibe
403 challenge_required, y Framer no tiene forma de ejecutar la verificación. - Elige el límite de frecuencia Relaxed. Ikiform cuenta los envíos por dirección IP y formulario, y todos los envíos vienen de los servidores de Framer, no de tus visitantes.
- Deja Allowed domains vacío. Framer envía desde sus servidores sin cabecera
Framer trata cualquier respuesta que no sea 2xx como un fallo y reintenta hasta 5 veces. Ikiform responde 201 en cuanto guarda el envío. Un envío que Ikiform rechaza, como 422 validation_failed, falla igual en cada reintento, así que corrige la causa en lugar de esperar.
Code component
Un code component renderiza un formulario real en tu página, así que lo envía el navegador e Ikiform ve tu sitio como origen. En el panel Assets, abre Code, crea un archivo de código y pega:
import { addPropertyControls, ControlType } from "framer";
import { type CSSProperties, type FormEvent, useState } from "react";
const field: CSSProperties = {
font: "inherit",
padding: "10px 12px",
borderRadius: 8,
border: "1px solid rgba(0, 0, 0, 0.15)",
};
export default function IkiformContact({ formId, successText }: { formId: string; successText: string }) {
const [status, setStatus] = useState<"idle" | "sending" | "sent" | "error">("idle");
const [message, setMessage] = useState("");
async function onSubmit(event: FormEvent<HTMLFormElement>) {
event.preventDefault();
setStatus("sending");
try {
const response = await fetch(`https://ikiform.com/f/${formId}`, {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(event.currentTarget),
});
const result = await response.json();
if (result.ok) return setStatus("sent");
setMessage(result.error.message);
} catch {
setMessage("Couldn't reach the server. Try again.");
}
setStatus("error");
}
if (status === "sent") return <p>{successText}</p>;
return (
<form onSubmit={onSubmit} style={{ display: "grid", gap: 12, width: "100%" }}>
<input name="email" type="email" placeholder="Email" autoComplete="email" required style={field} />
<textarea name="message" placeholder="Message" rows={4} style={field} />
<input name="_gotcha" type="text" tabIndex={-1} autoComplete="off" hidden />
{status === "error" ? <p role="alert">{message}</p> : null}
<button type="submit" disabled={status === "sending"} style={field}>
{status === "sending" ? "Sending" : "Send"}
</button>
</form>
);
}
addPropertyControls(IkiformContact, {
formId: { type: ControlType.String, title: "Form ID", defaultValue: "frm_xxxxxxxxxxxxxxxx" },
successText: { type: ControlType.String, title: "Success text", defaultValue: "Thanks, we got it." },
});- Arrastra el componente a la página y define Form ID en el panel de propiedades. Dale estilo a los inputs editando
field, o sustituye los elementos por los tuyos. Accept: application/jsonhace que Ikiform responda con JSON, para que el componente pueda mostrar el resultado en su sitio.- El componente envía con
fetch, así que deja desactivada la verificación antispam del formulario. El honeypot y la puntuación de spam siguen funcionando.
target="_top". El code component evita los frames por completo.Dominios permitidos
Esto solo aplica al code component y al embed. Deja vacíos los dominios permitidos para el webhook.
| Dónde funciona el formulario | Añadir a Allowed domains |
|---|---|
| Subdominio de Framer | your-project.framer.app, o your-project.framer.website en proyectos antiguos |
| Dominio propio | example.com, que también cubre www.example.com |
| La vista previa del editor de Framer | Nada. Prueba en el sitio publicado. |
- Nunca añadas
framer.appniframer.websitesolos. Coincidiría cualquier sitio de ese host, incluidos los de otras personas.
Lista de pruebas
- Publica el sitio. Framer solo envía webhooks de los formularios del sitio publicado.
- Envía el formulario y comprueba el envío en Ikiform. Con el webhook, los campos deberían coincidir exactamente con los nombres de tus inputs.
- Para el code component, activa los dominios permitidos, envía desde el dominio publicado y confirma que no se marca como spam.
Solución de problemas
| Qué ves | Por qué | Solución |
|---|---|---|
Todos los envíos del webhook están en spam con origin_mismatch | Allowed domains está configurado y los envíos desde los servidores de Framer no tienen origen | Vacía los dominios permitidos de este formulario o cambia al code component. |
| Framer informa de entregas de webhook fallidas | Ikiform rechazó el envío: 403 challenge_required, 403 origin_not_allowed o 422 validation_failed | Desactiva la verificación antispam, vacía los dominios permitidos y haz que los nombres de los inputs coincidan con tus campos. |
429 rate_limited en un formulario con mucho tráfico | Los envíos desde los servidores de Framer comparten pocas direcciones IP | Elige Relaxed o un límite Custom. |
| El componente dice que no pudo conectar con el servidor | Un bloqueador de anuncios o una extensión de privacidad bloqueó la petición, o el Form ID está vacío | Prueba en una ventana privada y comprueba que la propiedad está definida. |
Los envíos llegan al filtro de spam con origin_mismatch | La página que envió no está entre los dominios permitidos del formulario | Añade el host de la tabla de arriba. Si eliges Reject, esos mismos envíos reciben 403 origin_not_allowed. |