Cómo lo armamos
Las 4 piezas del reporte diario
Cada pieza se conecta una vez y después corre sola. La idea es que cuando abrís el sheet a la mañana, ya tenés el día anterior completo.
GET /ordersFilter: paid + ≠ cancelledClassification by owner_note
El primer pull. Traés todas las órdenes del día anterior con created_at_min y created_at_max. Para cada orden, leés el detalle individual (/orders/{id}) para obtener la owner_note y clasificarla: si dice local/guemes es local físico Güemes, local/palermo es CABA, off/wsp es WhatsApp, off/insta es Instagram, sin nota es venta web genuina (TN), mayorista o retiro NO se cuentan.
Filtros críticos que aprendimos a la mala: excluir status: cancelled, excluir cambio en owner_note (es cambio de producto, no venta nueva), y solo contar payment_status: paid. Si no filtrás bien, tu reporte de facturación está inflado y las decisiones que tomás se basan en data falsa. Una orden no pagada NO es una venta — esto suena obvio pero la mitad de los reportes que vemos no lo hacen.
Qué se desbloquea
Saber cuánto vendiste por cada canal sin abrir Tiendanube. Detectar productos que rotaron poco. Comparar contra el mismo día de la semana pasada.
GET /orders/searchAuth: refresh_tokenEndpoint: per seller_id
Si vendés en Meli, sumás esa fuente. La API usa OAuth con refresh_token — el access token vive 6 horas, así que tu integración tiene que renovarlo automáticamente. Después es simple: traés las órdenes del día filtradas por seller, descartás canceladas, y sumás al canal MELI.
Qué se desbloquea
Ver el peso del marketplace vs tu ecommerce propio. Detectar qué productos rotan distinto en cada canal. Saber si vale la pena seguir invirtiendo en Meli o focalizar en TN.
GET /v1/forecastFree, sin authMar del Plata + CABA
El dato menos obvio pero que más sentido tiene. Para cada local físico, consultás temperatura media y precipitación del día. Mar del Plata para Güemes (lat -38.00, lon -57.55), CABA para Palermo (lat -34.61, lon -58.38). Lo guardás en una columna del Sheet junto al dato de venta. La API es gratis y no necesita autenticación.
Convención que usamos: columna "Lluvia" como SI/NO según si la precipitación supera 0.5mm en el día. Esto te permite hacer análisis tipo "días lluviosos vs días secos" en el local físico. Sin esto, leés que cayó la venta y empezás a buscar problemas internos cuando en realidad pasó un temporal.
Qué se desbloquea
Cuando un local cae 30%, sabés si es estructural o porque llovió. Patrones de venta vs clima en el largo plazo. Decisión de stock para fines de semana según pronóstico.
Sheets API batchUpdateService account authUna pestaña por canal
El último paso: escribir todo lo procesado en un Google Sheet. Pestaña por canal (GUEMES, PALERMO, TN, INST, WSP, MELI, ON, OFF, LOCALES, TOTALES). Fila = día del mes + 4 (la fila 5 es día 1, la fila 35 es día 31). El número 4 es porque las primeras 4 filas son headers y secciones de meta-info.
La regla de oro de las fórmulas: el total mensual SIEMPRE va con fórmula (=SUM(K5:K35)), nunca valor estático. Si pegás un número, cuando cargás un día nuevo el total queda desactualizado. Para promedios que excluyen ceros: =IFERROR(AVERAGEIF(T5:T35,">0"),0). Para ratios agregados (ROAS, costo por mensaje): siempre numerador_total / denominador_total, NUNCA promedio simple de ratios diarios — ese es el famoso "promedio del promedio" que miente.
Qué se desbloquea
Histórico mensual completo accesible. Cualquiera del equipo lo abre y entiende. Conectás Looker o Data Studio si querés visualizaciones.