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.
Topic
Article
Trigger
Deadline (acknowledge / complete)
customers/data_request
GDPR Art. 15 (right of access)
Merchant initiates data export for a customer.
30 days / 90 days
customers/redact
GDPR Art. 17 (right to erasure)
Merchant initiates data deletion for a customer.
30 days / 90 days
shop/redact
GDPR Art. 17 (store closure)
Merchant closes their store.
30 days / 90 days
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.
GDPR webhooks are POSTed to two sets of endpoints:
Any callback URLs registered via the standard webhook subscription
API (enabled webhook subscriptions whose topic matches one of the
three GDPR topics).
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.
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:
curl -X POST "https://api.launchmystore.io/apps/gdpr/acknowledge/{requestId}" \ -H "Authorization: Bearer YOUR_APP_ACCESS_TOKEN"
Then, once you have processed the request, mark it complete:
A cron runs daily at midnight (@Cron(EVERY_DAY_AT_MIDNIGHT)) that:
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.
Finds requests past completionDeadline still in dispatched /
acknowledged, marks lagging apps as failed, request → failed.
Finds requests with completionDeadline within the next 7 days and
re-dispatches the webhook as a reminder.