> ## 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.

# Docebo Webhook Setup Guide

> Configure Docebo to deliver events to StackOne.

## Prerequisites

Before continuing, you should have already completed the following for this connector:

<Steps>
  <Step title="Configure the Connector">
    Enable the connector and set up its connector profile in your project. See <a href="/connect/managing-connectors/overview">Managing Connectors</a>.

    <Columns cols={2}>
      <Card title="Connector Profile" href="/connectors/docebo/guides/connector-profile/oauth-2-0-password-grant" icon="https://stackone-logos.com/api/docebo/filled/png" horizontal>
        Docebo - OAuth 2.0 (Password Grant)
      </Card>
    </Columns>
  </Step>

  <Step title="Link an Account">
    Connect an account using <a href="/embed/account-linking/overview">StackOne Hub</a> or <a href="/embed/account-linking/auth-link">Auth Link</a>.

    <Columns cols={2}>
      <Card title="Link Account" href="/connectors/docebo/guides/link-account/oauth-2-0-password-grant" icon="https://stackone-logos.com/api/docebo/filled/png" horizontal>
        Docebo - OAuth 2.0 (Password Grant)
      </Card>
    </Columns>
  </Step>
</Steps>

<section data-guide-section data-guide-scopes="">
  <h2>Copy your Native Webhook URL</h2>

  <p>Before configuring Docebo, copy the <strong>Native Webhook URL</strong> shown on this connection in StackOne. This is the address Docebo will POST every event to. You will paste it as the <strong>Payload URL</strong> when you create the webhook in the next steps. Keep it handy — the same URL is reused for every webhook you create.</p>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Open the Webhooks app in Docebo</h2>

  <p>Sign in and navigate to the Webhooks management page.</p>

  <Steps>
    <Step title="Sign in to Docebo as a Superadmin">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to your <a href="https://www.docebo.com" target="_blank" rel="noopener noreferrer">Docebo platform</a> (for example `https://your-company.docebosaas.com`) with a <strong>Superadmin</strong> account.</p>
      </div>
    </Step>

    <Step title="Open the Webhooks app">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>From the top menu, open <strong>Add-ons and integrations</strong>, then select <strong>Webhooks</strong> from the left-hand menu. The Webhooks page lists any existing webhooks and their delivery status.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-webhooks-page.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=c5f1c80107fd464de9b3c6188f4ce7e6" alt="The Add-ons and integrations menu with Webhooks selected, showing the webhooks list and the Add webhooks button." width="1280" height="800" data-path="connectors/docebo/images/events-webhooks-page.png" />
      </div>
    </Step>

    <Step title="Open the create-webhook wizard">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Add webhooks</strong> in the top-right corner to open the <strong>Create a new webhook</strong> wizard.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-webhooks-page.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=c5f1c80107fd464de9b3c6188f4ce7e6" alt="The Webhooks page with the Add webhooks button in the top-right corner." width="1280" height="800" data-path="connectors/docebo/images/events-webhooks-page.png" />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Configure the webhook</h2>

  <p>Complete the <strong>Configuration</strong> step of the wizard. The webhook <strong>Type</strong> is fixed to <strong>HTTP</strong>.</p>

  <Steps>
    <Step title="Enter a name">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Name</strong> field, enter a recognizable name such as `StackOne Integration`.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-configuration.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=0e101f7ced4751834a696694c90292f2" alt="The Configuration step of the Create a new webhook wizard with the Name and Payload URL fields." width="1280" height="800" data-path="connectors/docebo/images/events-configuration.png" />
      </div>
    </Step>

    <Step title="Paste the Native Webhook URL">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Payload URL</strong> field under <strong>Destination</strong>, paste the <strong>Native Webhook URL</strong> you copied from StackOne.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-configuration.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=0e101f7ced4751834a696694c90292f2" alt="The Payload URL field with the StackOne Native Webhook URL pasted in." width="1280" height="800" data-path="connectors/docebo/images/events-configuration.png" />
      </div>
    </Step>

    <Step title="Enable payload grouping (optional)">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Under <strong>Payload collection</strong>, you may enable <strong>Allow the platform to group payloads</strong>. When enabled, Docebo batches multiple events of the same type — fired by the same process — into a single delivery. StackOne handles both single and batched deliveries, so this is safe to leave on or off.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-configuration.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=0e101f7ced4751834a696694c90292f2" alt="The Payload collection section with the Allow the platform to group payloads checkbox." width="1280" height="800" data-path="connectors/docebo/images/events-configuration.png" />
      </div>
    </Step>

    <Step title="Open the Events step">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Next</strong> to move to the <strong>Events</strong> step.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Select the events to send</h2>

  <p>On the <strong>Events</strong> step, choose which events this webhook delivers.</p>

  <Steps>
    <Step title="Pick your events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Use the <strong>Search</strong> box or scroll the <strong>Area / Event</strong> table and tick the events you want StackOne to receive. See <strong>Available webhook events</strong> below for the full list of events this connector understands.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-select-events.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=c4271fec91276778a4929435a5d3b114" alt="The Events step showing the Area and Event table with checkboxes and a search box." width="1280" height="800" data-path="connectors/docebo/images/events-select-events.png" />
      </div>
    </Step>

    <Step title="Add more webhooks to exceed 8 events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Docebo allows a <strong>maximum of 8 events per webhook</strong>. To receive more than 8 events, create <strong>additional webhooks</strong> that reuse the <strong>same</strong> Native Webhook URL — StackOne routes every delivery correctly regardless of which webhook sent it.</p>
      </div>
    </Step>

    <Step title="Create the webhook">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Create</strong>. The new webhook appears in the list with a <strong>Deactivated</strong> status — you will activate it next.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-webhook-created.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=b49106d8d19697735305c64d0b1ffc8a" alt="The webhooks list showing the newly created webhook with a Deactivated status." width="1280" height="800" data-path="connectors/docebo/images/events-webhook-created.png" />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Activate the webhook</h2>

  <p>New webhooks are created <strong>Deactivated</strong> and must be turned on before Docebo will deliver any events.</p>

  <Steps>
    <Step title="Turn on the webhook">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>On the webhook's row, open the <strong>Actions</strong> menu (<strong>...</strong>) and choose <strong>Activate</strong>. The status changes to active and Docebo begins delivering the selected events to your Native Webhook URL.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-activate.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=2bcb13d4fe16e1fad408b65c5f78ada5" alt="The Actions menu for a webhook showing Edit, Activate, Copy destination and Delete options." width="1280" height="800" data-path="connectors/docebo/images/events-activate.png" />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Secure the endpoint with Basic Auth (recommended)</h2>

  <p>Docebo does not sign webhook payloads with an HMAC signature. The available integrity control is <strong>HTTP Basic Auth</strong> on the endpoint, which Docebo strongly recommends enabling.</p>

  <Steps>
    <Step title="Open Endpoint info">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>On the webhook's <strong>Actions</strong> menu choose <strong>Edit</strong>, then open the <strong>Endpoint info</strong> tab.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-basic-auth.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=61e917ae35d61e84d8428c9e4ef03c32" alt="The Edit webhook Endpoint info tab with the Destination and Authentication sections." width="1280" height="800" data-path="connectors/docebo/images/events-basic-auth.png" />
      </div>
    </Step>

    <Step title="Enable Basic Auth (optional)">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Optionally, under <strong>Authentication</strong>, tick <strong>Enable basic auth</strong> and enter a <strong>Username</strong> and <strong>Password</strong> of your choosing, then click <strong>Save changes</strong>. The StackOne endpoint is already secured by the token embedded in the delivery URL, so this step is not required.</p>

        <img src="https://mintcdn.com/stackone-60/WlFiz93cLsvdccQQ/connectors/docebo/images/events-basic-auth.png?fit=max&auto=format&n=WlFiz93cLsvdccQQ&q=85&s=61e917ae35d61e84d8428c9e4ef03c32" alt="The Authentication section with Enable basic auth checked and the Username field visible." width="1280" height="800" data-path="connectors/docebo/images/events-basic-auth.png" />
      </div>
    </Step>

    <Step title="Set a grace period when rotating credentials">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>If you later rotate the password, allow the previous password to remain valid for a short period — in-flight retries keep authenticating with the old password until Docebo's retry queue drains.</p>
      </div>
    </Step>
  </Steps>
</section>

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

  <p>This connector understands the following Docebo events. Only the events you tick in the webhook configuration are delivered — select the ones your integration needs (remembering the 8-events-per-webhook limit). Each event is shown with its Docebo event code.</p>

  <Steps>
    <Step title="Review content & course events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Content events (23).</p>

        <ul>
          <li><strong>Asset Created</strong> (`contribute.created`) — Fired when an asset is uploaded to the Central Repository.</li>
          <li><strong>Asset Updated</strong> (`contribute.updated`) — Fired when an asset is modified.</li>
          <li><strong>Asset Unpublished</strong> (`contribute.unpublished`) — Fired when publication of an asset is revoked.</li>
          <li><strong>Asset Deleted</strong> (`contribute.deleted`) — Fired when an asset is removed.</li>
          <li><strong>Asset Watch Invitation Deleted</strong> (`contribute.watchinvitation.deleted`) — Fired when an asset watch invitation is removed.</li>
          <li><strong>Training Material Added To Course</strong> (`tmrepo.course.trainingmaterial.added`) — Fired when a Central Repository material is assigned to a course.</li>
          <li><strong>Training Material Removed From Course</strong> (`tmrepo.course.trainingmaterial.removed`) — Fired when a Central Repository material is removed from a course.</li>
          <li><strong>Repository Training Material Updated</strong> (`tmrepo.trainingmaterial.updated`) — Fired when a Central Repository material is updated.</li>
          <li><strong>Course Created</strong> (`course.created`) — Fired when a course is created.</li>
          <li><strong>Course Updated</strong> (`course.updated`) — Fired when course properties are modified.</li>
          <li><strong>Course Deleted</strong> (`course.deleted`) — Fired when a course is removed.</li>
          <li><strong>Content Marked Outdated</strong> (`content.markedoutdated`) — Fired when course content is marked as outdated.</li>
          <li><strong>Course Rating Updated</strong> (`course.rating.updated`) — Fired when a course rating is submitted or changed.</li>
          <li><strong>Course Training Material Created</strong> (`course.trainingmaterial.created`) — Fired when training material is created within a course.</li>
          <li><strong>Course Training Material Updated</strong> (`course.trainingmaterial.updated`) — Fired when training material within a course is modified.</li>
          <li><strong>Course Training Material Deleted</strong> (`course.trainingmaterial.deleted`) — Fired when training material within a course is removed.</li>
          <li><strong>Assignment Submitted</strong> (`lo.assignment.submission`) — Fired when a learner submits an assignment.</li>
          <li><strong>Assignment Submission Reset</strong> (`lo.assignment.submission.reset`) — Fired when an assignment submission tracking is reset.</li>
          <li><strong>Assignment Evaluated</strong> (`lo.assignment.evaluation`) — Fired when an assignment submission is graded.</li>
          <li><strong>Training Material Play Status Updated</strong> (`trainingmaterial.playstatus.updated`) — Fired when the play/completion status of a training material changes.</li>
          <li><strong>Course Additional Field Deleted</strong> (`courseadditionalfield.deleted`) — Fired when a custom course additional field is removed.</li>
          <li><strong>Catalog Course Deleted</strong> (`catalog.course.deleted`) — Fired when a course is removed from a catalog.</li>
          <li><strong>Catalog Learning Plan Deleted</strong> (`catalog.learningplan.deleted`) — Fired when a learning plan is removed from a catalog.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review enrollment, session & learning-plan events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Enrollments events (25).</p>

        <ul>
          <li><strong>Course Enrollment Created</strong> (`course.enrollment.created`) — Fired when a user is enrolled in a course.</li>
          <li><strong>Course Enrollment Updated</strong> (`course.enrollment.updated`) — Fired when a course enrollment status changes.</li>
          <li><strong>Course Enrollment Completed</strong> (`course.enrollment.completed`) — Fired when a user completes a course.</li>
          <li><strong>Course Enrollment Deleted</strong> (`course.enrollment.deleted`) — Fired when a user is unenrolled from a course.</li>
          <li><strong>Course Enrollment Updated By Admin</strong> (`course.enrollment.updatedbyadmin`) — Fired when an admin modifies a course enrollment.</li>
          <li><strong>ILT Session Enrollment Created</strong> (`ilt.session.enrollment.created`) — Fired when a user is enrolled in an ILT session.</li>
          <li><strong>ILT Session Enrollment Updated</strong> (`ilt.session.enrollment.updated`) — Fired when an ILT session enrollment changes.</li>
          <li><strong>ILT Session Enrollment Deleted</strong> (`ilt.session.enrollment.deleted`) — Fired when a user is unenrolled from an ILT session.</li>
          <li><strong>ILT Session Created</strong> (`ilt.session.created`) — Fired when an ILT session is created.</li>
          <li><strong>ILT Session Updated</strong> (`ilt.session.updated`) — Fired when an ILT session is modified.</li>
          <li><strong>ILT Session Deleted</strong> (`ilt.session.deleted`) — Fired when an ILT session is removed.</li>
          <li><strong>ILT Event Created</strong> (`ilt.event.created`) — Fired when an ILT event date is created.</li>
          <li><strong>ILT Event Updated</strong> (`ilt.event.updated`) — Fired when an ILT event date is modified.</li>
          <li><strong>ILT Event Deleted</strong> (`ilt.event.deleted`) — Fired when an ILT event date is removed.</li>
          <li><strong>ILT External Calendar Session Changed</strong> (`ilt.extcalendar.session.changed`) — Fired when an ILT session synced to an external calendar changes.</li>
          <li><strong>ILT External Calendar Event Changed</strong> (`ilt.extcalendar.event.changed`) — Fired when an ILT event synced to an external calendar changes.</li>
          <li><strong>Learning Plan Created</strong> (`learningplan.created`) — Fired when a learning plan is created.</li>
          <li><strong>Learning Plan Updated</strong> (`learningplan.updated`) — Fired when a learning plan is modified.</li>
          <li><strong>Learning Plan Deleted</strong> (`learningplan.deleted`) — Fired when a learning plan is removed.</li>
          <li><strong>Learning Plan Course Added</strong> (`learningplan.course.added`) — Fired when a course is added to a learning plan.</li>
          <li><strong>Learning Plan Course Removed</strong> (`learningplan.course.removed`) — Fired when a course is removed from a learning plan.</li>
          <li><strong>Learning Plan Enrollment Created</strong> (`learningplan.enrollment.created`) — Fired when a user is enrolled in a learning plan.</li>
          <li><strong>Learning Plan Enrollment Updated</strong> (`learningplan.enrollment.updated`) — Fired when a learning plan enrollment changes.</li>
          <li><strong>Learning Plan Enrollment Deleted</strong> (`learningplan.enrollment.deleted`) — Fired when a user is unenrolled from a learning plan.</li>
          <li><strong>Learning Plan Enrollment Completed</strong> (`learningplan.enrollment.completed`) — Fired when a user completes a learning plan.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review people, branch & channel events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>People events (14).</p>

        <ul>
          <li><strong>Branch Created</strong> (`branch.created`) — Fired when a branch is created.</li>
          <li><strong>Branch Updated</strong> (`branch.updated`) — Fired when a branch is modified.</li>
          <li><strong>Branch Deleted</strong> (`branch.deleted`) — Fired when a branch is removed.</li>
          <li><strong>Branch User Added</strong> (`branch.user.added`) — Fired when a user is assigned to a branch.</li>
          <li><strong>Branch User Removed</strong> (`branch.user.removed`) — Fired when a user is removed from a branch.</li>
          <li><strong>Group User Added</strong> (`group.user.added`) — Fired when a user is assigned to a group.</li>
          <li><strong>Group User Removed</strong> (`group.user.removed`) — Fired when a user is removed from a group.</li>
          <li><strong>Channel Created</strong> (`channel.created`) — Fired when a channel is created.</li>
          <li><strong>Channel Updated</strong> (`channel.updated`) — Fired when a channel is modified.</li>
          <li><strong>Channel Deleted</strong> (`channel.deleted`) — Fired when a channel is removed.</li>
          <li><strong>Channel Content Assigned</strong> (`channel.content.assigned`) — Fired when content is added to a channel.</li>
          <li><strong>Channel Content Removed</strong> (`channel.content.removed`) — Fired when content is removed from a channel.</li>
          <li><strong>Channel Expert Added</strong> (`channel.expert.added`) — Fired when an expert is assigned to a channel.</li>
          <li><strong>Channel Expert Removed</strong> (`channel.expert.removed`) — Fired when an expert is removed from a channel.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review certification, skill & background-job events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Engagement events (13).</p>

        <ul>
          <li><strong>Certification Awarded</strong> (`certification.award.awarded`) — Fired when a certification is issued to a user.</li>
          <li><strong>Certification Award Updated</strong> (`certification.award.updated`) — Fired when a certification award is modified.</li>
          <li><strong>Certification Revoked</strong> (`certification.award.revoked`) — Fired when a certification is revoked from a user.</li>
          <li><strong>Badge Earned</strong> (`badge.earned`) — Fired when a user earns a gamification badge.</li>
          <li><strong>Skill Object Completed</strong> (`skill.object.completed`) — Fired when a user completes content mapped to a skill.</li>
          <li><strong>Observation Checklist Step Submitted</strong> (`checklist.observation.step.submitted`) — Fired when an observation checklist step is submitted.</li>
          <li><strong>Approval Checklist Step Submitted</strong> (`checklist.approval.step.submitted`) — Fired when an approval checklist step is submitted.</li>
          <li><strong>Observation Checklist Available</strong> (`checklist.observation.to.complete`) — Fired when an observation checklist becomes available to complete.</li>
          <li><strong>Background Job Created</strong> (`bj.created`) — Fired when a background job is initialized.</li>
          <li><strong>Background Job Deleted</strong> (`bj.deleted`) — Fired when a background job is removed.</li>
          <li><strong>Background Job Execution Started</strong> (`bj.execution.started`) — Fired when a background job execution starts.</li>
          <li><strong>Background Job Execution Completed</strong> (`bj.execution.completed`) — Fired when a background job execution completes successfully.</li>
          <li><strong>Background Job Execution Aborted</strong> (`bj.execution.aborted`) — Fired when a background job execution is aborted.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Understand the delivery format</h2>

  <p>A quick reference for how Docebo delivers events, so you know what to expect.</p>

  <Steps>
    <Step title="Review the envelope and event type">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Each delivery is a JSON envelope whose top-level `event` field carries the event code (for example `course.enrollment.created`). The envelope also includes `message_id` (a unique delivery id used for deduplication), `webhook_id`, and `original_domain` (your Docebo subdomain).</p>
      </div>
    </Step>

    <Step title="Review single vs. batched payloads">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The event data is delivered in a `payload` object for a single event. If you enabled payload grouping, Docebo may instead send a `payloads` array of same-type events (up to 25 per delivery). StackOne handles both shapes automatically.</p>
      </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.
