Skip to main content

GDPR Webhooks

Every app installed on a LaunchMyStore merchant must respond to three mandatory GDPR webhook topics. These webhooks are dispatched by the platform when a merchant initiates a GDPR request through their admin (or when the merchant closes their store), and your app is legally required to acknowledge receipt and process the data within fixed deadlines.
Failure to acknowledge within 30 days marks the request as failed for your app and notifies the merchant. Failure to complete within 90 days also marks the request as failed and is grounds for app removal from the marketplace.

Webhook Delivery

GDPR webhooks are POSTed to two sets of endpoints:
  1. Any callback URLs registered via the standard webhook subscription API (enabled webhook subscriptions whose topic matches one of the three GDPR topics).
  2. The mandatory gdprUrls configured on your App record:
    • gdprUrls.customerDataRequest for customers/data_request
    • gdprUrls.customerRedact for customers/redact
    • gdprUrls.shopRedact for shop/redact
Webhooks are HMAC-signed with the app’s clientSecret and have a 10s timeout. Failures are logged but do not automatically retry — your app must acknowledge receipt via POST /apps/gdpr/acknowledge/:requestId within the deadline, regardless of HTTP delivery success.

Request Headers

Payload: customers/data_request

Payload: customers/redact

Payload: shop/redact

Fired when a merchant closes their store. Your app must delete all data associated with shop_id within 90 days.

Required Response

Webhook handlers should return HTTP 200-299 quickly (the platform timeout is 10s). The HTTP response itself does not acknowledge the request — you must call the merchant-facing acknowledge endpoint explicitly:
Then, once you have processed the request, mark it complete:
dataExportUrl is only relevant for customers/data_request — it is displayed in the merchant admin so they can hand the export to the customer.

Merchant Endpoints

These are used by the LaunchMyStore admin (not your app), but are documented here for completeness.

POST /apps/gdpr/data-request

Merchant-initiated. Creates a new customers/data_request and dispatches webhooks to every installed app.
Response data:

POST /apps/gdpr/customer-redact

Response includes ordersToRedact count.

POST /apps/gdpr/shop-redact

No body. Returns the same shape as the others.

GET /apps/gdpr/requests

Lists GDPR requests for the merchant’s store.

GET /apps/gdpr/requests/:requestId

Returns the full request including per-app acknowledgment state:

Deadline Enforcement

A cron runs daily at midnight (@Cron(EVERY_DAY_AT_MIDNIGHT)) that:
  1. Finds requests past acknowledgeDeadline still in pending / dispatched, marks the lagging apps as failed, sets the request status to failed, and re-dispatches the webhook as a final notice.
  2. Finds requests past completionDeadline still in dispatched / acknowledged, marks lagging apps as failed, request → failed.
  3. Finds requests with completionDeadline within the next 7 days and re-dispatches the webhook as a reminder.

HMAC Verification

Status Lifecycle

Per-app appAcknowledgments[].status is one of pending, acknowledged, completed, failed.