Paqueterías
Paquetexpress
Integración con Paquetexpress (PQTX) — paquetería nacional MX. Slug: paquete_express. Modelo de datos custom (no usa la tabla shared orders).
Datos disponibles
- Guías con ~55 campos por guía: status, tracking, eventos.
- Tracking events: SWB (recibida), HCA (en hub), TRN (en tránsito), EAD (en agencia destino), ENT (entregada).
Cómo conectar
Desde Onboarding → Paquetexpress. Flujo de dos pasos:
- Genera tu webhook URL en SELLERP (256-bit secret per-org). Se la mandas a tu ejecutivo de PQTX por email (template incluido).
- Cuando PQTX te entrega usuario + token, los pegas en SELLERP y ya. Sync inicial desde 01/01/2026 corre automático.
Webhooks
Endpoint canónico: POST https://api.sellerp.com/webhooks/paquetexpress/[orgPublicId]?secret=PER_ORG. El host api.sellerp.com es la única superficie aceptada en producción; legacy hosts (sellerp.com, app.sellerp.com) responden 410 Gone.
Secret per-org (256 bits) almacenado encriptado en marketplace_accounts.webhook_secret. Validación timing-safe sin fallback global — cuentas legacy sin secret deben re-conectarse para generar uno nuevo.
Idempotencia: ON CONFLICT DO NOTHING sobre la dedup key (org_id, rastreo, evento_id, fechahora) en pqtx_shipment_events. El campo source="webhook" se asigna exclusivamente cuando el evento entró por este handler — tracking-history sync asigna source="tracking_history".
Auditoría: cada recepción válida (post secret + post Zod) deja una fila en pqtx_webhook_receipts con linked reflejando si el evento se pudo ligar a un shipment existente.
Eventos huérfanos (rastreo todavía no sincronizado) entran con pqtx_shipment_id=null y se reconcilian con la RPC reconcile_pqtx_orphan_events en cada tick del sync incremental.
Sync
3 Inngest functions: incremental */15 * * * * (fan-out per-org desde el último sync), tracking-history 0 */2 * * * (re-fetch fechas con cambios), e initial sync desde 01/01/2026 al conectar. Webhooks son la vía rápida; el polling/getReport es respaldo para huecos.