Volver al portafolio

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

  1. POS export (source of truth)
  2. Normalize names & tags
  3. CSV import
  4. Shopify store
  5. 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