E-commerce · Datos
De un catálogo roto a una tienda Shopify que la clienta maneja sola
Problema
Un negocio de perfumería con un catálogo vencido, precios desactualizados, datos repartidos entre el POS, Excel y una tienda anterior, y dependencia total de un desarrollador previo para cualquier cambio.
Arquitectura
- POS export (source of truth)
- Normalize names & tags
- CSV import
- Shopify store
- Meta channels · ES/EN
Photos: handle → image URLs (Excel) → merge script → published only if it has an image
Solución
- Catálogo reconstruido desde el POS como fuente de verdad: nombres normalizados, etiquetas por género, marca y tamaño, y detección de duplicados y precios inconsistentes.
- Descripciones con pirámide olfativa generadas para todo el catálogo.
- Diseño de marca y home, filtros, tienda en español e inglés, canales de Meta, pagos a plazos, envíos a cotizar y descuento de mayoreo.
- Capacitación grabada y guía de administración para que la clienta opere la tienda sin depender de nadie.
Decisiones de diseño
- El POS es la fuente de verdad: todo lo demás (Excel, tienda anterior) se concilia contra él.
- Envío a cotizar mientras el catálogo no tenga peso por producto, en lugar de calcular tarifas con datos falsos.
- Mayoreo por código de descuento al lanzar, y una app dedicada como fase posterior.
- Convenciones de importación explícitas (sobrescribir, sin tocar imágenes) para que nadie borre fotos por accidente.
Desafíos técnicos
- Emparejar productos entre fuentes con fuzzy matching estricto: las familias de nombres parecidos generaban cruces erróneos.
- Un script en Python vincula las fotos a cada producto en lote y publica solo los que tienen imagen; los demás quedan en borrador.
- Las importaciones por CSV pueden borrar fotos y Meta resincroniza al cambiar nombres: se definieron convenciones de importación seguras.
Patrón destacado
# Link photos to products in bulk; products without photos stay as drafts.
import csv
def merge(products_csv, photos, out_csv):
"""photos: {handle: [url, ...]} read from the photo guide."""
with open(products_csv, newline="", encoding="utf-8") as f, \
open(out_csv, "w", newline="", encoding="utf-8") as g:
reader = csv.DictReader(f)
writer = csv.DictWriter(g, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
urls = photos.get(row["Handle"], [])
row["Image Src"] = urls[0] if urls else ""
row["Status"] = "active" if urls else "draft"
writer.writerow(row)
for extra in urls[1:]: # extra photos = extra rows
writer.writerow({"Handle": row["Handle"], "Image Src": extra})Resultados
- 171 productos migrados, 143 con notas olfativas reales.
- Filtros por género, marca y tamaño, en 2 idiomas.
- Catálogo completo sincronizado con Facebook e Instagram.
- Tienda en producción desde agosto de 2026.
Shopify, Liquid, Python, Excel/CSV, Meta, Translate & Adapt