GDPR Export and Erase
When someone asks you to hand over or delete the personal data you hold about them (a data-subject access or erasure request under GDPR, the UK GDPR, CCPA and similar laws), you need to be able to find their chat data, export it, and remove it. This guide explains how to do that with Super Speedy Chat today.
One thing to be clear about up front: Super Speedy Chat does not currently register with WordPress’s built-in personal-data tools. There is no automatic exporter or eraser wired into Tools > Export Personal Data or Tools > Erase Personal Data, so those screens will not return or delete chat rows. Handling a request is therefore a manual database process for now. Automatic integration with the WordPress exporter and eraser hooks may be added in a later version; until then, use the steps below. For the wider picture of what is collected and why, read Privacy and Data Handling.
What personal data the plugin holds
Everything lives in your own database, in custom tables (see Backing Up and Migrating Chat Data for the full table list). The fields that count as a person’s personal data are:
- Conversation record (
ssc_conversations):visitor_name,visitor_email(only if the visitor entered it),user_agent,last_page_url,referrer_url,visitor_hash(their cookie token),user_id(if they were logged in), and anything stored in themetadataJSON column. - Participants (
ssc_participants):display_name, plus the samevisitor_hashanduser_idlinks. - Messages (
ssc_messages): the message text itself, in themessagecolumn.
Two more tables hold personal data only when a channel bridge is in use. ssc_discord_threads stores no personal fields itself (just conversation-to-thread ID mappings), and ssc_whatsapp_threads (added in the 1.11 series) stores wa_phone_number and wa_profile_name. The ssc_canned_responses table is your own saved replies, not visitor data, so it is out of scope for a subject request.
The ssc_visitor_hash cookie is the anonymous session identifier that ties a browser to its conversation. It is a random token, not derived from personal data, but because it links to a person’s messages it is treated as personal data here.
Finding a person’s data
There are three ways to locate someone, depending on what identifier you have. The quickest first pass is the search box on the Chats tab in wp-admin, which matches on visitor name and email. For a defensible, complete result, query the database directly. Adjust the wp_ prefix to match your install.
By email address:
SELECT id FROM wp_ssc_conversations WHERE visitor_email = 'person@example.com';
By WordPress user ID (for a logged-in visitor):
SELECT id FROM wp_ssc_conversations WHERE user_id = 123;
By cookie / session token, if the person can give you their ssc_visitor_hash value or you have it from logs:
SELECT id FROM wp_ssc_conversations WHERE visitor_hash = 'the-64-char-token';
Each query returns the conversation IDs that belong to that person. Keep that list; every later step keys off conversation_id.
Exporting the data
To produce an export, read the conversation rows and their child rows for the IDs you found. Run these as SELECTs and save the output (CSV or a SQL dump) to give to the requester:
SELECT * FROM wp_ssc_conversations WHERE id IN (10, 42);
SELECT * FROM wp_ssc_participants WHERE conversation_id IN (10, 42);
SELECT * FROM wp_ssc_messages WHERE conversation_id IN (10, 42);
If WhatsApp is in use and you are honouring a request for a WhatsApp visitor, also include their thread row:
SELECT * FROM wp_ssc_whatsapp_threads WHERE conversation_id IN (10, 42);
The messages query gives you the full transcript; the conversation query gives you the metadata (name, email, IP, user agent, referrer, page URL). Between them they cover everything the plugin holds on that person.
Erasing the data
Take a targeted mysqldump of the ssc_* tables before running any DELETE. The rows reference each other by conversation_id, and these deletions are permanent, so a backup is the only safe way to undo a mistake.
Back up first. Take a targeted dump of the chat tables before you delete anything, using the mysqldump command in Backing Up and Migrating Chat Data. Deletions here are permanent and the rows reference each other by ID, so a mistake is hard to undo without a backup.
Delete the child rows before the parent, so nothing is left orphaned. For the conversation IDs you identified:
DELETE FROM wp_ssc_messages WHERE conversation_id IN (10, 42);
DELETE FROM wp_ssc_participants WHERE conversation_id IN (10, 42);
DELETE FROM wp_ssc_discord_threads WHERE conversation_id IN (10, 42);
DELETE FROM wp_ssc_whatsapp_threads WHERE conversation_id IN (10, 42);
DELETE FROM wp_ssc_conversations WHERE id IN (10, 42);
Include the Discord and WhatsApp lines only if those bridges are in use; they do no harm if the tables have no matching rows. After this, the person’s messages, metadata and channel mappings are gone.
If a lighter touch is enough (for example, the requester only wants their identifying details removed but you have a legitimate reason to keep the anonymised transcript), you can instead blank the personal fields rather than deleting the whole conversation:
UPDATE wp_ssc_conversations
SET visitor_name = 'Removed', visitor_email = NULL,
user_agent = NULL, referrer_url = NULL, last_page_url = NULL
WHERE id IN (10, 42);
A caveat about deleting the plugin
Do not treat uninstalling the plugin as a way to service an individual request. Deleting Super Speedy Chat (not deactivating) runs its uninstaller, which drops all of the ssc_* tables and wipes every conversation for every visitor, not just the one you were asked about. Deactivation, by contrast, leaves all data in place. For a single subject request, always use the targeted DELETE statements above.
Never use “delete the plugin” to service one person’s erasure request. Deleting Super Speedy Chat runs its uninstaller and drops every ssc_* table, wiping all conversations for all visitors. Deactivating leaves everything in place. Only the scoped DELETE statements above remove one person’s data.
For endpoint details if you are scripting any of this against the plugin’s own API, see REST API Reference.

Comments