[{"data":1,"prerenderedAt":401},["ShallowReactive",2],{"site-footer":3,"post-barra-de-cafe-mi-esposa-bloqueo-meta-wallet":28,"surround-barra-de-cafe-mi-esposa-bloqueo-meta-wallet":397},{"brand":4,"contact":5,"socials":8,"tagline":25},"David Cuy",{"email":6,"location":7},"david.cuy.sanchez@gmail.com","Mérida, MX",[9,13,17,21],{"_key":10,"platform":11,"url":12},"gh","github","https://github.com/DavidCuy",{"_key":14,"platform":15,"url":16},"li","linkedin","https://www.linkedin.com/in/david-cuy",{"_key":18,"platform":19,"url":20},"rs","rss","/rss.xml",{"_key":22,"platform":23,"url":24},"ml","mail","mailto:david.cuy.sanchez@gmail.com",{"en":26,"es":27},"Cloud Architect & Software Engineer. Cloud + coffee — technical precision, served warm.","Cloud Architect & Software Engineer. Nube + café — precisión técnica, servida tibia.",{"_id":29,"author":30,"body":33,"category":381,"cover":382,"date":383,"excerpt":384,"image":385,"readingTime":386,"slug":387,"tags":388,"title":396},"ba0f83df-8e77-489b-a395-da61fd5a0c1b",{"avatar":31,"name":32},null,"David de los Santos Cuy Sanchez",[34,45,62,70,79,87,95,103,111,119,131,152,164,172,180,188,196,205,210,218,221,229,241,261,273,285,293,301,309,317,325,333,341,349,357,365,373],{"_key":35,"_type":36,"children":37,"markDefs":43,"style":44},"b001","block",[38],{"_key":39,"_type":40,"marks":41,"text":42},"s001","span",[],"Hay proyectos que salen exactamente como los planeaste. Este no fue uno de ellos. Y por eso vale la pena contarlo.",[],"normal",{"_key":46,"_type":36,"children":47,"markDefs":61,"style":44},"b002",[48,52,57],{"_key":49,"_type":40,"marks":50,"text":51},"s002a",[],"Mi esposa tiene una barra de café de barrio: ",{"_key":53,"_type":40,"marks":54,"text":56},"s002b",[55],"strong","Tulipán 58",{"_key":58,"_type":40,"marks":59,"text":60},"s002c",[],". Café de especialidad, buena vibra, clientes que regresan. Desde hace tiempo quería armarle un sistema de fidelidad — algo que premiara a los clientes frecuentes sin complicarle la vida a ella en la barra. La idea era simple: un QR que los clientes guardan, lo presentan al pedir, y acumulan sellos.",[],{"_key":63,"_type":36,"children":64,"markDefs":69,"style":44},"b003",[65],{"_key":66,"_type":40,"marks":67,"text":68},"s003",[],"Lo que no sabía es que un bloqueo de Meta me iba a obligar a construir algo mucho mejor de lo que tenía en mente.",[],{"_key":71,"_type":36,"children":72,"markDefs":77,"style":78},"b004",[73],{"_key":74,"_type":40,"marks":75,"text":76},"s004",[],"El plan original",[],"h2",{"_key":80,"_type":36,"children":81,"markDefs":86,"style":44},"b005",[82],{"_key":83,"_type":40,"marks":84,"text":85},"s005",[],"La idea inicial era usar WhatsApp. Tiene sentido: casi toda la población lo tiene instalado, los clientes ya lo usan, y un QR que persiste en una conversación es fácil de encontrar. Me registré en Meta Business Suite, di de alta un proyecto de WhatsApp Business, y empecé a construir.",[],{"_key":88,"_type":36,"children":89,"markDefs":94,"style":44},"b006",[90],{"_key":91,"_type":40,"marks":92,"text":93},"s006",[],"El problema fue que no le di el seguimiento correcto al proyecto en Meta. Las políticas de WhatsApp Business son estrictas — y con razón — y después de tres meses sin actividad real, Meta me baneó la página para proyectos de WhatsApp.",[],{"_key":96,"_type":36,"children":97,"markDefs":102,"style":44},"b007",[98],{"_key":99,"_type":40,"marks":100,"text":101},"s007",[],"Ahí estaba yo, a medio proyecto, sin canal de distribución.",[],{"_key":104,"_type":36,"children":105,"markDefs":110,"style":78},"b008",[106],{"_key":107,"_type":40,"marks":108,"text":109},"s008",[],"El pivote que no fue uno solo",[],{"_key":112,"_type":36,"children":113,"markDefs":118,"style":44},"b009",[114],{"_key":115,"_type":40,"marks":116,"text":117},"s009",[],"Lo interesante de esta historia es que el pivote no fue un momento de iluminación. Fue una cadena de decisiones, cada una mejor que la anterior.",[],{"_key":120,"_type":36,"children":121,"markDefs":130,"style":44},"b010",[122,126],{"_key":123,"_type":40,"marks":124,"text":125},"s010a",[55],"Primer pensamiento:",{"_key":127,"_type":40,"marks":128,"text":129},"s010b",[]," página web estática, distribuida por CDN para minimizar costos, personalizada por cliente. Mandar el link único por SMS. Simple, funciona.",[],{"_key":132,"_type":36,"children":133,"markDefs":151,"style":44},"b011",[134,138,142,147],{"_key":135,"_type":40,"marks":136,"text":137},"s011a",[55],"Segundo pensamiento:",{"_key":139,"_type":40,"marks":140,"text":141},"s011b",[]," espera. Si el cliente tiene que abrir un link en el navegador cada vez que quiere ver sus sellos, nadie lo va a hacer. Es impráctico. El objetivo era que la tarjeta de fidelidad estuviera ",{"_key":143,"_type":40,"marks":144,"text":146},"s011c",[145],"em","al alcance",{"_key":148,"_type":40,"marks":149,"text":150},"s011d",[],", no escondida en un SMS que nadie vuelve a abrir.",[],{"_key":153,"_type":36,"children":154,"markDefs":163,"style":44},"b012",[155,159],{"_key":156,"_type":40,"marks":157,"text":158},"s012a",[55],"Tercer pensamiento:",{"_key":160,"_type":40,"marks":161,"text":162},"s012b",[]," ¿y si la meto a la wallet del teléfono?",[],{"_key":165,"_type":36,"children":166,"markDefs":171,"style":44},"b013",[167],{"_key":168,"_type":40,"marks":169,"text":170},"s013",[],"Me registré como developer en Google y Apple. Aprendí el formato de las passes. Y de repente, lo que empezó como \"mando un QR por WhatsApp\" se convirtió en una tarjeta de fidelidad digital que vive en Google Wallet y Apple Wallet — que el cliente puede consultar, que puedo actualizar en tiempo real, y que en el caso de Apple hasta soporta notificaciones push.",[],{"_key":173,"_type":36,"children":174,"markDefs":179,"style":44},"b014",[175],{"_key":176,"_type":40,"marks":177,"text":178},"s014",[],"El bloqueo de Meta me obligó a pensar mejor el producto.",[],{"_key":181,"_type":36,"children":182,"markDefs":187,"style":78},"b015",[183],{"_key":184,"_type":40,"marks":185,"text":186},"s015",[],"La arquitectura que emergió",[],{"_key":189,"_type":36,"children":190,"markDefs":195,"style":44},"b016",[191],{"_key":192,"_type":40,"marks":193,"text":194},"s016",[],"El sistema tiene dos flujos principales. El primero es el registro de un cliente nuevo. El segundo es el registro de una compra.",[],{"_key":197,"_type":36,"children":198,"markDefs":203,"style":204},"b017",[199],{"_key":200,"_type":40,"marks":201,"text":202},"s017",[],"Flujo 1: Registro de cliente",[],"h3",{"_key":206,"_type":207,"code":208,"language":209},"c001","code","sequenceDiagram\n    actor Cliente\n    participant QR as QR en la barra\n    participant GF as Google Forms\n    participant Sistema as Sistema (API)\n    participant S3 as S3 + CloudFront\n    participant Wallet as Apple/Google Wallet\n\n    Cliente->>QR: Escanea el QR\n    QR->>GF: Abre el formulario de registro\n    Cliente->>GF: Llena sus datos\n    GF->>Sistema: Google Apps Script → POST con firma HMAC\n    Sistema->>Sistema: Registra en DB y POS (SaaS)\n    Sistema->>S3: Genera QR único + web estática personalizada\n    S3->>CloudFront: Distribuye por CDN\n    Sistema->>Cliente: Envía SMS + correo con link único\n    Cliente->>S3: Abre su web personalizada\n    Cliente->>Wallet: Agrega tarjeta a Google o Apple Wallet","mermaid",{"_key":211,"_type":36,"children":212,"markDefs":217,"style":204},"b018",[213],{"_key":214,"_type":40,"marks":215,"text":216},"s018",[],"Flujo 2: Registro de compra",[],{"_key":219,"_type":207,"code":220,"language":209},"c002","sequenceDiagram\n    actor Cliente\n    actor Barista as Barista (mi esposa)\n    participant POS as Sistema POS\n    participant Sistema as Sistema (API)\n    participant Wallet as Wallet del cliente\n\n    Cliente->>Barista: Presenta QR de su wallet\n    Barista->>POS: Escanea el QR en la sección de clientes\n    POS->>POS: Asocia cliente al ticket automáticamente\n    Barista->>POS: Cierra la venta\n    POS->>Sistema: Dispara evento de compra\n    Sistema->>Wallet: Actualiza sellos en la tarjeta\n    Sistema->>Barista: Notifica si el cliente ganó un premio\n    Sistema->>Cliente: Notifica en la wallet (Apple) o actualiza silencioso (Google)",{"_key":222,"_type":36,"children":223,"markDefs":228,"style":44},"b019",[224],{"_key":225,"_type":40,"marks":226,"text":227},"s019",[],"Cada parte de esta arquitectura tiene una decisión detrás.",[],{"_key":230,"_type":36,"children":231,"markDefs":240,"style":44},"b020",[232,236],{"_key":233,"_type":40,"marks":234,"text":235},"s020a",[55],"Google Forms para el registro:",{"_key":237,"_type":40,"marks":238,"text":239},"s020b",[]," podría haber hecho un formulario propio, pero eso implicaba costos que no justificaban esta etapa — WAF, reglas anti-bots, validaciones. Google Forms me da toda esa seguridad gratis. La integración con mi sistema la hago vía Google Apps Script con un POST firmado con HMAC: un secreto compartido entre el formulario y mi API. Nadie puede enviar datos basura haciéndose pasar por el formulario.",[],{"_key":242,"_type":36,"children":243,"markDefs":260,"style":44},"b021",[244,248,252,256],{"_key":245,"_type":40,"marks":246,"text":247},"s021a",[55],"S3 + CloudFront Functions para las wallets:",{"_key":249,"_type":40,"marks":250,"text":251},"s021b",[]," cada cliente tiene una web estática única guardada en S3. Nunca expongo el bucket directamente. CloudFront distribuye el contenido y las CloudFront Functions resuelven el ID único de cada cliente para saber qué contenido entregar — así, una URL limpia como ",{"_key":253,"_type":40,"marks":254,"text":255},"s021c",[207],"mi.tulipan.mx/xK7mBp9Q",{"_key":257,"_type":40,"marks":258,"text":259},"s021d",[]," siempre muestra la información correcta sin exponer la estructura interna del bucket. Costo casi cero, escala solo.",[],{"_key":262,"_type":36,"children":263,"markDefs":272,"style":44},"b022",[264,268],{"_key":265,"_type":40,"marks":266,"text":267},"s022a",[55],"SMS en lugar de notificaciones propias:",{"_key":269,"_type":40,"marks":270,"text":271},"s022b",[]," para la distribución inicial del link, SMS. Todo el mundo lo recibe, no requiere que el cliente tenga ninguna app instalada, y es el canal más directo para una URL.",[],{"_key":274,"_type":36,"children":275,"markDefs":284,"style":44},"b023",[276,280],{"_key":277,"_type":40,"marks":278,"text":279},"s023a",[55],"El SaaS del POS ya estaba:",{"_key":281,"_type":40,"marks":282,"text":283},"s023b",[]," mi esposa ya usaba un sistema de punto de venta en la nube que tiene API y webhooks. No lo reemplacé — me acoplé a él. El sistema genera eventos cuando se cierra una venta, y yo los escucho. Así el flujo de trabajo de mi esposa no cambió en nada: ella sigue usando la misma caja de siempre, y el sistema de fidelidad trabaja en segundo plano.",[],{"_key":286,"_type":36,"children":287,"markDefs":292,"style":78},"b024",[288],{"_key":289,"_type":40,"marks":290,"text":291},"s024",[],"Lo que hizo Claude y lo que hice yo",[],{"_key":294,"_type":36,"children":295,"markDefs":300,"style":44},"b025",[296],{"_key":297,"_type":40,"marks":298,"text":299},"s025",[],"Fui honesto desde el principio: usé Claude para construir esto. Prácticamente todo el código pasó por él — las CloudFront Functions, la integración con el POS, la generación de passes para Apple Wallet, la firma HMAC, las queries a la base de datos.",[],{"_key":302,"_type":36,"children":303,"markDefs":308,"style":44},"b026",[304],{"_key":305,"_type":40,"marks":306,"text":307},"s026",[],"Pero hay cosas que Claude no sabía.",[],{"_key":310,"_type":36,"children":311,"markDefs":316,"style":44},"b027",[312],{"_key":313,"_type":40,"marks":314,"text":315},"s027",[],"No sabía que Meta me había baneado y que WhatsApp ya no era una opción. No sabía que mi esposa trabaja sola en la barra y que cualquier fricción en el flujo del empleado era inaceptable. No sabía el presupuesto real del proyecto ni que agregar un WAF en esta etapa no tenía sentido. No sabía que los clientes de una barra de café de barrio necesitan algo tan simple que funcione en el primer intento, sin tutoriales.",[],{"_key":318,"_type":36,"children":319,"markDefs":324,"style":44},"b028",[320],{"_key":321,"_type":40,"marks":322,"text":323},"s028",[],"Todas esas restricciones son mías. El modelo de seguridad fue mío. La decisión de usar Google Forms en lugar de un formulario propio fue mía. La idea de las wallets fue mía. El diseño del flujo sin fricción — para el cliente y para mi esposa — fue mío.",[],{"_key":326,"_type":36,"children":327,"markDefs":332,"style":44},"b029",[328],{"_key":329,"_type":40,"marks":330,"text":331},"s029",[],"Claude aceleró la implementación de una forma que hace tres años me hubiera costado semanas. Pero el criterio, el contexto del negocio y las decisiones de arquitectura no vinieron del modelo. Vinieron de años de haber construido sistemas reales con restricciones reales.",[],{"_key":334,"_type":36,"children":335,"markDefs":340,"style":44},"b030",[336],{"_key":337,"_type":40,"marks":338,"text":339},"s030",[],"Eso es lo que nadie te dice cuando hablan de \"construir con IA\": la IA es el superpoder de quien ya tiene contexto. Sin ese contexto, solo produces código que no resuelve el problema correcto.",[],{"_key":342,"_type":36,"children":343,"markDefs":348,"style":78},"b031",[344],{"_key":345,"_type":40,"marks":346,"text":347},"s031",[],"Una semana en producción",[],{"_key":350,"_type":36,"children":351,"markDefs":356,"style":44},"b032",[352],{"_key":353,"_type":40,"marks":354,"text":355},"s032",[],"Esta semana se lanzó. Hay clientes reales con su tarjeta en la wallet. Mi esposa escanea QRs en la barra sin cambiar nada de su flujo de trabajo. El sistema procesa compras, actualiza sellos y notifica premios solo.",[],{"_key":358,"_type":36,"children":359,"markDefs":364,"style":44},"b033",[360],{"_key":361,"_type":40,"marks":362,"text":363},"s033",[],"Un mes de construcción, con Claude como copiloto. Sin Meta. Sin WhatsApp. Con una arquitectura mejor de la que había planeado.",[],{"_key":366,"_type":36,"children":367,"markDefs":372,"style":44},"b034",[368],{"_key":369,"_type":40,"marks":370,"text":371},"s034",[],"A veces los bloqueos te hacen construir mejor.",[],{"_key":374,"_type":36,"children":375,"markDefs":380,"style":44},"b035",[376],{"_key":377,"_type":40,"marks":378,"text":379},"s035",[145],"¿Tienes algún proyecto donde una restricción inesperada te obligó a repensar el enfoque? Me interesa leer tu experiencia en los comentarios.",[],"realsystems","decisions","2026-06-12T00:00:00.000Z","Quería un sistema de fidelidad simple para la barra de café de mi esposa. Meta me bloqueó a medio camino. Lo que construí después fue mucho mejor que el plan original — y casi todo el criterio fue mío, no de la IA.","https://cdn.sanity.io/images/my6ptkxm/production/ef10126e0ef2db8436684d9ed687bc63343b3fa4-1376x768.png",6,"barra-de-cafe-mi-esposa-bloqueo-meta-wallet",[389,390,391,392,393,394,395],"claude","aws","serverless","apple-wallet","google-wallet","arquitectura","ia","La barra de café de mi esposa, un bloqueo de Meta y una wallet que no tenía planeada",{"next":31,"prev":398},{"slug":399,"title":400},"como-uso-mermaid-comunicarme-producto-arquitecturar-devs-documentar","Cómo uso Mermaid para comunicarme con producto, arquitecturar con devs y documentar todo al mismo tiempo",1781326643938]