> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 360Learning Webhook Setup Guide

> Configure 360Learning to deliver events to StackOne.

## Prerequisites

The connector should already be set up, with a Connector Profile and a Linked Account. See [Getting Started](/connectors/360learning#getting-started) on the 360Learning connector page.

<section data-guide-section data-guide-scopes="">
  <h2>How StackOne sets up 360Learning webhooks</h2>

  <p>Nothing needs configuring in 360Learning. When you connect an account with events enabled, StackOne creates the webhook subscriptions automatically and deletes them again when the connection is removed.</p>

  <Steps>
    <Step title="Grant the webhook scope">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Creating a subscription requires the <strong>webhooks:write</strong> scope. Without it the connection is established but no subscriptions are created, so no events are ever delivered.</p>

        <ul>
          <li>Authorize the connection with <strong>webhooks:write</strong> granted alongside the read scopes the connector already uses.</li>
        </ul>
      </div>
    </Step>

    <Step title="Check how many subscription slots are free">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>360Learning allows fifty webhook subscriptions per account, counted across every integration. Because it accepts one event type per subscription, StackOne creates one for each event you enable — enabling all thirty-eight leaves twelve slots for everything else.</p>

        <ul>
          <li>Enable only the events you need if the account is already close to the limit.</li>
          <li>Two StackOne connections to the same 360Learning account cannot both enable every event, because that would need seventy-six slots.</li>
          <li>At the limit 360Learning answers a new subscription with a server error rather than a message about the limit, so an account that silently stops gaining subscriptions is usually full.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review the subscriptions if you need to confirm them">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Each subscription StackOne creates is named <strong>StackOne</strong> and carries a single event type. Leave them alone — StackOne manages their whole lifecycle and removes them when the connection is deleted.</p>

        <ul>
          <li>360Learning signs each delivery with webhook-signature, webhook-id and webhook-timestamp headers. StackOne authenticates deliveries by the unguessable callback URL instead, so no signing secret is configured.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Available webhook events</h2>

  <p>360Learning emits thirty-eight event types across users, learning content and classroom sessions. Only events selected in StackOne are subscribed — 360Learning sends nothing for events that are not.</p>

  <Steps>
    <Step title="Enable user events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering user accounts on the platform.</p>

        <ul>
          <li><strong>User Created</strong> (`user.created`) — Fired when a user is created as active.</li>
          <li><strong>User Invited</strong> (`user.invited`) — Fired when a user is invited to the platform.</li>
          <li><strong>User Activated</strong> (`user.activated`) — Fired when a user is activated for the first time.</li>
          <li><strong>User Reactivated</strong> (`user.reactivated`) — Fired when a previously deactivated user is reactivated.</li>
          <li><strong>User Updated</strong> (`user.updated`) — Fired when a user's profile details change.</li>
          <li><strong>User Deleted</strong> (`user.deleted`) — Fired when a user is soft deleted.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable user custom field events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering the custom fields defined on users and the values held against them.</p>

        <ul>
          <li><strong>User Custom Field Created</strong> (`user.customfield.created`) — Fired when a user custom field is created.</li>
          <li><strong>User Custom Field Updated</strong> (`user.customfield.updated`) — Fired when a user custom field is renamed.</li>
          <li><strong>User Custom Field Deleted</strong> (`user.customfield.deleted`) — Fired when a user custom field is deleted.</li>
          <li><strong>User Custom Field Values Updated</strong> (`user.customfield.values.updated`) — Fired when custom field values change. One event can cover several users.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable learning progress events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events raised by learners working through content, rather than by administrative changes.</p>

        <ul>
          <li><strong>Course Attempt Closed</strong> (`course.attempt.closed`) — Fired when a learner finishes an attempt at a course.</li>
          <li><strong>User Assessment Corrected</strong> (`user.assessment.corrected`) — Fired when an assessment is corrected. The payload reports whether the learner passed.</li>
          <li><strong>User Certificate Awarded</strong> (`user.certificate.awarded`) — Fired when a certificate is awarded to a learner.</li>
          <li><strong>Path Session User Status Updated</strong> (`path.session.user.status.updated`) — Fired on each change to a learner's status in a path session, and once when they are first enrolled.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable group events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering groups and the content in their libraries.</p>

        <ul>
          <li><strong>Group Created</strong> (`group.created`) — Fired when a group is created.</li>
          <li><strong>Group Updated</strong> (`group.updated`) — Fired when a group's details change.</li>
          <li><strong>Group Deleted</strong> (`group.deleted`) — Fired when a group is deleted.</li>
          <li><strong>Groups Library Courses Added</strong> (`groups.library.courses.added`) — Fired when courses are added to a group's library. One event can cover several groups and several courses.</li>
          <li><strong>Groups Library Paths Added</strong> (`groups.library.paths.added`) — Fired when learning paths are added to a group's library. One event can cover several groups and several paths.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable path events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering learning paths.</p>

        <ul>
          <li><strong>Path Created</strong> (`path.created`) — Fired when a path is created.</li>
          <li><strong>Path Updated</strong> (`path.updated`) — Fired when a path is updated.</li>
          <li><strong>Path Archived</strong> (`path.archived`) — Fired when a path is archived.</li>
          <li><strong>Path Deleted</strong> (`path.deleted`) — Fired when a path is deleted.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable path session events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering the sessions attached to a path and the learners enrolled in them.</p>

        <ul>
          <li><strong>Path Session Added</strong> (`path.session.added`) — Fired when a session is added to a path.</li>
          <li><strong>Path Session Removed</strong> (`path.session.removed`) — Fired when a session is removed from a path.</li>
          <li><strong>Path Session Users Enrolled</strong> (`path.session.users.enrolled`) — Fired when learners are enrolled in a path session.</li>
          <li><strong>Path Session Users Unenrolled</strong> (`path.session.users.unenrolled`) — Fired when learners are unenrolled from a path session.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable classroom slot events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering scheduled classroom slots, their attendees and their waitlists.</p>

        <ul>
          <li><strong>User Classroom Slot Registered</strong> (`user.classroom.slot.registered`) — Fired when a learner registers or is registered for a slot.</li>
          <li><strong>User Classroom Slot Unregistered</strong> (`user.classroom.slot.unregistered`) — Fired when a learner unregisters or is removed from a slot.</li>
          <li><strong>User Classroom Slot RSVP Going Yes</strong> (`user.classroom.slot.rsvp.going.yes`) — Fired when a learner answers yes to a slot invitation.</li>
          <li><strong>User Classroom Slot RSVP Going No</strong> (`user.classroom.slot.rsvp.going.no`) — Fired when a learner answers no to a slot invitation.</li>
          <li><strong>Path Session Classroom Slot Users Unregistered Full</strong> (`path.session.classroom.slot.users.unregistered.full`) — Fired when learners leave a slot that was full.</li>
          <li><strong>Path Session Classroom Slot Waitlist Opened</strong> (`path.session.classroom.slot.waitlist.opened`) — Fired when a waitlist is added to a slot.</li>
          <li><strong>Path Session Classroom Slot Waitlist Closed</strong> (`path.session.classroom.slot.waitlist.closed`) — Fired when a slot's waitlist is closed.</li>
          <li><strong>Path Session Classroom Slot Waitlist User Joined</strong> (`path.session.classroom.slot.waitlist.user.joined`) — Fired when a learner joins a slot's waitlist.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable bulk operation events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events covering bulk operations started through the 360Learning API. An import run from the dashboard raises them only if it uses that same API.</p>

        <ul>
          <li><strong>Bulk Operation Created</strong> (`bulk.operation.created`) — Fired when a bulk operation is created through the API.</li>
          <li><strong>Bulk Operation Ended</strong> (`bulk.operation.ended`) — Fired when a bulk operation finishes.</li>
        </ul>
      </div>
    </Step>

    <Step title="Enable the xAPI event">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>An xAPI statement rather than the envelope the other events use, so it carries the learner, the verb and the course activity instead of a type and a data object.</p>

        <ul>
          <li><strong>xAPI Started</strong> (`xapi.started`) — Fired when a learner starts a course. The record reported is the course activity.</li>
        </ul>
      </div>
    </Step>

    <Step title="Retrieve the record to see what changed">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>A notification identifies what changed rather than carrying the whole record. Each event reports the identifier its payload holds — the user, group, path, session or classroom slot the change concerns — so read that record back when you need its current contents.</p>

        <ul>
          <li>Treat each notification as a signal to re-read the record rather than as a change log.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

## Verify

Your Connector should now be able to receive and process events. Try triggering an event and you should see an Event appear in the Connector logs.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.