Alta de partner lead-gen (pay-per-lead)
Cómo dar de alta un partner de un cliente pixel lead-gen: tarifa por lead, link de tracking, campaña y verificación de la primera comisión.
Alta de partner lead-gen (pay-per-lead)
Runbook para activar un partner en un cliente pixel lead-gen (ej. Quote, client 5 — quote.miami). A diferencia de Samsung (MMP, comisión por segmento sobre revenue), aquí el partner gana una tarifa fija por conversión (lead_submit) y todo se mide con el Relo Pixel.
Prerequisitos del lado del cliente
- El sitio del cliente carga
p.relo.mx/r.jscon suclient_idy dispararelo('lead', {...})al enviar el form (ver Pixel setup y el case study lead-gen). - El cliente existe en
clientsconcommission_source = 'events'(lead-gen puro) y suattribution_field(Quote usasub2).
Pasos
1. Crear el partner
Alta en partners (admin → Partners → nuevo, o PostgREST con service role). Mínimo: company_name, status = 'Activo'.
2. Asignar el cliente
Fila en partner_clients: partner_id, client_id, status = 'active', y attribution_values con el código del partner, ej. [{"value":"lobo","match_type":"exact"}].
3. Ligarlo a una campaña (obligatorio para que prenda el portal)
Fila en partner_campaigns (m2m partner↔campaña). Sin esto el partner portal muestra el empty state "has no campaigns yet" aunque todo lo demás esté bien. La campaña debe tener tracking_type = 'pixel'.
4. Configurar la tarifa por lead
Fila en partner_lead_rates (admin → ficha del partner → Lead rates, o /v2/settings/lead-rates):
| Campo | Ejemplo | Notas |
|---|---|---|
event_name | lead_submit | O * wildcard |
rate | 10.00 | Flat si is_percentage = false |
stage | NULL | NULL = aplica a todos los stages |
campaign_id | NULL | NULL = default del cliente; con valor = override por campaña |
monthly_cap | NULL | NULL = sin tope (budget ilimitado) |
effective_from | ver warning | Fecha de inicio de vigencia |
effective_from va contra la fecha del evento en America/Mexico_City, no UTC. Un lead enviado 10
dt del día anterior — si pones la fecha de "hoy" en UTC, ese lead no comisiona. Para cobertura inmediata, pon effective_from un día antes.5. Provisionar el link de tracking
Admin → ficha del partner → pixel link (POST /api/partners/:id/pixel-link con client_id + destination_url). Genera https://t.relo.mx/c/CODE:
- 302 a la landing con
?relo_click_id=<ULID> - Cookie first-party
_relo_cid(30 días) - La atribución se resuelve server-side en el ingest — no depende de UTMs
Los UTMs son opcionales y viajan solo como metadata. El partner puede agregar sub-IDs con el param del attribution_field (ej. ?sub2=lobo).
6. Verificación end-to-end
- Entra por el link, llena el form con datos de prueba obvios.
- ClickHouse (en el server backbone):
SELECT event_time, event_name, partner_id, event_properties FROM relo.events WHERE client_id = 5 AND event_name = 'lead_submit' ORDER BY event_time DESC LIMIT 5; -- partner_id debe ser el del partner, event_properties.relo_click_id poblado - Espera ≤10 min al sync y checa la comisión:
curl -X POST "$SUPABASE_URL/rest/v1/rpc/calculate_partner_lead_commission" \ -H "apikey: $KEY" -H "Authorization: Bearer $KEY" \ -d '{"p_partner_id":48,"p_client_id":5,"p_year":2026,"p_month":7,"p_campaign_id":null}' # applied_rate y raw_commission deben traer la tarifa - Abre el portal impersonado (
/v2/partner-portal/<id>): Dashboard con earnings, tab Leads con el lead (hashes, nunca PII).
Troubleshooting
| Síntoma | Causa probable | Fix |
|---|---|---|
| Portal dice "no campaigns yet" | Falta fila en partner_campaigns | Paso 3 |
Lead en CH con partner_id pero comisión en $0 | effective_from posterior al dt del lead (CDT vs UTC) | Paso 4 warning |
[sync-lead-commission] no conversion rows con leads presentes | Filas fantasma en relo.ledger_billable_conversions de cuando el cliente era ledger | Borrarlas: ALTER TABLE relo.ledger_billable_conversions DELETE WHERE client_id = N |
| Mi evento de prueba vía curl no aparece en CH | El ingest descarta eventos sin fingerprint real (anti-bot) | Prueba desde un navegador real |
| "No lead pricing configured yet" en el portal | El RPC no encuentra filas en partner_lead_daily todavía | Espera al ciclo de sync (10 min) |
Historial: el 2026-07-25 se arregló un bug en fetchLeadAgg (backbone/internal/sync/lead_commission.go) donde la rama "cliente sin gate" era código muerto por join_use_nulls apagado (gc.client_id IS NULL nunca se cumplía; se cambió a coalesce(gc.client_id, 0) = 0). Antes del fix, ningún cliente lead-gen en modo events sincronizaba comisiones.