Case study · Event operations · GuayaquilCaso de estudio · Operación de eventos · Guayaquil

RENACE 2026

A two-day event needed individual QR tickets for every attendee, a way to check them in at the door without depending on the venue’s wifi, and attendance certificates afterwards. I built the whole pipeline.

Un evento de dos días necesitaba una entrada con QR individual para cada asistente, una forma de registrarlos en la puerta sin depender del wifi del salón y, al terminar, certificados de asistencia. Construí todo el flujo.

Delivered · September 6–7, 2026Entregado · 6 y 7 de septiembre de 2026
318
attendees across 4 ticket typesasistentes en 4 tipos de entrada
305
QR tickets delivered by email without a bounceentradas con QR entregadas por correo sin rebote
6
phones scanning at one door, fully offlinecelulares escaneando en una sola puerta, sin conexión
237
attendance certificates delivered after the eventcertificados de asistencia entregados después del evento

The problemEl problema

A one-off event with a fixed date, messy data and a door that could not become a bottleneck.Un evento único con fecha fija, datos desordenados y una puerta que no podía convertirse en cuello de botella.

Messy source dataDatos de origen desordenados

The attendee list came from a spreadsheet with missing column headers, two emails in one cell, incomplete domains and invisible characters copied from Word.

La lista de asistentes venía de un Excel con encabezados vacíos, dos correos en una celda, dominios incompletos y caracteres invisibles copiados de Word.

An unknown venueUn salón desconocido

Six people scanning at a single entrance, on phones nobody knew in advance, with no guarantee of mobile data or wifi.

Seis personas escaneando en una sola entrada, con celulares que nadie conocía de antemano y sin garantía de datos ni de wifi.

Hundreds of personal filesCientos de archivos personales

Every ticket and every certificate was personal, and each one had to reach the right person, with a clear record of who did not receive it and why.

Cada entrada y cada certificado era personal y debía llegar a la persona correcta, con un registro claro de quién no lo recibió y por qué.

What I builtLo que construí

One pipeline from the organizer’s spreadsheet to the door, and from the door to the certificates.Un solo flujo desde el Excel del organizador hasta la puerta, y de la puerta a los certificados.

  1. Spreadsheet
  2. Cleaned data
  3. QR tickets
  4. Email
  5. Offline check-in
  6. Certificates
  1. Excel
  2. Datos limpios
  3. Entradas con QR
  4. Correo
  5. Check-in sin conexión
  6. Certificados

From registration to post-event follow-up.Del registro al seguimiento después del evento.

Data cleaningLimpieza de datos

A Python script that reads the organizer’s spreadsheet and produces one clean record per attendee.

Un script en Python que lee el Excel del organizador y produce un registro limpio por asistente.

  • Falls back to column position when headers are missing
  • Strips invisible characters and splits cells with two emails
  • Four ticket types, each with its own email copy
  • Usa la posición de la columna cuando falta el encabezado
  • Quita caracteres invisibles y separa celdas con dos correos
  • Cuatro tipos de entrada, cada uno con su propio texto de correo

Tickets and deliveryEntradas y envío

Each ticket combines the designer’s template, the attendee’s name and a unique QR code, sent by email.

Cada entrada combina la plantilla del diseñador, el nombre del asistente y un QR único, y se envía por correo.

  • SMTP sender that reconnects and retries on its own
  • Bounce checker over IMAP, matched against the attendee list
  • Every undelivered ticket traced with a reason and handed over for manual delivery
  • Envío por SMTP que se reconecta y reintenta solo
  • Revisión de rebotes por IMAP, cruzada con la lista de asistentes
  • Cada entrada no entregada tiene su motivo y pasó a entrega manual

Offline check-in appApp de check-in sin conexión

A web app installed on any phone that keeps working with no signal after the first load.

Una app web que se instala en cualquier celular y sigue funcionando sin señal después de la primera carga.

  • QR scanning, plus search by name for people without their ticket
  • CSV export with the time of each scan
  • Automatic camera restart for a real iOS Safari bug
  • Escaneo de QR y búsqueda por nombre para quien no traía su entrada
  • Exportación a CSV con la hora de cada escaneo
  • Reinicio automático de la cámara por un bug real de Safari en iOS

Certificates and reportsCertificados y reportes

After the event, 253 certificate files were matched to attendees and sent with a preview in the email.

Después del evento, 253 certificados se cruzaron con los asistentes y se enviaron con vista previa en el correo.

  • Files matched to people by normalized name
  • PDF reports for the organizer with the status of every attendee
  • Archivos cruzados con cada persona por nombre normalizado
  • Reportes en PDF para el organizador con el estado de cada asistente

The app at the doorLa app en la puerta

Screens from the check-in app, captured with sample attendees. Real attendee data is never shown.Pantallas de la app de check-in, capturadas con asistentes de ejemplo. Nunca se muestran datos reales.

Check-in scanner screen with a live counter
Scanner with a live counter and a filter by day.Escáner con contador en vivo y filtro por día.
Valid ticket result showing name, seat and ticket type
Valid ticket: name, seat and ticket type.Entrada válida: nombre, asiento y tipo de entrada.
Duplicate scan warning with the time of first entry
Same ticket twice: flagged with the time of first entry.La misma entrada dos veces: se marca con la hora del primer ingreso.
Search by name for attendees without their ticket
Search by name for anyone without their ticket.Búsqueda por nombre para quien no trae su entrada.
Try the demo →Probar la demo → Access code: renace2026 · sample data only · search works without a cameraCódigo de acceso: renace2026 · solo datos de ejemplo · la búsqueda funciona sin cámara

ResultsResultados

305 of 318 tickets reached their inbox without a bounce. The rest had a clear reason (a typo, no email on file or a mailbox that does not exist) and went to the organizer for manual delivery.

At the door, six phones scanned tickets independently and offline, so a slow venue connection never held up the line.

305 de 318 entradas llegaron a su bandeja sin rebote. El resto tenía un motivo claro (un error de escritura, sin correo registrado o un buzón que no existe) y pasó al organizador para entrega manual.

En la puerta, seis celulares escanearon de forma independiente y sin conexión, así que la señal del salón nunca frenó la fila.

RoleRol
Design, development and operation on event daysDiseño, desarrollo y operación en los días del evento
Stack
Python, openpyxl, Pillow, qrcode, SMTP and IMAP, ReportLab, PWA with html5-qrcode, Vercel
DataDatos
Attendees, ticket types, delivery and bounce status, check-in times, certificatesAsistentes, tipos de entrada, estado de envío y rebotes, hora de check-in, certificados