Bloque RSVP
Una pregunta gratuita de "¿Asistirás?" con soporte de capacidad y lista de espera — el equivalente gratuito del límite de inventario de boletos pagos del bloque Producto, para eventos que solo necesitan un conteo de asistentes en lugar de un cobro.
Cómo funciona
Un RSVP sin invitados se comporta exactamente como el voto de opción única de una encuesta: "Sí" y "No" se renderizan como el mismo par de chips basados en enlace que buildChipGroup genera para una opción de encuesta. La confirmación ocurre en la vista en vivo alojada (o directamente mediante un envío de formulario dentro del correo, donde el cliente lo admite) antes de que se registre nada, así que un escáner corporativo que precargue el enlace no puede inflar el conteo.
Activar Permitir traer invitados cambia solo la respuesta "Sí": un simple enlace GET no puede ofrecer una elección de la forma en que puede hacerlo un campo de formulario real, así que el conteo de invitados se convierte en un control cinético <form><select> exclusivo de la vista en vivo. Esto refleja la misma forma en que las respuestas de texto/enlace del bloque Tarea necesitan la vista en vivo para cualquier cosa que un enlace fijo no pueda transportar. "Sí (elegir invitados)" se renderiza como un enlace simple hacia la propia vista en vivo en la alternativa de nivel 2/nivel 3, en lugar de directamente hacia /act. Un "Sí" sin invitados (0 invitados elegidos, o invitados desactivados por completo) igualmente llega a /act como un enlace normal de un toque en cualquier caso — solo el paso de conteo de invitados necesita específicamente la vista en vivo.
La contabilidad de capacidad ocurre dentro de una única transacción de Firestore que también realiza la verificación de deduplicación por destinatario. A diferencia del proceso de pago del bloque Producto, que solo vuelve a verificar una consulta .count() y reembolsa en la rara condición de sobreventa, un RSVP no tiene un respaldo tipo reembolso para una respuesta que exceda la capacidad. Así que la decisión y la escritura ocurren atómicamente juntas, en lugar de como dos pasos separados que una condición de carrera podría dividir. Define Capacidad por encima de 0 y, una vez que las confirmaciones de asistencia más sus invitados la superarían, la respuesta se registra como en lista de espera en lugar de confirmada, y el destinatario ve tu propio Mensaje de lista de espera en lugar de un agradecimiento genérico.
Una respuesta "No" siempre se registra como rechazada, y nunca se verifica contra la capacidad. Capacidad 0 significa ilimitado, la misma convención de "0 = sin definir" que usa el campo de inventario del bloque Producto. Una respuesta anónima (sin token de destinatario — por ejemplo, una proveniente de un archivo HTML exportado y pegado en un ESP externo) omite por completo la verificación de deduplicación, ya que no hay destinatario en el que basarse. Aun así, sigue pasando por la misma transacción de capacidad, así que una avalancha anónima tampoco puede sobrevender el límite de la lista de espera; solo la detección de duplicados por persona no está disponible en esa vía.
Si el proyecto tiene una fecha de cierre o un límite de respuestas configurado (mira ciclo de vida de la encuesta), un RSVP cerrado reemplaza ambos chips por versiones inertes en gris junto con un aviso de "Esta encuesta está cerrada" en la vista en vivo.
Campos configurables:
- Pregunta — por defecto "¿Asistirás?".
- Capacidad (0 = ilimitado).
- Permitir traer invitados — agrega un selector de número de invitados a "Sí".
- Máximo de invitados por RSVP (si se permiten invitados) — limita el rango del selector (1–20).
- Mensaje de lista de espera — se muestra en lugar de un agradecimiento normal una vez alcanzada la capacidad.
- Color de fondo, relleno, borde y radio de borde de la tarjeta.
- Color/tamaño de la pregunta, y anulaciones de color/fondo de los botones Sí/No.
Cada RSVP se resume en conteos de confirmados/rechazados/en lista de espera y un total de invitados, escritos directamente en el bucket agregado rsvpBlocks del proyecto en lugar de pasar por la vía genérica de incremento de respuestas que usan todos los demás bloques. Esa es una excepción deliberada, ya que la decisión confirmado-vs-en-lista-de-espera tiene que ocurrir dentro de la misma transacción que el propio conteo.
Ejemplos
Subject
Will you join us?
El propósito de proyecto "Evento" inicia un nuevo proyecto con un bloque RSVP ya colocado junto a Enlace de reunión, Sede y Agregar al calendario. Define una capacidad para una sede con asientos limitados y el bloque gestiona la lista de espera sin configuración adicional — mira Eventos y webinars. Un club usa el mismo bloque para una prueba de selección o un número limitado de cupos para un viaje fuera de casa, con la capacidad manteniendo el conteo de asistentes honesto sin que nadie necesite llevarlo a mano — mira Equipos deportivos y clubes. Un encuentro comunitario gratuito sin ningún límite de asientos simplemente deja la Capacidad en 0, usando RSVP puramente para un conteo confiable de asistentes en lugar de cualquier aplicación de capacidad.
Cómo se ve la alternativa estática
<div id="em-rsvp-1" style="margin:12px 0;background-color:transparent">
<p style="margin:0 0 10px;font-weight:600;font-size:16px;color:#111827">Will you attend?</p>
<div>
<span class="kn-fallback">
<a href="https://mailinapp.com/v/eyJhbGci.../act?blockId=rsvp-1&blockType=rsvp&action=rsvp&response=yes"
style="display:inline-block;margin:0 6px 6px 0;padding:8px 14px;border:1px solid #d1d5db;
border-radius:6px;background-color:#ffffff;color:#111827;font-size:14px;text-decoration:none">
Yes
</a>
<a href="https://mailinapp.com/v/eyJhbGci.../act?blockId=rsvp-1&blockType=rsvp&action=rsvp&response=no"
style="display:inline-block;margin:0 6px 6px 0;padding:8px 14px;border:1px solid #d1d5db;
border-radius:6px;background-color:#ffffff;color:#111827;font-size:14px;text-decoration:none">
No
</a>
</span>
</div>
</div>
Esta es la alternativa de nivel 2 sin invitados: enlaces simples hacia /v/[token]/act, idénticos en forma a los chips de opción de una encuesta, visibles donde el formulario dentro del correo no se renderiza.