Skip to main content
A merchant can delete a customer record, delete their store, or ask for a copy of what the store holds for one shopper. Salesive forwards each of those as a mandatory webhook to the apps installed on the store, so your app can erase or return what it holds. The notices carry identifiers only: a customer id or a shop id, never the record itself. They cannot be opted out of with webhookTopics, and customers/redact and shop/redact are sent whatever scopes the installation currently holds. If your app stores customer data, you must handle them.

The three notices

shop/redact is shop wide: one envelope per installation, with the shop as both the routing key and the record being erased. The two customer topics carry the customer id in resourceId.

The 30 day expectation

Complete each notice within 30 days of the delivery.
  • customers/redact: erase every record you hold for that customer id, including backups, caches and derived data, and stop using it. Keep only what the law requires you to keep, and keep that quarantined rather than in active use.
  • shop/redact: erase everything you hold for the shop and its customers, and deactivate your copy of the store.
  • customers/data_request: compile what you hold for that customer and give it to the merchant, or tell them you hold nothing.
Salesive does not enforce the deadline for you and does not retry for 30 days. The notice is delivered with the normal webhook retry ladder, so make sure your handler is idempotent and keeps a record of which notices it has completed. Put the 30 day window in your own privacy policy too.

What a notice looks like

A customers/redact delivery:
A shop/redact delivery uses "resource": "shop", "action": "redact" and the shop id as resourceId. A customers/data_request delivery uses "action": "data_request". There are no customer fields in any of them. Use shopId and resourceId to find your own records. Do not call the Salesive API to fetch the customer: the record may already be gone, and the notice is the authority.

Handle a notice

  1. Verify the signature and reject a stale timestamp. See Webhooks.
  2. Dedupe on id; delivery is at-least-once.
  3. Route on topic.
  4. Look the record up by shopId and resourceId in your own storage.
  5. Erase or export it, and record when you completed it.
  6. Acknowledge with a 2xx quickly. Do the work asynchronously if it is slow.
A webhook has no reply channel. If the merchant asked for a copy of the data, deliver it through your own app UI or email, not by answering the webhook.

Delivery details

  • One delivery per installation, at the URL and signing secret that installation resolves to. A production install uses its pinned release; a development install uses devConfig.
  • Mandatory: these topics are delivered even when they are not in webhookTopics.
  • customers/redact and shop/redact need no scope. customers/data_request needs one of the three customer scopes.
  • If your app has no webhook URL, nothing is delivered. Set one before you store any customer data.
  • Every attempt appears in the delivery log for 14 days.

Also do this

  • Store only the customer data your app actually needs, and know where every copy lives.
  • Encrypt customer data at rest.
  • Keep a data map so a redaction is complete rather than best effort.
  • Treat a customers/data_request as an export task, not as permission to read more of the store.

Next steps

Webhooks

Signature verification, topics and retries.

Scopes & permissions

Which customer scopes exist and how approval works.