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:

  1. Genera tu webhook URL en SELLERP (256-bit secret per-org). Se la mandas a tu ejecutivo de PQTX por email (template incluido).
  2. 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.