Welcome to django-webhook!
A plug-and-play Django app for sending outgoing webhooks on model changes.
Django has a built-in signal system which allows programmers to schedule functions to be executed on model changes. django-webhook leverages the signal system together with Celery to send HTTP requests when models change.
Suppose we have a User model:
class User(models.Model):
name = models.CharField(max_length=50)
age = models.PositiveIntegerField()
If a webhook is configured, any time the above model is created, updated or deleted django-webhook will send an outgoing HTTP request to a third party:
POST HTTP/1.1
host: webhook.site
user-agent: python-urllib3/2.0.3
django-webhook-uuid: 5e2ee3ba-905e-4360-94bf-18ef21c0e844
django-webhook-signature-v1:
django-webhook-request-timestamp: 1697818014
{
"event_id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
"occurred_at": "2023-10-20T18:06:54+00:00",
"topic": "users.User/create",
"object": {
"id": 3,
"name": "Dani Doo",
"age": 30
},
"object_type": "users.User",
"webhook_uuid": "5e2ee3ba-905e-4360-94bf-18ef21c0e844"
}
Each event carries a unique event_id and the occurred_at time of the change (both stable across
retries), so at-least-once redeliveries are safe to dedup and order.
🔥 Features
Automatically sends webhooks on model changes
Dispatch only after the database transaction commits — a rollback never publishes
Event production is isolated from the writer: a serializer or broker error can never fail
save()Leverages Celery for processing
Webhook authentication using HMAC
Retries every failure mode (connection, timeout, error response) with exponential backoff
Configurable request timeout
Manual re-send of recorded deliveries, from the admin or programmatically
Independent retention windows for succeeded and failed deliveries
Pluggable per-model payload serializers
Public emission API for set-based writes (
QuerySet.update,bulk_create,bulk_update)Admin integration (configurable admin site)
Audit log with past webhook events
Protection from replay attacks