RRelo Docs
API & GuíasGuías

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.

Diagrama interactivo
Cargando diagrama…

Prerequisitos del lado del cliente

  • El sitio del cliente carga p.relo.mx/r.js con su client_id y dispara relo('lead', {...}) al enviar el form (ver Pixel setup y el case study lead-gen).
  • El cliente existe en clients con commission_source = 'events' (lead-gen puro) y su attribution_field (Quote usa sub2).

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):

CampoEjemploNotas
event_namelead_submitO * wildcard
rate10.00Flat si is_percentage = false
stageNULLNULL = aplica a todos los stages
campaign_idNULLNULL = default del cliente; con valor = override por campaña
monthly_capNULLNULL = sin tope (budget ilimitado)
effective_fromver warningFecha de inicio de vigencia

effective_from va contra la fecha del evento en America/Mexico_City, no UTC. Un lead enviado 10

PM CDT tiene 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.

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

  1. Entra por el link, llena el form con datos de prueba obvios.
  2. 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
  3. 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
  4. Abre el portal impersonado (/v2/partner-portal/<id>): Dashboard con earnings, tab Leads con el lead (hashes, nunca PII).

Troubleshooting

SíntomaCausa probableFix
Portal dice "no campaigns yet"Falta fila en partner_campaignsPaso 3
Lead en CH con partner_id pero comisión en $0effective_from posterior al dt del lead (CDT vs UTC)Paso 4 warning
[sync-lead-commission] no conversion rows con leads presentesFilas fantasma en relo.ledger_billable_conversions de cuando el cliente era ledgerBorrarlas: ALTER TABLE relo.ledger_billable_conversions DELETE WHERE client_id = N
Mi evento de prueba vía curl no aparece en CHEl ingest descarta eventos sin fingerprint real (anti-bot)Prueba desde un navegador real
"No lead pricing configured yet" en el portalEl RPC no encuentra filas en partner_lead_daily todavíaEspera 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.

On this page