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

# ADP Workforce Now Webhook Setup Guide

> Configure ADP Workforce Now 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/adpworkforcenow/guides/connector-profile/oauth-2-0" icon="https://stackone-logos.com/api/adp/filled/svg" horizontal>
        ADP Workforce Now - OAuth 2.0
      </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/adpworkforcenow/guides/link-account/oauth-2-0" icon="https://stackone-logos.com/api/adp/filled/svg" horizontal>
        ADP Workforce Now - OAuth 2.0
      </Card>
    </Columns>
  </Step>
</Steps>

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

  <p>StackOne generates a per-connection webhook URL. You will paste it into ADP as the webhook host and endpoint.</p>

  <ul>
    <li>On this connection in StackOne, copy the read-only <strong>Native Webhook URL</strong>. It contains a secure per-connection token (the `?token=` at the end) that identifies your account, so treat it like a secret.</li>
  </ul>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Open your project's events</h2>

  <p>Configure webhooks from your ADP project in ADP API Central.</p>

  <Steps>
    <Step title="Open the project's Events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to <strong>ADP API Central</strong>, open <strong>Projects</strong>, select your project, and open the <strong>APIs</strong> tab. Under the APIs, select the <strong>Events</strong> tab.</p>

        <img src="https://mintcdn.com/stackone-60/kjd_sJ9F8GsE9-Ag/connectors/adpworkforcenow/images/events-events-tab.png?fit=max&auto=format&n=kjd_sJ9F8GsE9-Ag&q=85&s=db70565ac33a2960a0a7d820b6359894" alt="ADP API Central APIs page with the Events tab, Event Notification Method and Subscribed events list" width="1280" height="800" data-path="connectors/adpworkforcenow/images/events-events-tab.png" />
      </div>
    </Step>

    <Step title="Add the events you need">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The <strong>Subscribed events</strong> list shows the event notifications your project is scoped for. If an event you want is missing, click <strong>Add Events</strong> and subscribe to it — events that are not subscribed are never delivered.</p>
      </div>
    </Step>
  </Steps>
</section>

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

  <p>Under <strong>Event Notification Method</strong>, switch delivery to Webhook and point it at your Native Webhook URL. Activating Webhook disables Polling for the project.</p>

  <Steps>
    <Step title="Select the Webhook method">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In <strong>Event Notification Method</strong>, select the <strong>Webhook</strong> tab, then click <strong>Configure webhook</strong> (or <strong>Edit webhook</strong> if one already exists).</p>

        <img src="https://mintcdn.com/stackone-60/kjd_sJ9F8GsE9-Ag/connectors/adpworkforcenow/images/events-webhook-method.png?fit=max&auto=format&n=kjd_sJ9F8GsE9-Ag&q=85&s=0ad2d9459096cd5de6564235f30efac2" alt="ADP API Central Event Notification Method with the Webhook tab selected and the Configure webhook button" width="1280" height="800" data-path="connectors/adpworkforcenow/images/events-webhook-method.png" />
      </div>
    </Step>

    <Step title="Enter the endpoint and authentication">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Configure webhook</strong> dialog, set <strong>Webhook host and endpoint</strong> to the StackOne <strong>Native Webhook URL</strong> (including its `?token=`). ADP requires an <strong>Authentication method</strong> and the credential field cannot be empty — select <strong>API Key</strong> and enter any non-empty placeholder value (for example, `stackone`). StackOne does not read this header; the `?token=` in the URL authenticates the delivery. (OAuth 2.0 and Basic Authentication are also offered but are not needed here.)</p>

        <img src="https://mintcdn.com/stackone-60/kjd_sJ9F8GsE9-Ag/connectors/adpworkforcenow/images/events-webhook-config.png?fit=max&auto=format&n=kjd_sJ9F8GsE9-Ag&q=85&s=a3e1a5d871d01aa4dffdb7eb918ae132" alt="ADP Configure webhook dialog with Webhook host and endpoint, Authentication method API Key, and API Key fields" width="1280" height="800" data-path="connectors/adpworkforcenow/images/events-webhook-config.png" />
      </div>
    </Step>

    <Step title="Test and save the webhook">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Test webhook</strong> — ADP sends a test message and StackOne returns the required 2xx acknowledgement, so it should report success. When the test passes, click <strong>Save webhook</strong>.</p>

        <img src="https://mintcdn.com/stackone-60/kjd_sJ9F8GsE9-Ag/connectors/adpworkforcenow/images/events-auth-method.png?fit=max&auto=format&n=kjd_sJ9F8GsE9-Ag&q=85&s=76dd368349a17653187a7ec071918c29" alt="ADP Authentication method dropdown showing OAuth 2.0, API Key and Basic Authentication" width="1280" height="800" data-path="connectors/adpworkforcenow/images/events-auth-method.png" />
      </div>
    </Step>
  </Steps>
</section>

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

  <p>StackOne maps each delivered event by its ADP code to a dedicated handler. Only events you have subscribed on the ADP project are delivered; a subscribed code without a handler is rejected, so keep your subscriptions aligned with the list below.</p>

  <Steps>
    <Step title="Worker lifecycle">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Hire, rehire, termination, leave and retirement events.</p>

        <ul>
          <li><strong>Worker Hire</strong> (`worker.hire`) — a worker is hired</li>
          <li><strong>Worker Rehire</strong> (`worker.rehire`) — a worker is rehired</li>
          <li><strong>Worker Terminate</strong> (`worker.terminate`) — a worker is terminated</li>
          <li><strong>Worker On Leave</strong> (`worker.on-leave`) — a worker is placed on leave</li>
          <li><strong>Worker Retire</strong> (`worker.work-assignment.retire`) — a worker's assignment is retired</li>
        </ul>
      </div>
    </Step>

    <Step title="Worker profile and identity">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Name, marital status and legal address changes.</p>

        <ul>
          <li><strong>Worker Legal Name Change</strong> (`worker.legal-name.change`) — a worker's legal name changes</li>
          <li><strong>Worker Marital Status Change</strong> (`worker.marital-status.change`) — a worker's marital status changes</li>
          <li><strong>Worker Legal Address Add</strong> (`worker.legal-address.add`) — a worker's legal address is added</li>
          <li><strong>Worker Legal Address Change</strong> (`worker.legal-address.change`) — a worker's legal address changes</li>
          <li><strong>Worker Legal Address Remove</strong> (`worker.legal-address.remove`) — a worker's legal address is removed</li>
        </ul>
      </div>
    </Step>

    <Step title="Worker contact information">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Business email and personal phone/email changes.</p>

        <ul>
          <li><strong>Worker Business Email Add / Change / Remove</strong> (`worker.business-communication.email.add` / `.change` / `.remove`) — a worker's business email is added, changed or removed</li>
          <li><strong>Worker Personal Landline Add / Change / Remove</strong> (`worker.personal-communication.landline.add` / `.change` / `.remove`) — a worker's personal landline is added, changed or removed</li>
          <li><strong>Worker Personal Mobile Add / Change / Remove</strong> (`worker.personal-communication.mobile.add` / `.change` / `.remove`) — a worker's personal mobile is added, changed or removed</li>
          <li><strong>Worker Personal Email Change</strong> (`worker.personal-communication.email.change`) — a worker's personal email changes</li>
        </ul>
      </div>
    </Step>

    <Step title="Work assignment, pay and organization">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Assignment, base pay, organizational unit and manager changes.</p>

        <ul>
          <li><strong>Worker Work Assignment Modify</strong> (`worker.work-assignment.modify`) — a worker's work assignment is modified</li>
          <li><strong>Worker Base Remuneration Change</strong> (`worker.work-assignment.base-remuneration.change`) — a worker's base pay changes</li>
          <li><strong>Worker Organizational Unit Change</strong> (`worker.work-assignment.home-organizational-units.modify`) — a worker's home organizational unit (department) changes</li>
          <li><strong>Worker Manager Change</strong> (`worker.reports-to.modify`) — a worker's reports-to (manager) changes</li>
        </ul>
      </div>
    </Step>

    <Step title="Dependents">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Dependent record changes.</p>

        <ul>
          <li><strong>Dependent Add</strong> (`dependent.add`) — a dependent is added</li>
          <li><strong>Dependent Change</strong> (`dependent.change`) — a dependent is changed</li>
          <li><strong>Dependent Remove</strong> (`dependent.remove`) — a dependent is removed</li>
        </ul>
      </div>
    </Step>

    <Step title="Time off">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Time-off request and balance events.</p>

        <ul>
          <li><strong>Time Off Request Review</strong> (`time-off-request.review`) — a time-off request is reviewed</li>
          <li><strong>Time Off Balances Modify</strong> (`time-off-balances.modify`) — a worker's time-off balances change</li>
        </ul>
      </div>
    </Step>

    <Step title="Payroll">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Payroll job status events.</p>

        <ul>
          <li><strong>Payroll Job Status Change</strong> (`payroll-job-status.change`)</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Delivery format</h2>

  <p>ADP wraps each webhook delivery in a `meta` block (orgID, messageId, messageSentTime, webhookAuditTrailID, …) around a `message.events` array; each event carries an `eventID`, `eventNameCode.codeValue` (the ADP event code, e.g. `worker.legal-address.change`), `recordDateTime` and a `data` object with the worker's `associateOID`. StackOne emits that code as the event type, the `eventID` as the record id, and passes the full body through as the event data — treat notifications as a trigger and re-fetch the record via the API for authoritative data. ADP signs every delivery with an `adpx-messageauthentication` header (HMAC-SHA256 of your data-connector Client ID keyed by your Client Secret) and requires a 2xx acknowledgement; StackOne returns one automatically, and any delivery that is not acknowledged is retried (10 times at one-minute intervals, then 10 times every six hours).</p>
</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.
