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

# SpotDraft Webhook Setup Guide

> Configure SpotDraft 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="/guides/explore-connectors">Managing Connectors</a>.

    <Columns cols={2}>
      <Card title="Connector Profile" href="/connectors/spotdraft/guides/connector-profile/client-credentials" icon="https://stackone-logos.com/api/spotdraft/filled/png" horizontal>
        SpotDraft - Client Credentials
      </Card>
    </Columns>
  </Step>

  <Step title="Link an Account">
    Connect an account using <a href="/guides/embedding-stackone-hub">StackOne Hub</a> or <a href="/guides/auth-link">Auth Link</a>.

    <Columns cols={2}>
      <Card title="Link Account" href="/connectors/spotdraft/guides/link-account/client-credentials" icon="https://stackone-logos.com/api/spotdraft/filled/png" horizontal>
        SpotDraft - Client Credentials
      </Card>
    </Columns>
  </Step>
</Steps>

<section data-guide-section data-guide-scopes="">
  <h2>How webhooks are set up</h2>

  <p>There is no manual webhook setup in SpotDraft — it is fully automatic. When you connect this account, StackOne uses your Client ID and Client Secret to call SpotDraft's webhook API and register a single webhook that covers every supported activity, pointing at a delivery URL that is unique to this connection and carries a secret token. SpotDraft then sends one HTTP POST per activity to that URL, StackOne routes it to your integration, and only the events you have enabled are dispatched to you. When you disconnect the account, StackOne removes the webhook automatically. Your only step is to enable the events you want in StackOne.</p>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Review the available webhook events</h2>

  <p>Each delivery carries the firing event in the top-level `activity` field, the affected contract in `contract_id`, and the timestamp in `created_at`. Only the events you enable in StackOne are delivered — the groups below list every activity SpotDraft can send.</p>

  <Steps>
    <Step title="Review contract lifecycle events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fired as a contract moves through creation, updates, execution, and deletion.</p>

        <ul>
          <li><strong>Contract Created</strong> (`CONTRACT_CREATED`) — Fired when a contract is created.</li>
          <li><strong>Contract Data Updated</strong> (`CONTRACT_DATA_UPDATED`) — Fired when a contract's key data changes.</li>
          <li><strong>Contract Version Uploaded</strong> (`CONTRACT_VERSION_UPLOADED`) — Fired when a new document version is uploaded.</li>
          <li><strong>Contract Deleted</strong> (`CONTRACT_DELETED`) — Fired when a contract is deleted.</li>
          <li><strong>Contract Voided</strong> (`CONTRACT_VOIDED`) — Fired when a contract is voided.</li>
          <li><strong>Contract Sent to Counterparty</strong> (`CONTRACT_SENT_TO_COUNTERPARTY`) — Fired when a contract is sent out for review or signature.</li>
          <li><strong>Contract Executed</strong> (`CONTRACT_EXECUTED`) — Fired when all required signatures are complete.</li>
          <li><strong>Contract Marked for Execution</strong> (`CONTRACT_MARK_FOR_EXECUTION`) — Fired when a contract is marked ready for execution.</li>
          <li><strong>Contract Unmarked for Execution</strong> (`CONTRACT_UNMARK_FOR_EXECUTION`) — Fired when that mark is removed.</li>
          <li><strong>Contract Entity Updated</strong> (`CONTRACT_ENTITY_UPDATED`) — Fired when the owning entity changes.</li>
          <li><strong>Contract Process Metric Updated</strong> (`CONTRACT_PROCESS_METRIC_UPDATED`) — Fired when a process metric is updated.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review approval and review events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fired for internal approval and legal review workflows.</p>

        <ul>
          <li><strong>Approval Requested</strong> (`CONTRACT_APPROVAL_REQUESTED`) — Fired when an approval is requested.</li>
          <li><strong>Approval Completed</strong> (`CONTRACT_APPROVAL_COMPLETED`) — Fired when an approval is completed.</li>
          <li><strong>Review Requested</strong> (`CONTRACT_REVIEW_REQUESTED`) — Fired when a legal review is first requested.</li>
          <li><strong>Review Completed</strong> (`CONTRACT_REVIEW_COMPLETED`) — Fired when a legal review is marked complete.</li>
          <li><strong>Activity Log Comment Created</strong> (`CONTRACT_ACTIVITY_LOG_COMMENT_CREATED`) — Fired when a comment is added to the activity log.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review signature events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fired during the signature request and signing flow.</p>

        <ul>
          <li><strong>Signature Requested</strong> (`CONTRACT_SIGNATURE_REQUESTED`) — Fired when signatures are requested.</li>
          <li><strong>Signature Requested Notification Sent</strong> (`CONTRACT_SIGNATURE_REQUESTED_NOTIFICATION_SENT`) — Fired when the signature-request notification is sent.</li>
          <li><strong>Signature Declined</strong> (`CONTRACT_SIGNATURE_DECLINED`) — Fired when a signatory declines.</li>
          <li><strong>Contract Signed</strong> (`CONTRACT_SIGNED`) — Fired when a required signatory completes signing.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review key-pointer and metadata events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fired when contract key data points or external metadata change.</p>

        <ul>
          <li><strong>Key Pointer Created</strong> (`CONTRACT_KEY_POINTER_CREATION`) — Fired when a key data point is created.</li>
          <li><strong>Key Pointer Updated</strong> (`CONTRACT_KEY_POINTER_UPDATION`) — Fired when a key data point is updated.</li>
          <li><strong>External Metadata Created</strong> (`CONTRACT_EXTERNAL_METADATA_CREATED`) — Fired when external metadata is added.</li>
          <li><strong>External Metadata Updated</strong> (`CONTRACT_EXTERNAL_METADATA_UPDATED`) — Fired when external metadata changes.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review counterparty events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fired for counterparty records, contacts, and addresses.</p>

        <ul>
          <li><strong>Counterparty Created</strong> (`COUNTER_PARTY_CREATED`) — Fired when a counterparty is created.</li>
          <li><strong>Counterparty Updated</strong> (`COUNTER_PARTY_UPDATED`) — Fired when a counterparty is updated.</li>
          <li><strong>Counterparty Contact Created</strong> (`COUNTER_PARTY_CONTACT_CREATED`) — Fired when a counterparty contact is added.</li>
          <li><strong>Counterparty Contact Updated</strong> (`COUNTER_PARTY_CONTACT_UPDATED`) — Fired when a counterparty contact changes.</li>
          <li><strong>Counterparty Address Created</strong> (`COUNTER_PARTY_ADDRESS_CREATED`) — Fired when a counterparty address is added.</li>
          <li><strong>Counterparty Address Updated</strong> (`COUNTER_PARTY_ADDRESS_UPDATED`) — Fired when a counterparty address changes.</li>
        </ul>
      </div>
    </Step>

    <Step title="Review email delivery events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Fired as signing and redlining emails are delivered, opened, and clicked.</p>

        <ul>
          <li><strong>Signing Email Delivered</strong> (`SIGNING_EMAIL_DELIVERED`) — Fired when a signing email is delivered.</li>
          <li><strong>Signing Email Opened</strong> (`SIGNING_EMAIL_OPENED`) — Fired when a signing email is opened.</li>
          <li><strong>Signing Email Not Delivered</strong> (`SIGNING_EMAIL_NOT_DELIVERED`) — Fired when a signing email fails to deliver.</li>
          <li><strong>Signing Email Link Clicked</strong> (`SIGNING_EMAIL_LINK_CLICKED`) — Fired when a signing email link is clicked.</li>
          <li><strong>Redlining Email Delivered</strong> (`REDLINING_EMAIL_DELIVERED`) — Fired when a redlining email is delivered.</li>
          <li><strong>Redlining Email Opened</strong> (`REDLINING_EMAIL_OPENED`) — Fired when a redlining email is opened.</li>
          <li><strong>Redlining Email Not Delivered</strong> (`REDLINING_EMAIL_NOT_DELIVERED`) — Fired when a redlining email fails to deliver.</li>
          <li><strong>Redlining Email Link Clicked</strong> (`REDLINING_EMAIL_LINK_CLICKED`) — Fired when a redlining email link is clicked.</li>
          <li><strong>Postmark Email Event</strong> (`POSTMARK_EMAIL_EVENT`) — Fired for lower-level email delivery events from the mail provider.</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

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

  <p>SpotDraft sends each activity as an HTTP POST with a JSON body. The top-level fields are `activity` (the firing event, e.g. `CONTRACT_CREATED`), `contract_id`, `contract_title`, `contract_status`, `created_at`, and `activity_data` (event-specific detail, including `performed_by` and a `timestamp`). Counterparty events instead carry the entity under `activity_data.counter_party_data`, `activity_data.counter_party_contact_data`, or `activity_data.counter_party_address_data`.</p>

  <Steps>
    <Step title="Review a delivered payload">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Each webhook log entry exposes the exact JSON SpotDraft sent under the <strong>Payload</strong> tab, alongside a <strong>Headers</strong> tab. Use it to confirm the `activity` type and the identifiers your integration reads.</p>

        <img src="https://mintcdn.com/stackone-60/KJWa78J6ij6BBBPN/connectors/spotdraft/images/spotdraft-events-webhook-logs.png?fit=max&auto=format&n=KJWa78J6ij6BBBPN&q=85&s=166255244193a0a26cab2f7ce02ba2b4" alt="SpotDraft Webhook Logs detail showing the delivered JSON payload with activity, contract_id, and activity_data." width="1280" height="800" data-path="connectors/spotdraft/images/spotdraft-events-webhook-logs.png" />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>View and troubleshoot deliveries in SpotDraft</h2>

  <p>SpotDraft records every delivery attempt so you can monitor and debug them, independent of the automatic StackOne setup.</p>

  <Steps>
    <Step title="Open the Webhooks tab">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In SpotDraft, click <strong>Settings</strong> in the left navigation, open <strong>Developer Settings</strong>, and select the <strong>Webhooks</strong> tab. The StackOne-managed webhook is listed here (its name begins with "Created by SpotDraft for Integration") with its subscribed <strong>Events</strong>, <strong>Webhook URL</strong>, and a <strong>Status</strong> of <strong>Enabled</strong>.</p>

        <img src="https://mintcdn.com/stackone-60/KJWa78J6ij6BBBPN/connectors/spotdraft/images/spotdraft-events-webhooks-list.png?fit=max&auto=format&n=KJWa78J6ij6BBBPN&q=85&s=47028462627daeb1eaa7035de7433da5" alt="SpotDraft Developer Settings on the Webhooks tab, listing webhooks with Webhook Name, Events, Webhook URL, and Status columns." width="1280" height="800" data-path="connectors/spotdraft/images/spotdraft-events-webhooks-list.png" />
      </div>
    </Step>

    <Step title="Review the webhook logs">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Open <strong>Webhook Logs</strong>, optionally <strong>Search by Contract Id</strong> to narrow results, and click <strong>View Details</strong> on any entry to see the delivery status, target URL, and — via <strong>View More</strong> — the <strong>Payload</strong> and <strong>Headers</strong> that were sent.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Verify delivery authenticity</h2>

  <p>Every delivery includes an `X-SD-WEBHOOK-CONTENT-HASH` header — a Base64-encoded HMAC-SHA512 of the raw request body computed with your workspace's webhook secret. StackOne authorizes each delivery using the secret token embedded in the per-connection webhook URL, so no additional configuration is required on your side.</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.
