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

# FastSpring Webhook Setup Guide

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

<section data-guide-section data-guide-scopes="">
  <h2>Retrieve the StackOne Native Webhook URL</h2>

  <p>The <strong>Native Webhook URL</strong> is generated once a FastSpring account has been linked in StackOne. Each linked account has its own URL.</p>

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

<section data-guide-section data-guide-scopes="">
  <h2>Create a FastSpring webhook</h2>

  <p>Add a webhook for StackOne in the FastSpring app and point a URL endpoint at the Native Webhook URL so FastSpring posts events to StackOne.</p>

  <Steps>
    <Step title="Open the Webhooks page">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to your <a href="https://app.fastspring.com" target="_blank" rel="noopener noreferrer">FastSpring account</a>.</p>

        <ul>
          <li>In the left sidebar, click <strong>Developer Tools</strong>, then select <strong>Webhooks</strong>.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/yXlVTLcD6Q2JasB6/connectors/fastspring/images/events-developer-tools-webhooks.png?fit=max&auto=format&n=yXlVTLcD6Q2JasB6&q=85&s=72aa2a7c10329af45a8f5919b9b99ea7" alt="The FastSpring sidebar with Developer Tools expanded and Webhooks highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-developer-tools-webhooks.png" />
      </div>
    </Step>

    <Step title="Open the Configuration tab">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The <strong>Webhooks</strong> page opens on the <strong>Log</strong> tab. Click <strong>Configuration</strong> to manage webhooks.</p>

        <img src="https://mintcdn.com/stackone-60/yXlVTLcD6Q2JasB6/connectors/fastspring/images/events-configuration-tab.png?fit=max&auto=format&n=yXlVTLcD6Q2JasB6&q=85&s=9f765e7319c4bda0727caaaca24d222f" alt="The Webhooks page with the Configuration tab highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-configuration-tab.png" />
      </div>
    </Step>

    <Step title="Add a webhook">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Add Webhook</strong> in the top right corner.</p>

        <ul>
          <li>Any webhooks that already exist in the store are listed on this tab. Leave them unchanged.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/yXlVTLcD6Q2JasB6/connectors/fastspring/images/events-add-webhook-button.png?fit=max&auto=format&n=yXlVTLcD6Q2JasB6&q=85&s=cafcc4a40cbb251c2716239ff502d598" alt="The Configuration tab with the Add Webhook button highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-add-webhook-button.png" />
      </div>
    </Step>

    <Step title="Fill in the webhook details">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Add Webhook</strong> dialog, complete the form and click <strong>Add</strong>:</p>

        <ul>
          <li><strong>Title</strong> — enter a name for the webhook (for example, `StackOne Integration`).</li>
          <li><strong>Get webhooks from:</strong> — choose <strong>Live and Test Orders</strong>, <strong>Live Orders</strong> or <strong>Test Orders</strong>, depending on which orders StackOne should receive events for.</li>
          <li>Select <strong>Enable webhook expansion</strong> so events carry full nested objects (account, product, subscription) instead of bare IDs.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/yXlVTLcD6Q2JasB6/connectors/fastspring/images/events-add-webhook-dialog.png?fit=max&auto=format&n=yXlVTLcD6Q2JasB6&q=85&s=ec75021d9355e8a6c2ecb51157efb68b" alt="The Add Webhook dialog with the Title, Get webhooks from and Enable webhook expansion fields highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-add-webhook-dialog.png" />
      </div>
    </Step>

    <Step title="Add a URL endpoint">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The new webhook appears on the <strong>Configuration</strong> tab. On that webhook, click <strong>Add URL Endpoint</strong>.</p>

        <img src="https://mintcdn.com/stackone-60/yXlVTLcD6Q2JasB6/connectors/fastspring/images/events-add-url-endpoint.png?fit=max&auto=format&n=yXlVTLcD6Q2JasB6&q=85&s=d6372d468724413cf7891fb8380b563e" alt="The new StackOne Integration webhook with its Add URL Endpoint button highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-add-url-endpoint.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>Add Webhook URL Endpoint</strong> dialog:</p>

        <ul>
          <li><strong>URL</strong> — paste the Native Webhook URL you copied from StackOne.</li>
          <li><strong>HMAC SHA256 Secret</strong> is optional. StackOne does not need it, so it can be left empty.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/7ZQSeSQo1RxZCE9Q/connectors/fastspring/images/events-url-endpoint-form.png?fit=max&auto=format&n=7ZQSeSQo1RxZCE9Q&q=85&s=1c99bfd5b87df556884fbf0492820aec" alt="The Add Webhook URL Endpoint dialog with the URL and HMAC SHA256 Secret fields highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-url-endpoint-form.png" />
      </div>
    </Step>

    <Step title="Select the events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Under <strong>Events</strong>, tick every event you want StackOne to receive. The events StackOne supports are listed in <strong>Available webhook events</strong> below.</p>

        <img src="https://mintcdn.com/stackone-60/7ZQSeSQo1RxZCE9Q/connectors/fastspring/images/events-select-events.png?fit=max&auto=format&n=7ZQSeSQo1RxZCE9Q&q=85&s=01b06fbb7037eeb73784340a1d61cb40" alt="The Events list in the Add Webhook URL Endpoint dialog with events ticked" width="1280" height="800" data-path="connectors/fastspring/images/events-select-events.png" />
      </div>
    </Step>

    <Step title="Save the endpoint">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Scroll to the bottom of the dialog and click <strong>Add</strong>.</p>

        <img src="https://mintcdn.com/stackone-60/7ZQSeSQo1RxZCE9Q/connectors/fastspring/images/events-save-endpoint.png?fit=max&auto=format&n=7ZQSeSQo1RxZCE9Q&q=85&s=d59def9b4305f972df7027ac92bbf272" alt="The bottom of the Add Webhook URL Endpoint dialog with the Add button highlighted" width="1280" height="800" data-path="connectors/fastspring/images/events-save-endpoint.png" />
      </div>
    </Step>

    <Step title="Confirm the endpoint">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>The endpoint is listed on the <strong>StackOne Integration</strong> webhook with a tag for every selected event. FastSpring starts sending those events to StackOne straight away.</p>

        <ul>
          <li>Use <strong>Edit Endpoint</strong> to change the selected events later.</li>
          <li>Deliveries are listed on the <strong>Log</strong> tab of the <strong>Webhooks</strong> page.</li>
        </ul>

        <img src="https://mintcdn.com/stackone-60/yXlVTLcD6Q2JasB6/connectors/fastspring/images/events-endpoint-saved.png?fit=max&auto=format&n=yXlVTLcD6Q2JasB6&q=85&s=4062d1c72ad4618aa3149b4343a76ae9" alt="The saved URL endpoint on the StackOne Integration webhook with its event tags, the URL hidden" width="1280" height="800" data-path="connectors/fastspring/images/events-endpoint-saved.png" />
      </div>
    </Step>
  </Steps>
</section>

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

  <p>The following FastSpring events can be enabled. FastSpring only delivers the events ticked on the URL endpoint, and StackOne only forwards the events enabled for this connector.</p>

  <Steps>
    <Step title="Order and payment events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to orders, payments, fulfillment, chargebacks and PayPal disputes.</p>

        <ul>
          <li><strong>Order Completed</strong> (`order.completed`) — Fired when an order is paid and all of its fulfillments have completed (not fired for failed payments, pending approvals or subscription rebills)</li>
          <li><strong>Order Failed</strong> (`order.failed`) — Fired when a payment attempt at checkout is declined</li>
          <li><strong>Order Canceled</strong> (`order.canceled`) — Fired when an order is canceled by the merchant or the customer</li>
          <li><strong>Order Approval Pending</strong> (`order.approval.pending`) — Fired when an order needs manual or purchase-order approval before it can complete</li>
          <li><strong>Order Payment Pending</strong> (`order.payment.pending`) — Fired when an order is placed with a delayed payment method such as wire transfer or purchase order</li>
          <li><strong>Chargeback Created</strong> (`chargeback.created`) — Fired when the buyer's bank or card issuer opens a chargeback against an order</li>
          <li><strong>Chargeback Won</strong> (`chargeback.won`) — Fired when a chargeback is resolved in the merchant's favor</li>
          <li><strong>PayPal Dispute Action Required</strong> (`paypal_dispute.action_required`) — Fired when a PayPal dispute opened by the buyer needs a response</li>
          <li><strong>PayPal Dispute Accepted</strong> (`paypal_dispute.accepted`) — Fired when a PayPal dispute is accepted and the buyer is refunded</li>
          <li><strong>PayPal Dispute Lost</strong> (`paypal_dispute.lost`) — Fired when a PayPal dispute is decided in the buyer's favor</li>
          <li><strong>Fulfillment Failed</strong> (`fulfillment.failed`) — Fired when one or more fulfillment steps fail after a successful payment</li>
        </ul>
      </div>
    </Step>

    <Step title="Return and payout events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to returns, refunds and payouts.</p>

        <ul>
          <li><strong>Payout Entry Created</strong> (`payoutEntry.created`) — Fired when a payout entry is generated for a completed order or for a return</li>
          <li><strong>Return Created</strong> (`return.created`) — Fired when a return or refund is issued on an order, manually or automatically</li>
        </ul>
      </div>
    </Step>

    <Step title="Subscription events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to individual subscriptions.</p>

        <ul>
          <li><strong>Subscription Activated</strong> (`subscription.activated`) — Fired when a new subscription is created and activated</li>
          <li><strong>Subscription Charge Completed</strong> (`subscription.charge.completed`) — Fired when a subscription rebill or proration charge succeeds</li>
          <li><strong>Subscription Charge Failed</strong> (`subscription.charge.failed`) — Fired when a subscription rebill charge fails, for example because the card expired</li>
          <li><strong>Subscription Updated</strong> (`subscription.updated`) — Fired when a subscription, its account or its payment method is edited</li>
          <li><strong>Subscription Canceled</strong> (`subscription.canceled`) — Fired when a subscription is canceled and set to deactivate at the end of the current period</li>
          <li><strong>Subscription Uncanceled</strong> (`subscription.uncanceled`) — Fired when a scheduled subscription cancellation is removed before the next rebill date</li>
          <li><strong>Subscription Deactivated</strong> (`subscription.deactivated`) — Fired when a subscription deactivates, either immediately or at the end of the billing period after a cancellation</li>
          <li><strong>Subscription Payment Overdue</strong> (`subscription.payment.overdue`) — Fired when a subscription payment becomes overdue according to the configured grace-period schedule</li>
          <li><strong>Subscription Payment Reminder</strong> (`subscription.payment.reminder`) — Fired when a rebill payment reminder is due according to the configured reminder schedule</li>
          <li><strong>Subscription Trial Reminder</strong> (`subscription.trial.reminder`) — Fired when a trial-ending reminder is due according to the configured schedule (never fires if no trial reminder is configured)</li>
          <li><strong>Subscription Paused</strong> (`subscription.paused`) — Fired when a subscription enters the paused state on its next scheduled rebill date</li>
          <li><strong>Subscription Resumed</strong> (`subscription.resumed`) — Fired when a paused subscription is resumed manually or reactivates on its configured resume date</li>
        </ul>
      </div>
    </Step>

    <Step title="Co-term subscription group events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to co-term subscription groups, which bill several subscriptions together.</p>

        <ul>
          <li><strong>Subscription Group Created</strong> (`subscription.group.created`) — Fired when a co-term subscription group is created</li>
          <li><strong>Subscription Group Prorated</strong> (`subscription.group.prorated`) — Fired when a co-term group's billing is adjusted through proration, for example after a plan change or a new member</li>
          <li><strong>Subscription Group Updated</strong> (`subscription.group.updated`) — Fired when a co-term subscription group is modified</li>
          <li><strong>Subscription Group Payment Charge Completed</strong> (`subscription.group.charge.completed`) — Fired when a payment charge for a co-term group succeeds</li>
          <li><strong>Subscription Group Payment Charge Failed</strong> (`subscription.group.payment.charge.failed`) — Fired when a payment charge for a co-term group fails</li>
          <li><strong>Subscription Group Payment Overdue</strong> (`subscription.group.payment.overdue`) — Fired when a co-term group's payment becomes overdue</li>
          <li><strong>Subscription Group Payment Reminder</strong> (`subscription.group.payment.reminder`) — Fired when a renewal payment reminder is due for a co-term group</li>
          <li><strong>Subscription Group Deactivated</strong> (`subscription.group.deactivated`) — Fired when a co-term subscription group is deactivated</li>
        </ul>
      </div>
    </Step>

    <Step title="Account events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to buyer accounts.</p>

        <ul>
          <li><strong>Account Created</strong> (`account.created`) — Fired when a new buyer account is created, typically when an order is placed with an email address FastSpring has not seen before</li>
          <li><strong>Account Updated</strong> (`account.updated`) — Fired when a buyer account's contact, address or preference details change, from a manual edit or a new order</li>
        </ul>
      </div>
    </Step>

    <Step title="Quote events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to quotes.</p>

        <ul>
          <li><strong>Quote Created</strong> (`quote.created`) — Fired when a new quote is created</li>
          <li><strong>Quote Updated</strong> (`quote.updated`) — Fired when a quote's status or content changes in the app or through the API</li>
        </ul>
      </div>
    </Step>

    <Step title="Mailing list events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to mailing list entries captured at checkout.</p>

        <ul>
          <li><strong>Mailing List Entry Updated</strong> (`mailingListEntry.updated`) — Fired when an email address is added to the mailing list or an entry changes status (subscribed, unsubscribed, abandoned)</li>
          <li><strong>Mailing List Entry Removed</strong> (`mailingListEntry.removed`) — Fired when an email address is removed from the mailing list, for example when the customer unsubscribes</li>
          <li><strong>Mailing List Entry Abandoned</strong> (`mailingListEntry.abandoned`) — Fired when a customer entered an email address at checkout but did not complete the purchase within 30 minutes</li>
        </ul>
      </div>
    </Step>

    <Step title="Invoice events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to invoice-based purchases.</p>

        <ul>
          <li><strong>Invoice Reminder Email</strong> (`invoice.reminder.email`) — Fired when a reminder email is sent ahead of the payment due date of an invoice-based purchase</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

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

  <p>Details of how FastSpring delivers events to StackOne.</p>

  <Steps>
    <Step title="Batched payloads">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Each request body is `{"events": [...]}` — a <strong>list of events</strong>. FastSpring may batch several events into one request. StackOne splits the batch and routes each event to its own handler.</p>
      </div>
    </Step>

    <Step title="Retries">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>FastSpring retries a delivery that does not receive a 2xx response. Automatic retries keep the same event ID, while events resent manually from the <strong>Log</strong> tab get a new ID.</p>
      </div>
    </Step>

    <Step title="Webhook expansion">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>With <strong>Enable webhook expansion</strong> selected, nested objects such as the account, product or subscription are included in full. Without it they arrive as IDs. StackOne handles both.</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.


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