Overview
When creating a Webhook in Appical, you select a Method and at least one Trigger. The Method determines how Appical sends the request to the receiving system. The Trigger determines which event in Appical causes the request to be sent.
Example
If your HR system needs to receive an update when a new hire completes their onboarding course, you could select course.completed as the Trigger. The Method depends on what your HR system expects, which will commonly be POST.
Choosing a Method
→ Select the Method expected by the receiving system
When creating or editing a Webhook, select the required option under Method. POST is selected by default, and Appical sends the JSON body with every supported Method.
Method | When to use it |
POST | The default and most common choice. Use it when the receiving system expects Appical to send event information to it. |
GET | Use this when the receiving endpoint specifically expects a GET request. Less common for Webhooks. |
PUT | Use this when the receiving endpoint expects a request intended to fully update an existing record. |
PATCH | Use this when the receiving endpoint expects a request intended to update part of an existing record. |
DELETE | Use this when the receiving endpoint specifically expects a DELETE request. |
📌 Note: The correct Method is determined by the receiving system. If you are unsure which one to select, check with the person or team responsible for that system.
What the receiving system gets
Each request has a JSON body with the event name, a timestamp, the organisation's id and a data object. Every event includes the same user fields; course and form events add their own.
{
"event": "course.completed",
"delivered_at": "2026-06-01T09:30:00Z",
"application_id": 123,
"data": {
"user_id": 42,
"user_email": "[email protected]",
"user_first_name": "Jane",
"user_last_name": "Doe",
"user_first_day": "2026-06-01",
"user_application_id": 99,
"user_remote_id": "ext-12345",
"course_id": 7,
"course_name": "Welcome to the team"
}
}user_remote_id is the user's external id (the id from the HR system or import). It is empty if none was set.
delivered_at is when the event happened, not when the request was sent. A replay sends the original body unchanged.
user.anonymized contains the user's details as they were before anonymization, so the receiver can still match the person.
course.* events add course_id and course_name.
form.completed adds template_id, template_name, completed_at, user_template_id and an answers list. Each answer has the category, the question text and type, the answer, and when it was last changed.
→ Headers sent with every request
Header | Value |
Content-Type | application/json |
webhook-id | A unique id for the event. The same event always has the same id, also on a replay, so the receiver can ignore duplicates. Test events start with test-. |
webhook-timestamp | When the request was sent, in Unix seconds. |
webhook-signature | Only when a signing secret is set. Format v1,. See Verifying Webhook signatures in Appical for details. |
Custom headers | Whatever the admin added. A custom header with the same name as one of the headers above is overwritten. |
Choosing Triggers
→ Select when the Webhook should be sent
Under Triggers, select the events you want the receiving system to be notified about. You can select one or multiple Triggers for a Webhook. Appical supports 12 Triggers:
Trigger | When is it triggered? |
user.created | A new user account is created, by an admin, a CSV import, the API, or an integration. |
user.invited | A user is added to the organisation through an invitation. Usually sent together with user.created. |
user.invitation_accepted | The user accepts the invitation by setting a password or signs in for the first time with SSO. |
user.activated | An archived user is activated again. |
user.archived | An active user is archived. |
user.anonymized | The user's personal data is anonymized. |
user.deleted | The user is deleted from the organisation. |
user.first_day | Daily, for each active new hire who reaches their first day. |
course.assigned | A course is assigned to the user. |
course.started | The user opens a course for the first time. |
course.completed | The user completes a course. |
form.completed | The user submits a form. This is triggered again for every resubmission. |
→ Select multiple Triggers
You can select multiple Triggers for the same Webhook. For example, if another system needs to follow a new hire's onboarding journey, you could select: user.invited (when the new hire is invited), user.first_day (when they reach their first day), course.started (when they start their course), and course.completed (when they complete their course). When one of the selected events happens, Appical sends the corresponding event to the configured URL.
📌 Note: If you need different events to be sent to different systems or URLs, create separate Webhooks with the appropriate Triggers.
👉 Let us know if this article answered your question by using the buttons below. If not, get in touch with our Support Channel for more information:


