Edmingle Webhooks Guide: Automation, Events and Monitoring
A webhook tells your own systems what just happened in Edmingle, the moment it happens. When a learner enrols, completes a course, or submits a test, Edmingle sends a JSON message to a URL you own, so your CRM, ERP, or automation tool can act on it without anyone exporting a report.
This article covers setting one up, the events you can listen for, the shape of the payload, and how to monitor deliveries.
Before you start
| Requirement | Detail |
|---|---|
| Plan | Webhooks start from the Prime plan. Your plan also sets how many webhooks you can create |
| Access | Integrations management permission. Admins have it by default |
| An endpoint | A URL on your side that accepts a POST and answers quickly |
Webhooks are set up per organization, not per branch or per course. A webhook fires for the whole account, so if you only care about one course or one branch, filter on the fields in the payload at your end.
Where to find webhooks
Go to Settings → Apps, open the Automation and Webhooks tab, and click Manage on the Webhooks card.
The first time you open it you will see an introduction screen with a Create New Webhook button. After that you get the list of your webhooks.
What your endpoint has to do
Build and test your endpoint before you create the webhook in Edmingle, because you cannot save a webhook until its URL has been validated.
Your endpoint must:
Be reachable over HTTPS. The form rejects anything that does not start with
https://.Accept a POST with
Content-Type: application/json.Respond with 200, 201, or 204.
Respond with a JSON body, even an empty object like
{}. A 200 with an empty or non-JSON body fails validation.Respond quickly. Acknowledge first, process afterwards. Do not do slow work before replying.
The validation ping
When you click Validate Webhook, Edmingle posts a test message to your URL that looks like this:
{
"event": {
"event_name": "url.validate",
"livemode": false,
"event_ts": "2026-10-13T11:42:07+05:30"
}
}
livemode is false on the validation ping and true on every real event. If your endpoint writes to a production system, use that flag to ignore test traffic.
Create a webhook
On the Webhooks list, click New Webhook.
Fill in Webhook Basic Details:
| Field | Required | Notes |
|---|---|---|
| Webhook name | Yes | Up to 50 characters |
| Description | No | Up to 150 characters. Worth filling in: it is the only hint you get on the list about what a webhook does |
| Webhook URL | Yes | Must start with https:// |
Click Validate Webhook. You will see Webhook validated or Webhook validation failed. Use View Payload next to the result to see the status code and exactly what your endpoint returned.
In the Events section, pick the events you want. They are grouped into categories down the left side. Use View Payload on any event to see a sample of what it sends.
Click Create Webhook. You will see "Webhook created successfully!"
You cannot save without validating first, and any edit to the URL clears the validation. If you change a single character you have to click Validate Webhook again before the form will submit.
At least one event is required. Saving with none selected gives "Please choose atleast one event".
The events you can subscribe to
The list you see is grouped by category. These are the events available:
User
| Event | Fires when |
|---|---|
| User created | Any new user is created: self signup, added by an admin, or a bulk upload |
| User updated | A learner or staff profile is edited, by an admin or by the learner |
Transactions
| Event | Fires when |
|---|---|
| Purchase Initiated | An enrolment is created but payment has not cleared yet |
| Purchase Completed | Payment clears, or a free or offline enrolment is recorded. Also fires on a successful instalment payment |
| Purchase Failed | A payment or instalment is marked as not cleared |
Course
| Event | Fires when |
|---|---|
| User Course Completed | A learner's progress in a batch reaches 100%, counting materials viewed plus assessments passed |
Assessments
| Event | Fires when |
|---|---|
| Exercise Submitted | A learner submits an exercise or assignment |
| Exercise Evaluated | An exercise or assignment is evaluated and finalized |
| Test Submitted | A learner submits a quiz or test |
| Test Evaluated | A quiz or test is marked final |
Announcements
| Event | Fires when |
|---|---|
| Announcement Created | An announcement is published |
Sessions
| Event | Fires when |
|---|---|
| Session Created | A session is scheduled |
| Session Updated | A session is rescheduled or edited |
| Session Cancelled | A session is cancelled. The payload carries the cancellation reason |
| Session Reminder | A reminder goes out. The payload says whether it was a manual reminder, the 1 hour reminder, or the 24 hour one |
| Session Start | A live class actually starts |
The exact list in your account is whatever the Events section shows. If an event you expect is missing, raise a ticket rather than assuming it fires silently.
Some things do not have an event today, including certificate issued, attendance marked, lead or enquiry created, refund processed, and course published.
What a payload looks like
Every event uses the same envelope:
{
"event": {
"event": "transaction.user_purchase_completed",
"livemode": true,
"event_ts": "2026-10-13T11:42:07+05:30"
},
"payload": {
"user_id": 904113,
"role": "student",
"name": "Priya Nair",
"email": "priya@example.com",
"contact_number": "9876543210",
"course_name": "Full Stack Development",
"bundle_id": 5521,
"master_batch_id": 88102,
"master_batch_name": "FSD Nov 2026",
"original_price": 45000,
"discount": 5000,
"final_price": 40000,
"currency": "₹",
"enrollment_id": 773210,
"enrollment_date": 1760000000
}
}
event.eventidentifies the event, in the formcategory.event, for exampleuser.user_createdorcourse.user_course_completed.event.livemodeistruefor real events.event.event_tsis an ISO 8601 timestamp with the server's offset.payloadis the event-specific body.
[!Important] The envelope does not carry your organization ID or a unique event ID. Identify records using the IDs inside
payload, and build your handler to tolerate the same event arriving more than once.
currency is the symbol, such as ₹, not an ISO code like INR. Dates such as enrollment_date are Unix timestamps.
Payload fields vary by event, and the User updated and Announcement Created payloads are large, returning the full profile or announcement object. Always use View Payload on the event itself to see the current structure rather than coding against the sample above.
Security
Edmingle does not sign webhook payloads. There is no signature header, no shared secret, and no custom headers. The only header sent is Content-Type: application/json. Anyone who knows your endpoint URL can post anything to it.
Because of that, treat the URL itself as a credential:
Use a long, unguessable path, for example
https://api.yourcompany.com/hooks/edmingle/8f3c1a0e9b6d4f27.Do not share the URL, put it in a ticket, or commit it to a repository.
Treat the payload as a notification, not a source of truth. Use the IDs to call back into Edmingle or your own system and confirm before you act on anything financial.
If your infrastructure allows it, restrict the endpoint by source IP.
Managing your webhooks
The list shows:
| Column | What it shows |
|---|---|
| Webhook name | |
| Description | |
| Events linked | The events it is subscribed to |
| Event count | How many times it has been triggered, all time. Sortable |
| Webhook status | Active or Inactive |
Open the actions menu on a row for:
View Logs
Edit Webhook
Mark as Inactive on an active webhook. This takes effect immediately, with no confirmation step.
Make Active on an inactive one. This opens the edit screen, where you re-validate the URL and save.
There is no delete. Marking a webhook inactive is how you stop it. Inactive webhooks still count toward your plan's webhook limit.
Monitoring deliveries
Click View Logs on a webhook to see what has been sent.
| Column | What it shows |
|---|---|
| Timestamp | When the delivery was attempted |
| Status | The HTTP status code your endpoint returned |
| Event | Which event it was |
| Endpoint | The URL it went to |
| Payload | Opens a drawer with both the request Edmingle sent and the response you returned |
Logs cover the last 30 days and show the latest 100 deliveries. Anything older is not available in the product, so keep your own logs if you need a longer trail.
The payload drawer is the main debugging tool: it shows your response body next to the request, so a 500 from your service is visible here along with whatever error it printed.
When deliveries fail
A delivery counts as failed when your endpoint returns anything other than 200, 201, or 204.
[!Important] After 5 consecutive failures the webhook is disabled automatically. Edmingle emails your support and admin addresses with the subject "Webhook Subscription disabled". You also get an earlier warning email, "Webhook Subscription failing", before it reaches the limit.
To bring it back:
Fix the endpoint.
Open the webhook from the list.
Click Validate Webhook and confirm it passes.
Save.
A disabled webhook will not reactivate until the URL validates successfully, and events that fired while it was down are not replayed.
Watch for those warning emails. They go to the support and admin email addresses on your organization profile, so make sure those are addresses somebody actually reads.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| "Please enter a URL starting with https://" | The URL is http:// or missing the scheme |
| "Webhook validation failed" | Your endpoint returned something other than 200, 201, or 204. Use View Payload to see the code |
| "Webhook validation failed due to Non-JSON response" | The status code was fine but the body was not JSON. Return {} |
| "Please validate the webhook" when saving | You edited the URL after validating. Validate again |
| Webhook went Inactive on its own | Five consecutive failed deliveries. Check your logs, fix, re-validate |
| Events firing that you do not want | Subscriptions are organization-wide. Filter on the payload at your end |
| Cannot create another webhook | You have hit your plan's webhook limit. Inactive ones still count. Raise a ticket to increase it |