01Premisa
Doc 11 detalla qué hace el sistema a nivel granular: qué herramienta específica toma cada decisión · cómo conversan entre sí · qué disparadores activan cada flujo · qué endpoints toca · qué tablas DB · qué UI screen.
💡 No es repetición de Doc 02 BBP
Doc 02 muestra los 14 procesos. Doc 11 detalla cómo CADA proceso se ejecuta en herramientas concretas con disparadores · datos · APIs · UI. Doc 13 es el espejo técnico (cómo se construye).
02Mapa funcional de herramientas
Cada bloque = herramienta concreta del stack. Click ve qué casos de uso la usan + cómo conversa con las demás. Filtros por modo (local · Nexport · dropship).
04Workflows por modo · paso a paso
4.1 · Modo stock propio compra local Chile (Y1 prioridad)
Venta end-to-end · 3 escenarios paralelos (MeLi · D2C storefront · MP) · cada etapa con herramientas · disparadores · DB · tiempo target. Click box ve detalle granular.
3 canales del mismo modo stock propio:
| Canal |
Margen |
Comisión |
Volumen Y1 esperado |
| MELI (default visible) |
28% |
Fee MeLi 13-17% + MP 2.9% |
80% Y1 |
| D2C storefront |
40%+ |
Solo pasarela 2.9% |
5-10% Y1 · crece Y2 |
| MP B2G |
22-30% |
0% (pago directo institución 30-60d) |
Fase 3 |
4.2 · Modo dropshipping (paralelo)
Venta sin stock propio · 7 etapas · OC propagada al proveedor · despacho directo al cliente final.
4.3 · Modo Nexport importación (Fase 2 · Y2+)
Same flow que 4.1 más sub-proceso importación previo (ciclo 30-90 días USD). Documentado en Doc 02 BBP P02b.
0524 casos de uso · detalle granular
Cada CU tiene 6 atributos: Trigger · Tools · Endpoint · Tablas · UI screen · Output.
Fase 1 · Reputación Q4-26 (CU-001 → CU-006)
CU-001 · Crear producto en catálogo maestro
| Atributo |
Detalle |
| Trigger |
Founder click "Nuevo producto" en /dashboard/productos |
| Tools |
Supabase Postgres (insert) · Supabase Storage (upload fotos) |
| Endpoint |
POST /api/products (validación Zod · service_role insert) |
| Tablas |
products (insert) · product_images (jsonb embedded) |
| UI screen |
/dashboard/productos/nuevo · formulario 12 campos · drag-drop fotos |
| Output |
producto con id UUID · status='active' · ready para publicar |
| Tiempo target |
< 3 min input founder · < 500ms response API |
CU-002 · Configurar listing MeLi
| Atributo |
Detalle |
| Trigger |
Founder click "Publicar en MeLi" en producto existente |
| Tools |
MeLi API v2 (POST /items) · Channel Adapter pattern |
| Endpoint |
POST /api/channels/meli/publish/:product_id |
| Tablas |
channel_listings (insert) · products (update external_ids) |
| UI screen |
Modal con campos MeLi-specific (categoría · attrs requeridos) |
| Output |
listing live en MeLi · mlc_id guardado en DB |
| Tiempo target |
< 5s API call MeLi + 2s db write |
CU-003 · Primera venta (regalo o costo)
| Atributo |
Detalle |
| Trigger |
Comprador hace pedido en MeLi · MeLi dispara webhook |
| Tools |
Webhook receiver · DB insert · Open Factura DTE 39 · Chilexpress label |
| Endpoint |
POST /api/webhooks/meli (HMAC + idempotency) |
| Tablas |
orders (insert · status=accepted) · order_items (insert) · inventory (decrement · SELECT FOR UPDATE) |
| UI screen |
Toast "Nueva venta MeLi" · /dashboard/ordenes/:id |
| Output |
Orden cerrada · DTE emitido · etiqueta · email comprador |
| Tiempo target |
Webhook → DTE emitido < 30s end-to-end |
CU-004 · Recibir orden vía webhook (genérico)
| Atributo |
Detalle |
| Trigger |
MeLi POST webhook con order_id |
| Tools |
Next.js Route Handler · HMAC SHA-256 verify · Idempotency key check |
| Endpoint |
POST /api/webhooks/meli |
| Tablas |
webhook_events (append-only audit) · orders (insert si nueva) |
| UI screen |
N/A · server-side |
| Output |
Order procesada · stock reservado · pg_notify event |
| Reglas BR |
BR-005 (stock real-time) · BR-006 (SELECT FOR UPDATE) · BR-009 (DTE auto) |
CU-005 · Emitir DTE 39 boleta
| Atributo |
Detalle |
| Trigger |
Evento order.completed · pg_notify dispara worker |
| Tools |
Open Factura API · Supabase Storage (PDF) · Gmail API (email) |
| Endpoint |
POST /api/invoices/emit/:order_id (internal) |
| Tablas |
invoices (insert con folio_sii · pdf_url) |
| UI screen |
Indicador en /dashboard/ordenes/:id con badge DTE estado |
| Output |
DTE 39 con folio SII oficial · PDF en Storage · email al comprador |
| Reglas BR |
BR-010 (39 default · 33 si RUT empresa) · BR-011 (retry 5x) |
CU-006 · Tracker reputación · 10 ventas verdes
| Atributo |
Detalle |
| Trigger |
Cada orden completada dispara recálculo |
| Tools |
Postgres materialized view + pg_cron refresh 1h |
| Endpoint |
GET /api/metrics/reputation |
| Tablas |
orders JOIN order_reputation_signals (view) |
| UI screen |
Widget hero /dashboard · progress bar 0/10 · color sem |
| Output |
Indicador real-time hito Fase 1 |
Fase 2 · Escala MeLi Q1-27 (CU-007 → CU-012)
CU-007 · Configurar Mercado Ads campaign
| Atributo |
Detalle |
| Trigger |
Founder click "Crear campaña" en producto con reputación verde |
| Tools |
MeLi Ads API · validation reputation_color=green antes submit |
| Endpoint |
POST /api/channels/meli/ads/campaign |
| Tablas |
ads_campaigns (insert) · ads_pixels (mapping product → pixel) |
| UI screen |
Wizard 3 pasos: producto · presupuesto · validación BR-003 |
| Output |
Campaña activa · tracking ROAS panel |
CU-008 · Monitor ROAS · pausar si <1.5x
| Atributo |
Detalle |
| Trigger |
Cron diario 7am calcula ROAS últimas 7d por campaña |
| Tools |
Cerebro IA sugiere · founder decide en UI |
| Endpoint |
GET /api/channels/meli/ads/roas · POST .../pause/:id |
| Tablas |
ads_metrics_daily (insert) · ads_campaigns (update status) |
| UI screen |
Dashboard /ads tabla ROAS · botón pausar · sugerencia Cerebro |
| Output |
Campañas con ROAS <1.5x sugeridas para pausa · founder valida |
CU-009 · Migrar SKU a Full Fulfillment MeLi
| Atributo |
Detalle |
| Trigger |
Producto vende >5 unidades/sem sostenido 4 sem |
| Tools |
MeLi FF API · workflow migración stock físico |
| Endpoint |
POST /api/channels/meli/fulfillment/migrate/:product_id |
| Tablas |
products (update fulfillment_mode='full') · inventory_transfers |
| UI screen |
/dashboard/productos/:id/fulfillment con CTA migrar |
| Output |
Stock en almacenes MeLi · mayor visibilidad algoritmo |
CU-010 · Subir a Medalla Plata
| Atributo |
Detalle |
| Trigger |
Sistema cumple criterios MeLi (auto-tracked poll diario) |
| Tools |
MeLi seller reputation API · poll daily |
| Endpoint |
GET /api/channels/meli/reputation/level |
| Tablas |
seller_reputation_history (insert) |
| UI screen |
Badge dashboard · animación al subir |
| Output |
Medalla Plata visible públicamente |
CU-011 · Cerebro IA alertas oportunidades
| Atributo |
Detalle |
| Trigger |
Cron diario 6am · scoring 6 señales sin LLM |
| Tools |
Cerebro scoring algorithm · Postgres queries · SoloTodo |
| Endpoint |
GET /api/cerebro/opportunities?min_score=70 |
| Tablas |
opportunities (insert/update con score) · opportunity_signals (jsonb) |
| UI screen |
Panel /dashboard/oportunidades · top 10 sorted by score |
| Output |
Top 10 del día · cero costo IA por scoring |
CU-012 · Cerrar Fase 2 (30 órdenes/mes sostenidas)
| Atributo |
Detalle |
| Trigger |
Cron mensual día 1 · si threshold 2x consecutivo · hito cerrado |
| Tools |
Postgres analytics query · pg_cron · email founders |
| Endpoint |
GET /api/metrics/phase-2-progress |
| Tablas |
phase_milestones (update) |
| UI screen |
Hero dashboard "Fase 2 cerrada · pasamos a Fase 3" |
| Output |
Notificación email + sistema migra lógica a Fase 3 |
Fase 3 · Diversificación Q2-27 (CU-013 → CU-018)
CU-013 · Sync diario licitaciones Mercado Público
| Atributo |
Detalle |
| Trigger |
Vercel cron 8am · header CRON_SECRET valida |
| Tools |
Mercado Público API REST · ticket auth · Cerebro filter |
| Endpoint |
POST /api/cron/sync-mp |
| Tablas |
mp_licitaciones (insert/update) · mp_categorias_match (insert) |
| UI screen |
N/A server · visible en /dashboard/mercado-publico |
| Output |
Licitaciones nuevas del día filtradas + scored |
CU-014 · Cerebro filter + scoring licitaciones
| Atributo |
Detalle |
| Trigger |
post CU-013 · pg_notify event mp_synced |
| Tools |
Cerebro scoring + matching catálogo (pg_trgm fuzzy) |
| Endpoint |
GET /api/cerebro/mp-suggestions?date=today |
| Tablas |
mp_licitaciones JOIN products ON fuzzy SKU |
| UI screen |
Panel B2G con top 5 sugeridas + score |
| Output |
Top 5 licitaciones afines + scoring del día |
CU-015 · Postular a licitación MP
| Atributo |
Detalle |
| Trigger |
Javier click "Postular" en sugerencia |
| Tools |
MP API POST oferta · template Cerebro genera · founder valida |
| Endpoint |
POST /api/channels/mp/postular/:licitacion_id |
| Tablas |
mp_postulaciones (insert) · mp_ofertas_pdf (Storage) |
| UI screen |
Wizard 4 pasos: validar items · pricing · template · submit |
| Output |
Oferta enviada · pending hasta apertura |
CU-016 · Webhook adjudicación MP
| Atributo |
Detalle |
| Trigger |
MP envía webhook POST resultado |
| Tools |
Mercado Público webhook receiver · HMAC validation |
| Endpoint |
POST /api/webhooks/mp |
| Tablas |
mp_postulaciones (update status) · orders (insert si ganada) |
| UI screen |
Notificación + workflow despacho institucional |
| Output |
Primera adjudicación B2G · workflow despacho activo |
CU-017 · Cliente B2B envía RFQ
| Atributo |
Detalle |
| Trigger |
Cliente B2B POST form portal /b2b/rfq |
| Tools |
Form Next.js + Zod validation · API key del cliente |
| Endpoint |
POST /api/b2b/rfq |
| Tablas |
b2b_rfqs (insert) · b2b_companies (lookup/insert) |
| UI screen |
Notification founder · /dashboard/b2b/rfq/:id |
| Output |
RFQ recibida · founder genera cotización |
CU-018 · Cierre Fase 3
Threshold: 1+ adjudicación MP + 1+ B2B + MeLi 30+/mes sostenidos.
Fase 4 · Consolidación Q3-27 (CU-019 → CU-024)
CU-019 conciliación pagos vs DTE · CU-020 evaluación Nexport · CU-021 D2C prep · CU-022 setup primer supplier dropship · CU-023 risk review · CU-024 cierre Y1 con break-even.
Detalle por CU sigue mismo formato 6 atributos.
0618 reglas de negocio · ejemplo concreto cada una
Cada BR ahora con implementación específica:
BR-001 · Fotos pro propias siempre
Implementación:
· Validation Zod en POST /api/products requiere >= 3 images
· Cada imagen pasa por detector "is_provider_default" (perceptual hash
contra base fotos típicas proveedores Chile)
· Si match > 80% similarity → bloquear publish con error
"Esta foto es del proveedor · subí foto propia · ver Doc 17 Estrategia Fase 1"
BR-005 · pg_notify cross-canal stock < 1s
Implementación:
· Trigger Postgres ON UPDATE OF inventory.stock_real
· NOTIFY 'inventory_changed' con product_id payload
· Listener Node.js suscrito · llama channels-sync API por adapter
· Timeout máx 1s · si excede → alerta CloudWatch
BR-010 · DTE 39 boleta default · 33 si RUT empresa
Implementación:
· POST /api/invoices/emit valida campo customer_rut
· Si rut termina en -K o letra después número → empresa → DTE 33
· Sino → DTE 39 (boleta persona natural)
· Edge case: RUT 60-66M (entidades públicas) → DTE 33 forzado
BR-016 · Fallback chain IA · NUNCA Claude
Implementación:
· OpenRouter routing con preferences order:
1. groq/llama-3.3-70b-versatile (primary · rate 12K TPM)
2. google/gemini-2.0-flash-001 (fallback · free tier)
3. deepseek/deepseek-chat (fallback 2 · cheap)
· Claude excluido explícitamente en config preferences
· Si los 3 fallan → retornar mensaje "IA temporalmente no disponible · reintentando..."
(13 BRs restantes con tratamiento similar granular)
08Criterios aceptación medibles con SQL
-- Fase 1 cerrada · 10 ventas verdes
SELECT COUNT(*) >= 10 AS phase_1_closed
FROM orders
WHERE channel='meli'
AND status='delivered'
AND reputation_color='green'
AND completed_at > NOW() - INTERVAL '60 days';
-- Fase 2 · 2 meses consecutivos 30+ órdenes
SELECT COUNT(*) >= 2 AS phase_2_closed
FROM (
SELECT DATE_TRUNC('month', completed_at) AS month,
COUNT(*) AS orders_count
FROM orders
WHERE channel='meli' AND status='delivered'
GROUP BY month
HAVING COUNT(*) >= 30
) recent_months
WHERE month >= NOW() - INTERVAL '3 months';
-- Margen blended mensual
SELECT
DATE_TRUNC('month', completed_at) AS month,
SUM(total) AS revenue,
SUM(cogs) AS cogs,
ROUND(((SUM(total) - SUM(cogs))::float / NULLIF(SUM(total), 0) * 100)::numeric, 2) AS margin_pct
FROM orders
WHERE status='delivered'
GROUP BY month
ORDER BY month DESC LIMIT 12;
-- ROAS Mercado Ads por campaña últimas 7d
SELECT
c.name,
c.product_id,
SUM(m.revenue) AS revenue_7d,
SUM(m.spend) AS spend_7d,
CASE WHEN SUM(m.spend) > 0
THEN ROUND((SUM(m.revenue) / SUM(m.spend))::numeric, 2)
ELSE NULL
END AS roas
FROM ads_campaigns c
JOIN ads_metrics_daily m ON m.campaign_id = c.id
WHERE m.date > NOW() - INTERVAL '7 days'
GROUP BY c.id, c.name, c.product_id
ORDER BY roas ASC NULLS LAST;