ZedCheckout

Webhooks sortants

Recevez des notifications signées (campagnes, alertes futures) sur votre endpoint HTTPS.

Configuration (JWT)

  • GET /settings/webhook — lire la config
  • PATCH /settings/webhook — définir l'URL globale tenant
  • POST /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.sentEnvoi d'une campagne de rétention (canal webhook) (URL définie sur la campagne (webhook_url))
  • customer.churn_score.changedScore churn mis à jour après recalcul ou nouveaux événements
  • customer.high_risk.detectedClient 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.