Files
apps-registry/docs/playbooks/incidente-medusa-precios-region-id-2026-08.md
T
devops b42bcad45e docs(playbooks): documentar incidentes túnel/precios/imágenes [skip ci]
Tres incidentes resueltos en la sesión del 2026-08-12/13: 504 intermitente
por QUIC inestable en cloudflared, precios null por falta de region_id
en el Store API de Medusa v2 (se descarta la hipótesis inicial de
regiones COP duplicadas con evidencia directa en Postgres), e imágenes
en blanco por un proxy host mal configurado en Nginx Proxy Manager para
media.cruzcloud.net. Se agregan también dos notas de referencia en
known-issues.md: la topología Cloudflare Tunnel -> NPM -> k3d, y el
requisito de region_id explícito en StoreGetProductsParams.
2026-08-13 18:34:10 -05:00

4.1 KiB

Incidente: precios null en detalle de producto (Medusa Store API sin region_id) (2026-08)

Ventana del incidente: 2026-08-12, resuelto el mismo día (commit 60072cf) Servicio afectado: medusa-svc (Store API), consumido por el frontend Next.js de ARI Shopping Impacto: en el listado de productos (/catalog) los precios se mostraban correctamente, pero en la página de detalle de producto individual varios artículos mostraban "Consultar precio" en vez del monto real.

Hipótesis inicial descartada: regiones COP duplicadas

La primera hipótesis fue que existían regiones "Colombia (COP)" duplicadas en Medusa, causando ambigüedad al resolver el precio. Se descartó con evidencia directa en Postgres, consultando la tabla region incluyendo soft-deletes:

SELECT id, name, currency_code, created_at, updated_at, deleted_at FROM region ORDER BY created_at;

               id                |   name   | currency_code |         created_at         |         updated_at         | deleted_at
----------------------------------+----------+---------------+----------------------------+----------------------------+------------
 reg_01KZT86WPAH7A7ZZRDSX3350V2  | Colombia | cop           | 2026-08-12 05:48:03.151+00 | 2026-08-12 05:48:03.151+00 |
(1 row)

Una sola fila, creada una sola vez, nunca actualizada, nunca borrada (deleted_at vacío). No había ni hubo nunca una región duplicada — la hipótesis de deduplicación quedó descartada con esta consulta.

Causa raíz real

El backend de Medusa no tenía ninguna región configurada. El frontend pedía precios al Store API (/store/products) usando el parámetro currency_code=cop, pero el validador StoreGetProductsParams de Medusa v2 (.strict()) no acepta ese campo — devolvía 400 Unrecognized fields: 'currency_code' en cada carga de /catalog.

Se probó también country_code, que tampoco funcionó — Medusa respondía:

Missing required pricing context to calculate prices - region_id

Medusa v2 requiere explícitamente un region_id válido para poder calcular precios (calculated_price) vía Store API; ni currency_code ni country_code son parámetros válidos para ese fin.

Fix aplicado

Commit 60072cf"fix: usar region_id en vez de currency_code para precios de Medusa" (PR #5, mergeado en 04dc6bd):

  1. Se creó la región "Colombia" (moneda COP) vía Admin API — no existía ninguna región configurada previamente.
  2. Se modificó el frontend para pedir precios usando region_id explícito en vez de currency_code, vía una nueva variable de entorno MEDUSA_REGION_ID:
# workloads/ecommerce/frontend.yaml
         - name: MEDUSA_BACKEND_URL
           value: http://medusa-svc:9000
+        - name: MEDUSA_REGION_ID
+          value: reg_01KZT86WPAH7A7ZZRDSX3350V2
# workloads/ecommerce/lib/headless/providers/medusa.ts
   const params = new URLSearchParams({
     limit: String(limit),
-    currency_code: "cop",
+    // El validador de /store/products no acepta currency_code (400
+    // "Unrecognized fields"); el precio calculado solo se resuelve con
+    // region_id.
+    region_id: regionId(),

No hubo migración de precios entre regiones — no existían datos previos que migrar; la región se creó de cero como parte de este mismo fix. MEDUSA_REGION_ID no ha cambiado desde el commit original (verificado con git log -p --follow sobre frontend.yaml), y sigue apuntando a la única región que existe en la base.

Lecciones aprendidas

Verificar la causa raíz contra el estado real de la base de datos antes de asumir la primera hipótesis, aun cuando esa hipótesis coincida con la intuición inicial de quien reporta el bug ("puede que haya algo duplicado"). La consulta a region incluyendo deleted_at tomó segundos y evitó documentar una causa raíz incorrecta en este mismo playbook.

Nota de arquitectura: Medusa v2 Store API (StoreGetProductsParams) requiere region_id explícito para resolver precios calculados. currency_code y country_code no son parámetros válidos para ese fin — ver también docs/known-issues.md.