Data Pull
Pull automático de AppsFlyer cada hora sin código: filtro de atribución primaria, cálculo de revenue, segmentación y frescura de datos.
Guide
Pull Automatico de Datos (Cero Codigo)
RELO jala tus datos de AppsFlyer cada hora automaticamente. Tu provees las credenciales, nosotros nos encargamos de todo lo demas.
Como Funciona la Pull API
El servicio Go de RELO en Hetzner ejecuta un job programado que llama a la AppsFlyer Pull API cada 60 minutos. Descarga reportes de eventos in-app, extrae datos de compra, corre matching de atribucion, y llena tu dashboard.
// Every 60 minutes, the Go service runs:
1. Download reports from AppsFlyer
GET https://hq1.appsflyer.com/api/raw-data/export/app/{app_id}/
in_app_events_report/v5
?from=2026-03-18&to=2026-03-18
&event_name=af_purchase
&additional_fields=is_primary_attribution,...
2. Filter by Primary Attribution
Only rows where Is Primary Attribution = "true" are processed.
This prevents double-counting when the same order appears in
both UA and RT reports.
3. Extract products from Event Value JSON
Parse af_content_id, af_price, af_quantity, items, awin_cg
4. Calculate correct revenue
Priority: awin_cg > Event Revenue proportional > af_price
5. Run attribution matching
Match campaign field against partner rules (exact/contains/etc.)
6. Classify products into segments
MX, VD, DA, HA, IT, NW, TAB based on product name/category
7. Write to ClickHouse + Supabase (dual-write)
Deduplication via sale_hash = SHA256(order_id|product_id|qty)
Reportes Descargados
Reporte
Frecuencia
Eventos
Plataformas
Eventos in-app UA
Cada 60 min
af_purchase
iOS + Android
Eventos in-app RT (Retargeting)
Cada 60 min
af_purchase
iOS + Android
Instalaciones
Diario a las 4 AM MX
install
iOS + Android
Reportes de fraude
Diario a las 4 AM MX
Instalaciones/eventos bloqueados
iOS + Android
Filtro de Atribucion Primaria
Cuando las campanas de retargeting estan activas, AppsFlyer exporta la misma compra en ambos reportes UA y RT. El campo Is Primary Attribution indica cual fuente es la ganadora.
// Example: Order MX251215-75414612 appears in BOTH reports
UA Report:
Campaign: ...sub3... (PartnerC)
Touch Time: 2025-12-14 17:48:54
Is Primary Attribution: FALSE // Not the winner
RT Report:
Campaign: ...sub1... (PartnerA)
Touch Time: 2025-12-14 17:50:15
Is Primary Attribution: TRUE // This is the winner
// RELO only processes rows where Is Primary Attribution = "true"
// This prevents double-counting and respects AppsFlyer's attribution decision
Sin este filtro: El primer CSV importado "ganaria" sin importar la atribucion real, llevando a atribucion incorrecta de partners y calculos de comisiones erroneos.
Calculo de Revenue
AppsFlyer provee multiples campos de precio. RELO usa una cadena de prioridad para obtener el revenue real (despues de descuentos), no el precio de lista:
// Revenue priority chain (highest accuracy first):
Priority 1: awin_cg (per-product breakdown)
"Mobile_Smartphone:16984.30|Mobile_Wearable:719.10"
-> Product 1 revenue: $16,984.30
-> Product 2 revenue: $719.10
-> Validates: sum must equal Event Revenue
Priority 2: Event Revenue (distributed proportionally)
Event Revenue: $17,703.40
af_price: [$41,998.99, $5,999.00]
-> Product 1: $17,703.40 * (41998.99 / 47997.99) = $15,501.25
-> Product 2: $17,703.40 * (5999.00 / 47997.99) = $2,202.15
Priority 3: af_price (list price fallback)
Only used when neither awin_cg nor Event Revenue is available.
WARNING: This is the list price BEFORE discounts.
Por que importa: Usar af_price directamente puede sobreestimar el revenue en 40-60% por descuentos promocionales. awin_cg da el revenue exacto por producto despues de descuentos.
Clasificacion de Segmento de Producto
Cada producto se clasifica automaticamente en un segmento para el calculo de comisiones:
Segmento
Nombre
Palabras Clave
MX
Mobile
galaxy s, galaxy z, buds, watch, sm-
VD
Visual Display
tv, qled, oled, soundbar, monitor
DA
Digital Appliances
refrigerador, lavadora, horno, bespoke
HA
Home Appliances
aire, microondas, aspiradora
IT
Computing
laptop, tablet, galaxy book, tab s
NW
Network
router, mesh, wifi, switch
TAB
Tablets
tab (word boundary match only)tab (solo match de palabra completa)
Configuracion: Proveyendo Credenciales
1
Obtiene tu token de Pull API de AppsFlyer
En AppsFlyer, ve a Settings → API Tokens. Copia el token de Pull API v2.0. Este NO es el mismo que el token V1 o el token de Admin API.
2
Comparte tus app IDs
Provee tu app ID de iOS (ej: id123456789) y el package name de Android (ej: com.samsung.shop.mx). RELO jala datos de ambas plataformas.
3
Envia las credenciales a tu account manager de RELO
Nosotros configuramos la Pull API en nuestro backbone de Hetzner. En 1 hora, tu primer pull de datos corre automaticamente y tu dashboard empieza a llenarse.
Trigger Manual
Los admins pueden disparar un pull de datos inmediato via la API (util despues de cambios de configuracion o para debuggear datos faltantes):
POST https://ingest.relo.mx/pull/trigger
Authorization: Bearer ADMIN_TOKEN
Content-Type: application/json
{
"client_id": 3,
"date": "2026-03-18",
"reports": ["ua_purchase", "rt_purchase"]
}
// Response 200:
{
"status": "started",
"message": "Pull triggered for client 3, date 2026-03-18",
"reports": ["ua_purchase", "rt_purchase"]
}
Frescura de Datos
Puedes verificar cuando fue la ultima vez que se jalaron datos via el endpoint de frescura de datos:
GET https://ingest.relo.mx/system/data-freshness
// Response 200:
{
"clients": [
{
"client_id": 3,
"client_name": "Marca",
"last_pull": "2026-03-18T15:00:00Z",
"minutes_ago": 32,
"status": "fresh",
"orders_today": 145,
"orders_yesterday": 312
}
]
}
Estado de frescura: fresh = jalado en los ultimos 90 minutos. stale = 90-180 minutos desde el ultimo pull. critical = mas de 180 minutos. El dashboard de admin muestra un banner de warning cuando los datos estan desactualizados.