Personal data in Exponential
This page is for site owners, data protection officers and administrators who need a map of where personal data is
kept in an Exponential installation. You cannot protect, export or delete data you have not found. Each row below
was checked against the database schema (kernel/sql/mysql/kernel_schema.sql, the cjw_newsletter schema) and the
documentation named.
Warning
This is a technical map, not legal advice. Your own site may store more: custom content classes, extensions and templates can add personal data anywhere. Check them with your developer, and take legal questions to a lawyer or your data protection officer.
Contents
- The map at a glance
- Accounts and sign-in
- Store: baskets and orders
- Forms: the information collector
- Mail preferences and newsletters
- Logs and the audit trail
- Everything else to check
- Building your own data inventory
The map at a glance
| Data | Where | Typical contents | Read |
|---|---|---|---|
| User accounts | ezuser table and the user's content object | login, e-mail address, password hash; name and other fields of the user class | Accounts and sign-in |
| Sign-in activity | ezuservisit | last visit, number of sign-ins, failed attempts | Check user accounts |
| Sessions | ezsession (database handler) or PHP's session files | user id, session data | Sessions |
| Orders | ezorder | e-mail address, user id, and an account record with name, address, phone and comment | Basket, checkout and orders |
| Form submissions | ezinfocollection, ezinfocollection_attribute | whatever visitors typed, often names and e-mail addresses | Collected information |
| Mail preferences and consent | expmail_preference, expmail_consent_log, expmail_pending | choices per category; consent history with time, source, text shown, IP address, acting user | E-mail preferences |
| Suppression list | expmail_suppression | a salted hash of each address, never the address | same |
| Newsletter subscribers | cjwnl_user, cjwnl_subscription, cjwnl_blacklist_item | e-mail, salutation, first and last name, organization, birthday, phone number, bounce state | cjw_newsletter |
| Notification subscriptions | ezsubtree_notification_rule | which user follows which content | Notifications |
| Search phrases | ezsearch_search_phrase | phrases visitors typed, which can contain personal data | Accessibility, security and compliance checklists |
| Request and security logs | var/<site>/log/ | masked addresses, shortened user agents | Request logs |
| Audit trail | var/<site>/log/audit/ and the expaudit_* index tables | who did what; addresses truncated, sessions hashed | The audit trail |
| Exports | files you download, and files in var/tmp/ | CSV and JSON exports of forms, mail data, audit records | Compliance and GDPR |
| Backups | wherever your host keeps them | everything above | Backups: what to back up |
Accounts and sign-in
- The account is a row in
ezuser(login, e-mail address, password hash) tied to a content object of the user class, which holds the name and any other fields your class defines. Passwords are stored as bcrypt hashes (Security hardening). - Activity:
ezuservisitkeeps the last visit, the number of sign-ins and failed attempts; Users > Check user accounts reads it (Check user accounts). - Keys: activation keys and password reset keys have their own tables (
ezuser_accountkey,ezforgot_password). - Two-step sign-in: the authenticator secret is stored with the user; a
SecretKeyencrypts it in the database (Two-step sign-in). - Removal: a user object never goes to the trash; removing it is final. Removing an account also erases its mail preferences (Check user accounts, Compliance and GDPR).
Store: baskets and orders
ezorderkeeps the customer's e-mail address and user id, and, in its account record, the first and last name, e-mail address, street, ZIP code, city, state, country, phone and comment entered at checkout (kernel/private/classes/views/shop/userregister.php).ezbasketties a basket to a session;ezwishlistto a user.- Orders can be archived and removed in the administration (
shop/archiveorder,shop/removeorder, Basket, checkout and orders). Your bookkeeping duties may require keeping orders for a period; decide with your accountant. - Card data: the audit trail records payments "never card data" (The audit trail); see Card payments and PCI basics.
Forms: the information collector
Each time a visitor sends a form, one collection is stored with one value per collector field. Setup > Collected
information lists, exports (CSV) and removes collections; it needs the policy infocollector/read. Each export is
recorded in the audit trail with the number of rows, never the values
(Collected information). Mail to a receiver puts the same data in an
inbox as well (Forms with the information collector).
Mail preferences and newsletters
- The kernel's mail gate keeps each person's choices, a consent log and a suppression list stored as salted hashes (Consent and forms).
- The newsletter extension
cjw_newsletterkeeps its own subscriber records (cjwnl_user) with the fields listed above, subscriptions per list, and a blacklist with address and hash. Open and click tracking is off by default ([TrackingSettings] Tracking=disabled) (Compliance and GDPR).
Logs and the audit trail
404.logandsecurity.logmask client addresses by default (MaskIP=enabled); the log viewer masks e-mail addresses, IP addresses and secrets in what it shows (Compliance and GDPR).- Velocity's access log is in Apache's combined format and "names visitors"; its files are readable by the owner and group only (same source).
- The audit trail truncates addresses, hashes sessions, shortens user agents, and never records passwords, tokens or secrets (The audit trail).
- Web server, mail server and panel logs outside Exponential follow your host's settings.
Everything else to check
- To do: Custom content classes with personal fields (members, staff profiles, comments, event sign-ups).
- To do: Content authorship: each object and version records its creator and owner.
- To do: Private messages, if
ezpmis active (it adds inboxes and outboxes;composer.jsondescription). - To do: Exponential Intelligence, if switched on: which provider receives which text (expai).
- To do: Third-party services embedded by templates: fonts, maps, analytics, videos.
- To do: Exported files on staff computers.
- To do: Backups and their retention.
Building your own data inventory
Copy this table into your record and fill it in per row:
DATA INVENTORY
Data | Purpose | Legal basis (ask your adviser) | Where stored | Who may see it | Retention | How deleted
-----|---------|--------------------------------|--------------|----------------|-----------|------------
User accounts | | | ezuser + user objects | | |
Orders | | | ezorder | | |
Form submissions | | | ezinfocollection | | |
Mail consent | | | expmail_* | | |
Newsletter | | | cjwnl_* | | |
Logs | | | var/<site>/log | | |
Audit trail | | | var/<site>/log/audit | | |
Backups | | | (host) | | |Related pages
- GDPR basics
- Data retention and deletion
- Form submissions
- Free documentation: this page is free to copy, translate and improve under the GNU FDL 1.3.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.