Event Reference
Complete reference of the webhook events Teachfloor delivers, with the payload each one carries.
Event Structure
Every delivery is a JSON document with the same envelope. The data block is the object the event is about, in the same shape the Public API returns it.
Code
Root Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for this delivery. Stable across retries; mirrored in the Teachfloor-Idempotency-Key header, so you can deduplicate on either. |
type | string | The event type (e.g. course.join, element.completed). |
created_at | string | ISO 8601 timestamp of when the event was recorded. |
installation_id | string | Present only on deliveries to an endpoint provisioned by an extension app: the id of the installation the event belongs to. See Extension app webhooks. |
data | object | The event's object. Its object field names the shape (course, module, element, member, course_member, organization_member, activity). |
Update events
Every *.updated event (course.updated, module.updated, element.updated, member.updated) carries the full current object in data plus a data.previous_attributes object holding only the keys that changed, with the value each had before the write. Keys that did not change are not listed. The previous value of a key is its complete old value: for custom_fields that is the whole previous map, not the changed field alone.
Code
Enumerated values (status, availability, visibility, element type) are upper-case, exactly as the Public API returns them.
Available Events
| Event | Fires when | data object |
|---|---|---|
organization.join | A member joins the organization | Organization member |
member.created | A member joins the organization (same moment as organization.join) | Member |
member.updated | A member's name, avatar, email or organization-level custom fields change | Member with previous_attributes |
member.revoked | A member is removed from the organization | Member as it was just before removal |
member.login | A member logs in | Login activity |
course.created | A course is created | Course |
course.updated | A course is updated | Course with previous_attributes |
course.join | A member joins a course | Course member |
course.completed | A member completes a course | Activity with a course context |
module.created | A module is created | Module |
module.updated | A module is updated | Module with previous_attributes |
element.created | An element is created | Element |
element.updated | An element is updated | Element with previous_attributes |
element.deleted | An element is deleted | Deleted element |
element.completed | A member completes an element | Activity with an element context |
xapi.statement.created | An xAPI statement is recorded | xAPI statement |
app.installed | An organization installs your extension app | See Extension app webhooks |
app.uninstalled | An organization uninstalls your extension app | See Extension app webhooks |
Events fire for changes made from the dashboard, through the Public API, by automations and by the platform itself. A change your own integration makes through the API is reported like any other.
Organization Events
organization.join
Fires when a user becomes a member of the organization: signup, invite acceptance, SSO provisioning, or the Members API. The data block is the membership, with the member and the organization nested.
Code
Member Events
member.created
Fires at the same moment as organization.join, carrying the plain member object instead of the membership envelope. Subscribe to whichever shape suits your integration.
Code
member.updated
Fires when a member's first name, last name, avatar or email changes, or when their organization-level custom field values change, from any surface: the member's own account page, the members or team pages, the profile editor, the Public API, or a confirmed email change. Course-level custom fields are not part of this event.
Code
An email change is confirmed by the member through a signed link and applies to their account as a whole, so every organization the member belongs to receives its own member.updated.
member.revoked
Fires when a member is removed from the organization: from the members page, the team page, the Organization API revoke endpoint, an automation, or the member deleting their own account. The data block is the member object as it was just before removal, custom fields included.
Code
member.login
Fires when a member logs in. The data block is a small login activity rather than the full member.
Code
Course Events
course.created
Fires when a course is created. The data block is the Course object.
course.updated
Fires when a course is updated. The data block is the Course object with previous_attributes.
Code
course.join
Fires when a member joins a course. The data block is the course membership, with the member and the course nested, plus the member's course-level custom fields and tags.
Code
course.completed
Fires when a member completes a course. The data block is an Activity whose context is the Course object.
Code
Module Events
module.created
Fires when a module is created. The data block is the Module object.
module.updated
Fires when a module is updated. The data block is the Module object with previous_attributes; see the update events example.
Element Events
element.created
Fires when an element is created. The data block is the Element object.
element.updated
Fires when an element is updated. The data block is the Element object with previous_attributes.
Code
element.deleted
Fires when an element is deleted. Because the element no longer exists, the data block is reduced to its id and a deleted flag.
Code
element.completed
Fires when a member completes an element. The data block is an Activity whose context is the Element object. For group work the member field is replaced by a members array.
Code
The fields after timestamp (status, passed, score, completed_by, and any type-specific values) depend on the element type.
xAPI Events
xapi.statement.created
Fires once per xAPI statement the platform records. The data block is the complete statement, so you can forward it to a Learning Record Store unchanged.
Code
Extension app events
app.installed and app.uninstalled are delivered only to endpoints declared in an extension app's manifest, and always, regardless of the events the manifest subscribes to. Their payloads carry the installing organization, the installer and, when the app opts in, OAuth credentials. See Extension app webhooks.
Object Types
Member Object
Code
custom_fields holds the member's organization-level custom field values keyed by field key, and is present on the member.created, member.updated and member.revoked events. The member nested inside organization.join, course.join and the activity events carries no custom_fields of its own; organization.join and course.join carry them one level up on the membership instead.
Organization Member Object
The membership of a member in the organization, used by organization.join.
| Field | Description |
|---|---|
id | Membership id |
object | organization_member |
joined_at | When the member joined |
member | Member object without custom_fields |
organization | id, object (organization), created_at, name, domain, url |
custom_fields | The member's organization-level custom field values |
Course Object
Code
status is DRAFT or PUBLISHED; availability is CONTINUOUS or SCHEDULED (with start_date and end_date set); visibility is PUBLIC or PRIVATE. metadata is the key-value store you write through the Public API.
Course Member Object
The membership of a member in a course, used by course.join.
| Field | Description |
|---|---|
id | Course membership id |
object | course_member |
joined_at | When the member joined the course |
member | Member object without custom_fields |
course | Course object |
custom_fields | The member's course-level custom field values |
tags | The member's tags in this course, as an array of names |
Module Object
Code
Element Object
Code
type is the upper-case element type (CONTENT, VIDEO, QUIZ, FORM, SUBMISSION, and so on). properties holds the type-specific settings, with the same keys the Public API accepts when creating or updating the element.
Activity Object
A member's activity on a course or element, used by course.completed and element.completed.
| Field | Description |
|---|---|
id | Activity id |
object | activity |
timestamp | When the activity was recorded |
member | Member object without custom_fields. Replaced by members, an array, for group activities |
context | The Course or Element object the activity belongs to |
status, passed, score, completed_by | Element activities only; further keys depend on the element type |
Deleted objects
When the object an event is about no longer exists (element.deleted, or a nested course or module that was removed), it is reduced to { "id", "object", "deleted": true }.
Related Documentation
- Getting Started - Set up your first webhook
- Security - Verify webhook signatures
- Delivery & Retries - Understand reliability