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

# Cornerstone Webhook Setup Guide

> Configure Cornerstone 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/cornerstone#getting-started) on the Cornerstone connector page.

<section data-guide-section data-guide-scopes="">
  <h2>Configure Cornerstone Edge Webhooks</h2>

  <p>Cornerstone does not expose an API for creating webhooks, so an administrator registers them once in the portal. You create an <strong>Endpoint</strong> that points at the StackOne Native Webhook URL, verify it, then create one <strong>Webhook</strong> per event category you want delivered.</p>

  <Steps>
    <Step title="Confirm your administrator permissions">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Webhook screens in Edge are permission-gated. Ask your portal administrator to confirm the following permissions are assigned to your role before you begin.</p>

        <ul>
          <li><strong>Edge Endpoints - External</strong> — create and edit the external endpoints used with Webhooks.</li>
          <li><strong>Edge Endpoints - View</strong> — view existing Edge endpoints.</li>
          <li><strong>Edge Webhooks - View</strong> — view existing Edge webhooks.</li>
          <li><strong>Edge Webhooks - Event Category - LMS - External</strong> — required for the Training events.</li>
          <li><strong>Edge Webhooks - Event Category - Employee - External</strong> — required for the Employee events.</li>
          <li><strong>Edge Webhooks - Event Category - Skills - External</strong> — required for the Skills Library, User Skills and User Ratings events.</li>
        </ul>
      </div>
    </Step>

    <Step title="Retrieve your StackOne Native Webhook URL">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The <strong>Native Webhook URL</strong> is generated once an account has been linked, and it is unique to that account. Cornerstone sends every event to this address, and StackOne uses it to match inbound events back to the right connection — so use the URL from this connection and do not share it between accounts.</p>

        <ul>
          <li>Open the linked account in StackOne.</li>
          <li>Copy the value from <strong>Native Webhook URL</strong>.</li>
        </ul>
      </div>
    </Step>

    <Step title="Create the endpoint in Cornerstone">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to your <a href="https://www.cornerstoneondemand.com" target="_blank" rel="noopener noreferrer">Cornerstone portal</a> and go to <strong>Admin</strong> > <strong>Tools</strong> > <strong>Edge</strong> > <strong>Endpoints</strong>, then select <strong>Create Endpoint</strong>.</p>

        <ul>
          <li><strong>Endpoint Name</strong> — enter a descriptive name, for example `StackOne Webhooks`.</li>
          <li><strong>Endpoint URL</strong> — paste the <strong>Native Webhook URL</strong> you copied from StackOne.</li>
          <li><strong>Content Encoding</strong> — select <strong>gzip</strong> from the dropdown.</li>
          <li>Cornerstone generates an <strong>x-api-key</strong> and a <strong>Security Token</strong> for this endpoint. They are unique per endpoint and are regenerated every time a new endpoint is created.</li>
        </ul>
      </div>
    </Step>

    <Step title="Verify the endpoint">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>An endpoint must be verified before a webhook can use it. Select <strong>Create and Verify</strong> to create and verify in one step, or select <strong>Create</strong> and then use the <strong>Verify</strong> link on the Endpoint Management page.</p>

        <ul>
          <li>Verification sends a short request to the Endpoint URL to confirm a secure connection. StackOne answers it automatically.</li>
          <li>If verification fails, re-check that the Endpoint URL matches the Native Webhook URL exactly, then select <strong>Verify</strong> again.</li>
          <li>Editing an endpoint later clears its verified state — re-verify it, and note that any webhook assigned to it stops until it is reverified.</li>
        </ul>
      </div>
    </Step>

    <Step title="Create a webhook for each event category">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Go to <strong>Admin</strong> > <strong>Tools</strong> > <strong>Edge</strong> > <strong>Webhooks</strong> and select <strong>Create Webhook</strong>. A webhook covers one event category, so repeat this step for each category you need.</p>

        <ul>
          <li><strong>Webhook Name</strong> — enter a descriptive name, for example `StackOne Training Events`.</li>
          <li><strong>Event Category</strong> — select the category. Cornerstone documents <strong>Employee</strong>, <strong>Skills Library</strong>, <strong>Training</strong>, <strong>User Ratings</strong>, <strong>User Skills</strong> and <strong>Status</strong>; portals licensed for the recruiting or ecommerce modules also show those categories. Create one webhook per category you need.</li>
          <li><strong>Events</strong> — select the events you want delivered from the list that appears. See <strong>Available webhook events</strong> below.</li>
          <li><strong>Endpoint</strong> — select the endpoint you verified in the previous step. If it is missing from the list, return to the endpoint and verify it.</li>
          <li><strong>Configure Filters</strong> (optional) — add up to four filters to include or exclude events based on fields in the payload.</li>
          <li><strong>Configure Projections</strong> (optional) — restrict which fields are sent. Keep the identifier and timestamp fields, as StackOne reads them to label each event.</li>
          <li><strong>Encryption Key</strong> — leave empty for the Training, Skills Library, User Skills, User Ratings, Recruiting and Ecommerce categories. Cornerstone requires an encryption key on any webhook that emits <strong>Employee</strong> events, and StackOne cannot read a PGP-encrypted payload, so Employee events cannot be delivered to StackOne today. See <strong>Delivery format</strong>.</li>
          <li>Select <strong>Create and Start</strong> to begin delivery immediately, or <strong>Create Only</strong> to create the webhook in a stopped state and start it later from the Status toggle on the Webhook Management page.</li>
        </ul>
      </div>
    </Step>

    <Step title="Confirm events are flowing">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>A running webhook sends a heartbeat every five minutes, so you can confirm the connection without waiting for real activity. On <strong>Admin</strong> > <strong>Tools</strong> > <strong>Edge</strong> > <strong>Webhooks</strong>, the Status toggle shows whether each webhook is running.</p>

        <ul>
          <li>On the first start, Cornerstone replays the events it has retained, so expect a backlog and higher latency until it clears.</li>
          <li>A webhook that moves to a <strong>Failed</strong> state does not restart itself — fix the cause, then restart it from the Status toggle.</li>
          <li>A webhook can only be edited while its Status toggle is set to <strong>Stopped</strong>.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

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

  <p>The events below can be enabled per category. Only the events you select in Cornerstone are delivered — unselected events are never sent.</p>

  <Steps>
    <Step title="Training events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Learner transcript activity, under the <strong>Training</strong> event category.</p>

        <ul>
          <li><strong>Training Assigned</strong> (`TrainingAssigned`) — Fired when a training is assigned to a learner and becomes actionable on their transcript</li>
          <li><strong>Training Registered</strong> (`TrainingRegistered`) — Fired when a learner registers for a training or session</li>
          <li><strong>Training Started</strong> (`TrainingStarted`) — Fired when a learner starts a training</li>
          <li><strong>Training Completed</strong> (`TrainingCompleted`) — Fired when a learner completes a training</li>
          <li><strong>Training Withdrawn</strong> (`TrainingWithdrawn`) — Fired when a learner withdraws from a training</li>
          <li><strong>Training Cancelled</strong> (`TrainingCancelled`) — Fired when a training registration or session is cancelled</li>
          <li><strong>Training Removed</strong> (`TrainingRemoved`) — Fired when a training is removed from a transcript</li>
          <li><strong>Training Restored</strong> (`TrainingRestored`) — Fired when a previously removed training is restored to a transcript</li>
          <li><strong>Training Archived</strong> (`TrainingArchived`) — Fired when a transcript item is archived</li>
          <li><strong>Training Unarchived</strong> (`TrainingUnarchived`) — Fired when an archived transcript item is returned to the active transcript</li>
          <li><strong>Training Approved</strong> (`TrainingApproved`) — Fired when a training registration request is approved</li>
          <li><strong>Training Denied</strong> (`TrainingDenied`) — Fired when a training registration request is denied</li>
          <li><strong>Training Marked Exempt</strong> (`TrainingExempt`) — Fired when a training is marked exempt for a learner</li>
          <li><strong>Training Exemption Requested</strong> (`TrainingExemptionRequested`) — Fired when a learner requests an exemption from a training</li>
          <li><strong>Training Exemption Approved</strong> (`TrainingExemptionApproved`) — Fired when a training exemption request is approved</li>
          <li><strong>Training Exemption Denied</strong> (`TrainingExemptionDenied`) — Fired when a training exemption request is denied</li>
        </ul>
      </div>
    </Step>

    <Step title="Employee events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>User record changes, under the <strong>Employee</strong> event category. Read the encryption note under <strong>Delivery format</strong> before enabling these.</p>

        <ul>
          <li><strong>Employee Creation</strong> (`EmployeeCreated`) — Fired when a new user is created in the portal, carrying the new user's core data, organisational units and custom fields</li>
          <li><strong>Employee Updated</strong> (`EmployeeUpdated`) — Fired when an existing user record changes, carrying only the changed core data, organisational unit and custom field values</li>
        </ul>
      </div>
    </Step>

    <Step title="Skills Library events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Changes to the skills library itself, under the <strong>Skills Library</strong> event category.</p>

        <ul>
          <li><strong>Skill Upserted</strong> (`SkillUpserted`) — Fired when a skill is created or updated in the skills library</li>
          <li><strong>Skill Id Sync</strong> (`SkillIdSync`) — Fired when a skill identifier mapping is synchronised</li>
          <li><strong>Skill Deleted</strong> (`SkillDeleted`) — Fired when a skill is deleted from the skills library</li>
        </ul>
      </div>
    </Step>

    <Step title="User Skills events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Skills held by individual users, under the <strong>User Skills</strong> event category.</p>

        <ul>
          <li><strong>User Skill Added</strong> (`UserSkillAdded`) — Fired when a skill is added to a user's profile</li>
          <li><strong>User Skill Removed</strong> (`UserSkillRemoved`) — Fired when a skill is removed from a user's profile</li>
        </ul>
      </div>
    </Step>

    <Step title="User Ratings events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Skill rating activity, under the <strong>User Ratings</strong> event category.</p>

        <ul>
          <li><strong>User Rating Submitted</strong> (`UserRatingSubmitted`) — Fired when a skill rating is submitted for a user, carrying the score and who rated whom</li>
          <li><strong>Rating Request Created</strong> (`RatingRequestCreated`) — Fired when a skill rating request is created</li>
        </ul>
      </div>
    </Step>

    <Step title="Recruiting events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Candidate conversation activity, under the <strong>Recruiting</strong> event category. This category only appears on portals licensed for the recruiting modules that produce these events.</p>

        <ul>
          <li><strong>Recruiting Message Sent</strong> (`SendMessage`) — Fired when a message is sent in a candidate conversation</li>
          <li><strong>Recruiting Conversation Closed</strong> (`CloseConversation`) — Fired when a candidate conversation is closed</li>
        </ul>
      </div>
    </Step>

    <Step title="Ecommerce events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Learning purchase activity, under the <strong>Ecommerce</strong> event category. This category only appears on portals licensed for ecommerce.</p>

        <ul>
          <li><strong>Pending Payment Created</strong> (`PendingPaymentCreated`) — Fired when a pending payment is created for a learning purchase</li>
          <li><strong>Pending Payment Updated</strong> (`PendingPaymentUpdated`) — Fired when a pending payment is updated</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.