Webhooks sortants
Recevez des notifications signées (campagnes, alertes futures) sur votre endpoint HTTPS.
Configuration (JWT)
GET /settings/webhook— lire la configPATCH /settings/webhook— définir l'URL globale tenantPOST /settings/webhook/secret— générer le secret (affiché une fois)GET /settings/webhook/deliveries— historique des livraisons
Vérification HMAC
Body JSON canonique (sort_keys=True). Headers : X-ZedCheckout-Signature (sha256=…), X-ZedCheckout-Timestamp.
import hmac
import hashlib
def verify(body: bytes, signature_header: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode("utf-8"), body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature_header.strip(), expected)Types d'événements
Implémentés
retention.campaign.sent— Envoi d'une campagne de rétention (canal webhook) (URL définie sur la campagne (webhook_url))customer.churn_score.changed— Score churn mis à jour après recalcul ou nouveaux événementscustomer.high_risk.detected— Client passe en bande de risque élevé ou critique
Exemple de payload campagne : — retention.campaign.sent
{
"event": "retention.campaign.sent",
"campaign_id": "uuid",
"campaign_name": "Win-back",
"customer_external_ids": ["cust_1"],
"recipients_count": 1
}Exemple de payload campagne : — customer.churn_score.changed
{
"event": "customer.churn_score.changed",
"customer_id": "cust_1",
"previous_score": 0.42,
"new_score": 0.68,
"previous_label": "medium",
"new_label": "high",
"model_version": "rule_v1"
}Exemple de payload campagne : — customer.high_risk.detected
{
"event": "customer.high_risk.detected",
"customer_id": "cust_1",
"score": 0.72,
"label": "high",
"model_version": "rule_v1"
}Roadmap
notification.slack.message_requested
Webhooks Shopify (connexion OAuth) : Webhooks Shopify.
Livraison & retry
- 8 tentatives max, backoff exponentiel (cap 1 h)
- Statuts :
pending,success,failed,dead_letter - Timeout HTTP : 15 s
Détail : docs/integrations/outbound-webhooks.md dans le monorepo.