Home Data Deletion Callback
Legal / Developer reference

Data deletion callback

When a user removes DynamicCRM from a connected platform such as Facebook, that platform calls this endpoint to request deletion of the user’s data. This page documents the contract and lets users check a request’s status.

Endpoint reference Last updated: June 1, 2025

#The endpoint

The data deletion callback is a single HTTPS endpoint that accepts a signed POST request from the calling platform and returns a JSON confirmation.

POST https://dynamiccrm.com.au/data-deletion/callback

It is also reachable over GET with a ?code= query parameter so users can look up the status of a deletion request — the lookup tool further down this page demonstrates that.

#How the flow works

  • A user removes the DynamicCRM app from the connected platform (for example, in their Facebook app settings).
  • The platform sends a signed request to the callback URL identifying the user.
  • Our server verifies the signature, queues the user’s data for deletion, and generates a unique confirmation code.
  • We respond with a JSON body containing a status URL and the confirmation code.
  • The user can visit the status URL at any time to confirm the request was received and completed.

#Request parameters

The platform sends a single field, signed_request, as form-encoded POST data. Once decoded and verified, the payload contains:

FieldTypeDescription
signed_requeststringBase64url-encoded signature.payload sent by the platform.
algorithmstringSignature algorithm — always HMAC-SHA256.
issued_atintegerUnix timestamp indicating when the request was signed.
user_idstringThe app-scoped identifier of the user requesting deletion.

#Verifying the request

Before acting on a request, split the signed_request on the . separator and validate the signature against your app secret using a constant-time comparison.

verify-callback.js
// POST /data-deletion/callback
const [sig, payload] = signedRequest.split('.');
const data = JSON.parse(base64urlDecode(payload));

// Recompute the signature with your app secret
const expected = hmacSha256(payload, APP_SECRET);
if (!timingSafeEqual(expected, base64urlDecode(sig))) {
  return res.status(400).send('Invalid signature');
}

const userId = data.user_id;
await enqueueDeletion(userId);

#Response format

After queuing the deletion, respond with HTTP 200 and a JSON body containing exactly two fields:

FieldTypeDescription
urlstringA status URL where the user can confirm their deletion request.
confirmation_codestringA unique code identifying this deletion request.
200 OK · application/json
{
  "url": "https://melwide.dynamiccrm.com.au/data-deletion-callback?code=DC-7Q2K9X",
  "confirmation_code": "DC-7Q2K9X"
}

#Check a request

Users can confirm the status of a deletion request using the confirmation code they received. Enter a code below to see a sample status response.

Status lookup

Confirm a deletion request

Enter the confirmation code from your deletion email (for example, DC-7Q2K9X).

Deletion request confirmed COMPLETED
Confirmation code
StatusPersonal data deleted
Completed by
Request typeAccount & personal data

This lookup is a front-end demonstration. In production it queries the deletion record created by the callback endpoint.

#Implementation notes

This page documents the contract, not a live handler. The callback endpoint must be implemented on your server: verify the signed request, perform the deletion asynchronously, persist the confirmation code, and serve a real status page. The form above simulates the user-facing response only.

  • Always verify the signature with a constant-time comparison before trusting any field.
  • Process deletion asynchronously and respond quickly so the calling platform doesn’t time out.
  • Store the confirmation code and request timestamp so the status URL can return accurate results.
  • Complete erasure within the window described in our Data Deletion instructions, and retain only what the law requires.

For the user-facing process and request form, see the Data Deletion instructions. For how we handle personal data generally, see our Privacy Policy.