The internal compliance manual for SMJobs: the processing register, how we honour data subject rights, our safeguards, how we handle a breach, and the schedule we work to.
Last updated: 21 October 2026 · Version 1.0 · Owner: Information Officer
This manual records how [LEGAL ENTITY NAME] ("SMJobs", "we") complies with the Protection of Personal Information Act 4 of 2013 ("POPIA") and the Promotion of Access to Information Act 2 of 2000 ("PAIA"). It is the operating document behind the Privacy Notice, the Cookie Policy and the Terms & Conditions.
It covers the SMJobs platform at smjobs.co.za — the job board, the seeker and employer accounts, the application process, the talent directory, the administrative back office, the newsletter and the cookies the site sets. It does not cover recruitment agencies or employers who use the platform as a candidate source under their own lawful basis, or third-party sites we link to.
It is a controlled document. The Information Officer owns it, reviews it at least annually, and records every change in the change log at Annexure C. Where this manual and the published notices disagree, the published notices are the public commitment and this manual must be corrected; where this manual and the code disagree, the code must be corrected, because the code is what actually happens to a data subject's information.
Version 1.0. The technical controls described in sections 8 and 12 are implemented and live. The items marked open in Annexure A are the outstanding actions that must be closed by the operator before the first compliance review.
POPIA places the duty on the responsible party. We are the responsible party for the personal information described in the processing register.
A single breach of this manual by a staff member is a disciplinary matter. Any suspected breach of personal information is also a security compromise under section 22 and must be reported to the Information Officer immediately, whatever else it turns out to be.
This manual is written against, and should be read with:
POPIA section 17 requires a responsible party to document all processing operations under its responsibility, and section 18 requires the data subject to be told, when information is collected, what it is collected for. This register is the operational form of that documentation. It is maintained by the Information Officer. Each row is a processing activity, not a table, because the lawful basis and the retention period attach to the purpose, not to the column.
| Ref | Processing activity | Data subjects | Categories | Lawful basis | Source | Recipients | Retention |
|---|---|---|---|---|---|---|---|
| R-01 | Account creation and authentication (seeker) | Job seekers | Name, email, phone, password hash, profile photo, Google subject id, email-verified flag, password-changed date | Performance of a contract (s.11(1)(b)); consent (s.11(1)(a)) for the terms | Directly from the data subject; from Google on OAuth sign-in | Hosting and email service providers (as operators) | Life of the account, then deleted under the account-deletion procedure |
| R-02 | Account creation and authentication (employer) | Employers | Company name, contact name, email, phone, VAT number, logo, password hash | Performance of a contract (s.11(1)(b)); consent (s.11(1)(a)) for the terms | Directly from the data subject | Hosting and email service providers (as operators) | Life of the account, then deleted under the account-deletion procedure |
| R-03 | Job posting and vacancy management | Employers; job seekers | Vacancy details, company details, contact details of the poster | Performance of a contract (s.11(1)(b)); legitimate interests (s.11(1)(f)) for moderation | Directly from the employer | The public (published job listings), and the employer's own logged-in staff | While the vacancy is live, and for the statutory period after it closes |
| R-04 | Job applications | Job seekers; employers | Name, email, phone, cover letter, CV file, application timestamp, employer review status | Consent (s.11(1)(a)) — the applicant ticks the consent box at the point of application; performance of a contract (s.11(1)(b)) | Directly from the applicant | The employer that received the application, and the administrators who moderate it | 24 months, then the row and the CV file are deleted automatically |
| R-05 | Talent directory (recruiter-facing seeker profiles) | Job seekers who have opted in | Headline, location, experience, skills, LinkedIn URL, CV, email, phone | Consent (s.11(1)(a)) — explicit opt-in, default off | Directly from the data subject, via the toggle in their account | Employers and recruiters browsing the directory | Until the seeker switches it off, deletes their account, or the 24-month sweep reaches the record |
| R-06 | CV storage and authenticated delivery | Job seekers; employers | CV file name and the file itself | Performance of a contract (s.11(1)(b)); legitimate interests (s.11(1)(f)) for the access controls around it | Directly from the data subject | The seeker themself; the employer that holds the application or that the seeker has opted in to; administrators | Held with the record it belongs to; deleted with the application, the profile or the account, whichever goes first |
| R-07 | Consent ledger | Everyone who gives consent | Visitor id, account id where known, email where given, consent type, categories, policy version, granted or withdrawn, source, IP address, user agent, timestamps | Legal obligation (s.11(1)(c)) and legitimate interests (s.11(1)(f)) — the evidence of compliance, because the burden of proving consent sits with us, not with the data subject | Generated by the platform at the moment of consent | Administrators and the Information Officer | 5 years from the date of the record, unless the data subject asks us to delete their records, in which case the rows tied to them are deleted with the rest |
| R-08 | Cookie and preference storage | Site visitors | Consent state, visitor id, saved-job ids, saved job-search filters, functional identifiers | Consent (s.11(1)(a)) for anything optional; legitimate interests (s.11(1)(f)) for essential session handling | Generated on the device by the browser | Not transferred off the device, except the consent record itself, which is written to the ledger at R-07 | Until the cookie expires (see the Cookie Policy) or the visitor clears it |
| R-09 | Newsletter subscription | Prospective and existing users | Email address | Consent (s.11(1)(a)), recorded before the mail is sent | Directly from the person who subscribes | The email delivery provider (as operator) | Until unsubscribed, then the subscription is removed and the consent record is retained under R-07 |
| R-10 | Abuse prevention and rate limiting | Users and applicants | IP address, browser and device, application timestamps | Legitimate interests (s.11(1)(f)) — security and abuse prevention | Read from the request at the time it is made | Administrators | 24 months |
| R-11 | Administrative audit trail | Administrators; data subjects who are the subject of the action | Action, target, actor, timestamp, and the name or email of the person affected | Legal obligation (s.11(1)(c)); legitimate interests (s.11(1)(f)) | Generated by the back office | Administrators and the Information Officer | 24 months |
| R-12 | Account recovery | Account holders | Email address, hashed single-use reset token, expiry | Performance of a contract (s.11(1)(b)) | Directly from the account holder | The email delivery provider (as operator) | Token expires after 1 hour; the row is deleted after 7 days |
| R-13 | Google OAuth sign-in | Users who choose Google | Name, email, profile picture, Google subject id | Consent (s.11(1)(a)), given by choosing to continue with Google | Hosting provider (as operator) | As R-01 / R-02 | |
| R-14 | Employer moderation of listings and applications | Employers; job seekers | Submission content, employer details | Legitimate interests (s.11(1)(f)) — keeping the marketplace trustworthy | Generated by the platform | Administrators | 24 months |
The talent directory is the one place on the platform where a data subject's details are visible to other people. It is opt-in, not opt-out: a seeker is invisible until they switch it on themselves, and switching it off takes effect immediately. The employers who browse it can see the contact details listed in R-05, which is why the copy in the account area says so plainly rather than hinting at it.
Where we rely on consent, it must be freely given, specific, informed and unambiguous, and it must be a positive act (POPIA section 11). The platform implements this as follows.
Every consent decision is written to the consents table at the moment it is made, with the visitor id, the account id where the person is signed in, the email address where one was given, the consent type, the categories, the policy version that was on display, the source, the IP address, the user agent, and the timestamp. A withdrawal is recorded as a new row with granted = 0 and a withdrawn_at timestamp, so the history is never rewritten — we can always show what was agreed to and when, which is what POPIA and the Regulator expect to be able to see. The responsible party bears the burden of proof of consent, so this ledger is how we discharge it.
Withdrawal is as easy as giving it. The "Cookie settings" link in the footer of every page reopens the preference panel, and the talent directory switch is in the account area. A request to withdraw by email is actioned by the Information Officer within the ordinary rights timescale, and the withdrawal is recorded in the ledger.
POPIA section 5 lists the rights a data subject has: to be notified that information is being collected or has been accessed by an unauthorised person; to establish whether we hold their information and to get access to it; to have it corrected, destroyed or deleted; to object to processing on reasonable grounds, and to object to direct marketing at any time; to withdraw consent; not to be subject to a decision based solely on automated processing; to complain to the Regulator; and to institute civil proceedings. Requests are free. We do not charge for a request, and we do not ask for identity documents beyond what is needed to confirm that the requester is who they say they are.
| Right | Section | How it is exercised | What we must do | Timeframe |
|---|---|---|---|---|
| Access | s.23 | Email the Information Officer, or ask in the account area | Provide a copy of the personal information we hold about the requester, plus the identity of all third parties or categories of third parties who have, or have had, access to it, in a reasonable time and in a form that is generally understandable | Within a reasonable time, and in any event within 30 days of receiving the request |
| Correction / rectification | s.24(1)(a) | Edit the profile directly, or email the Information Officer | Correct or delete personal information that is inaccurate, irrelevant, excessive, out of date, incomplete, misleading or was obtained unlawfully. Where the change has an impact on decisions that have been or will be taken about the data subject, inform each person or body to whom the information was disclosed | As soon as reasonably practicable; immediately where the edit is made by the data subject in their own account |
| Objection to processing | s.11(3)(a) | Email the Information Officer | Consider the objection on reasonable grounds relating to the data subject's particular situation. If it is upheld, we may no longer process the personal information — s.11(3) is not a right to be weighed against a commercial interest, it is a stop | Within the same 30-day window; processing is suspended while the objection is considered |
| Objection to direct marketing | s.11(3)(b), s.69(3)(c) | The unsubscribe link in every marketing email, or the "Cookie settings" / account switch | Stop the marketing immediately and permanently. We do not ask for a reason and we do not require a phone call | Immediately, and in any event within the timescale the ECTA allows for the unsubscribe request to take effect |
| Withdrawal of consent | s.11 | Cookie settings, the account switch, the unsubscribe link, or by email | Stop the processing that rested on that consent, and record the withdrawal. Withdrawal does not affect the lawfulness of the processing before the withdrawal, nor processing that rests on a ground other than consent | Immediately on request; where the request arrives by email, within 30 days |
| Deletion of information | s.24(1)(b), s.14 | The "Delete my account" control in the account area, or by email | Delete the account and everything that hangs off it: the profile, the applications, the CV files, the saved jobs, the consent records that relate to the person, and the applications they sent to an employer's jobs. The audit log entry is kept, but the name and email in it are replaced with "[redacted]" | Immediately on the in-product control; within 30 days of a written request |
| Complaint to the Regulator | s.5, s.74 | Directly to the Information Regulator, without coming to us first | Nothing is required of us beyond cooperating with the Regulator. We would rather you raised it with us first, but you are not required to | As set by the Regulator's process |
| Civil proceedings | s.5, s.99 | Through a court | Nothing. This is a right you hold against us, not a request you make to us | As set by the court |
A request is refused only where the law permits it, and the refusal is recorded with the reason: for example, where the request would disclose another person's personal information, where the record is subject to a legal hold, or where the information was lawfully made public by the data subject and the request is not about their rights rather than the public record. A refusal on the ground that a request is manifestly unfounded or excessive, and that the cost of dealing with it would be unreasonable, is a last resort — s.10 requires that processing be reasonable and minimal — and we do not use it to avoid ordinary requests.
POPIA section 26 prohibits processing special personal information — health, biometric, racial or ethnic origin, political opinions, religious or philosophical beliefs, trade union membership, genetic information, and the personal information of children — unless an exception in s.27(1) applies.
SMJobs does not ask for special personal information, and the platform has no field for it. We do not ask for it on registration, on the profile, on the application form or on the job posting form.
We recognise that a CV or a covering letter may contain special personal information that the data subject chose to include, and that a job seeker may mention a disability, a pregnancy, a religious observance, or a union membership in the course of explaining why they are a good fit. That is the data subject's own free expression, provided to the employer, and we neither profile on it nor treat it as a reason to refuse a listing. We do not read applications to infer special personal information, and we do not ask employers to send it to us through the platform.
If a data subject asks us to stop processing special personal information that they have included in a CV or covering letter, we treat that as an objection and a correction under sections 11(3) and 24, and we remove it from the stored file where we are able to.
We do not knowingly allow the Platform to be used to recruit on the basis of race, colour, religion, gender, sexual orientation, pregnancy or HIV status. Section 9 of the Terms makes that a breach of the contract, and the moderation queue exists partly to catch it.
POPIA section 19 requires safeguards appropriate to the sensitivity of the data and the risk of harm, and section 19(2) requires the measures in Schedule 2 to be adhered to. These are the measures in place, and what each one is for.
| Control | What it does | Protects against |
|---|---|---|
| Password hashing | Passwords are stored as an irreversible hash. They are never stored in clear, never written to a log, and never recoverable by anyone, including us | A database disclosure exposing usable passwords |
Session cookies marked HttpOnly, Secure and SameSite=Lax |
The session identifier cannot be read by client-side script and is not sent on cross-site requests | Session hijacking and cross-site request forgery |
| CSRF tokens on every state-changing request | A per-session token must be returned with any write. The check is skipped for read-only methods, so a link can never change anything | A third-party site silently making a change in a signed-in user's name |
| HTTP method enforcement | Every mutating API action is restricted to the one method it is meant to use — for example, deleting a user record requires DELETE, and a request by any other method is refused with a 405 |
State changes triggered by a simple GET request, which browsers and crawlers follow automatically |
| Same-origin checks on public write endpoints | Consent records and newsletter subscriptions are refused if the request arrives with a foreign Origin |
Cross-site injection of consent or subscription records |
| Authenticated CV delivery | CVs are not served as static files. A request for one is checked against the file system, and the directory denies direct access, so a guessed or scraped file name yields nothing | Bulk scraping of every CV on the platform |
| Role-based authorisation on every read | A seeker sees their own profile CV and their own applications; an employer sees a seeker profile only where that seeker has opted in, and an application's CV only for a vacancy they own; an administrator sees the moderation view | One user reading another user's personal information |
| Rate limiting | Application submissions, password reset requests and admin logins are throttled per IP address and per account | Automated abuse, credential stuffing, and mass application flooding |
| Single-use, time-limited reset tokens | Reset tokens are stored as a hash, expire after one hour, and are deleted the moment they are used. Requests are limited to three an hour | Password reset by a stale or intercepted token, and enumeration of registered addresses |
| Administrative session management | Admin sessions are server-side, expire, and are invalidated on logout. Administrative actions are recorded in an audit log | Unattended admin access, and actions that cannot be attributed |
| Parameterised database access | Every query uses prepared statements with bound parameters; no user input is concatenated into SQL | SQL injection |
| Output escaping | User-supplied content is escaped before it is written into a page, including in the administrative back office | Stored cross-site scripting |
| Upload validation and safe deletion | Uploads are restricted by type and are written under generated names. A file is only unlinked after its name has been reduced to a base name and checked against a strict pattern | Executable uploads, and a deletion path that can be aimed outside the upload directory |
| Self-hosted fonts and consent-gated third-party scripts | The typeface is served from our own domain. Google AdSense is the only third-party advertising script and it loads only after the visitor agrees to the Advertising cookie category; it is removed when that consent is withdrawn. | Third-party tracking, and the leakage of a visitor's IP address to a font or tag vendor without consent |
| Automated retention | Expired applications, CV files, consent records, audit entries and reset tokens are deleted on a schedule without anyone having to remember | Personal information being kept long after it stops being needed |
| Backups and restore testing | Database backups are taken on a schedule and the restore procedure is tested | Loss of availability, and a backup that turns out not to work when it is needed |
POPIA section 22 requires a responsible party to notify the Information Regulator — and, subject to the one exception in section 22(3), the affected data subjects — where there are reasonable grounds to believe that the personal information of a data subject has been accessed or acquired by any unauthorised person. The test is a reasonable belief that unauthorised access or acquisition has happened, not a finding that serious harm is likely: if the threshold in section 22 is met, we notify.
Section 22(2) requires the notification to be made as soon as reasonably possible after the discovery of the compromise, taking into account the legitimate needs of law enforcement and any measures reasonably necessary to determine the scope of the compromise and to restore the integrity of our information systems. Section 22(4) requires the notification to a data subject to be in writing, delivered by one of the listed routes — mail to the last known physical or postal address, email to the last known email address, a prominent notice on our website, publication in the news media, or as the Regulator directs. Section 22(5) requires the notification to contain enough information for the data subject to take protective measures: the possible consequences, the measures we have taken or intend to take, a recommendation on what the data subject should do, and the identity of the unauthorised person if we know it. The Regulator may also direct us to publicise a compromise (section 22(6)).
Section 22(3) allows us to delay notifying the data subject if a public body responsible for the prevention, detection or investigation of offences, or the Regulator, determines that notification would impede a criminal investigation. Notification to the Regulator is not delayed. The only other limit is practical: if the identity of the data subject cannot be established, we notify the Regulator and not the data subject.
Not only a hacker. A security compromise includes, for us:
Do not delay notification while the full picture is assembled. The Regulator's test is "as soon as reasonably possible", and section 22(2) expressly allows for the delay needed to determine the scope of the compromise and to restore the integrity of our systems — but no longer. A late notification is a failure in its own right. Do not tell affected data subjects before the assessment is complete enough to be accurate, and do not tell the media or the public — the data subjects come first, and the Regulator decides what is public.
POPIA section 11(3)(b) gives a data subject the right to object, at any time, to the processing of their personal information for direct marketing, and section 69 governs direct marketing by means of unsolicited electronic communications — the communications that count as "unsolicited" are listed in section 69(1) and the corresponding right to object is in section 69(3)(c). The ECTA requires an unsubscribe mechanism that is simple, immediate and effective.
The Platform is hosted with a service provider outside South Africa, and the email delivery provider processes messages outside South Africa. The regulatory consequence is that information is processed outside the Republic, and POPIA section 72 governs transfers of personal information outside the Republic: a transfer may only take place if the conditions in section 72 are met, which in turn require the level of protection to be no less than the level of protection in South Africa.
What we do about it:
POPIA section 14 requires a responsible party to keep personal information only for as long as it is needed for the purpose for which it was collected, and section 24(1)(b) gives a data subject the right to have a record destroyed or deleted where the responsible party is no longer authorised to retain it. The schedule below is the one the platform enforces automatically where it can, so that retention does not depend on anybody remembering.
| Record | Retention | Trigger | How it is disposed of |
|---|---|---|---|
| Job applications and the CVs attached to them | 24 months | Date applied | Automatically, by the daily retention sweep: the database rows and the CV files are both deleted |
| Consent ledger records | 5 years | Date the record was created | Automatically, by the same sweep |
| Administrative activity log | 24 months | Date the action was logged | Automatically, by the same sweep |
| Password reset tokens | 1 hour of expiry; the row is removed after 7 days | Expiry, then age | Automatically; the token is also deleted the moment it is used |
| Seeker and employer accounts | The life of the account | Account closure | On deletion, see below |
| Profile CV and profile photo | The life of the account | Account closure | Deleted with the account |
| Saved jobs | The life of the account | Account closure | Deleted with the account |
| Live job listings | While the vacancy is live, and for the statutory period after it closes | Closing date | Removal from the published listing, then archival deletion |
| Backups | On the backup schedule | Age | They expire on the rotation. Note that personal information inside a backup is not deleted early, because that would require restoring and rewriting every backup |
The account-deletion routine runs in a single transaction and removes, in one pass:
What is deliberately kept: a single audit entry recording that the account was deleted, the account id, and the date. It holds no name, no email address and no content. The consent records are deleted along with everything else, because a data subject's request to have their information deleted under section 24(1)(b) overrides the five-year evidential retention described at R-07; what we keep in its place is the redacted audit entry, which is enough to show that a deletion was requested and carried out, and by whom.
The Information Officer keeps this schedule. Each item is a task, an owner and a date, and the review is evidenced by a signed entry in the register kept for that purpose.
| Frequency | Task | Owner |
|---|---|---|
| Daily (automated) | Retention sweep: expired applications and CVs, consent records older than 5 years, activity log older than 24 months, reset tokens older than 7 days | Platform |
| Weekly | Check the failure and error logs for anything that looks like an attempt to pull CVs in bulk, and for repeated failures on the application and login endpoints | Operator |
| Monthly | Review the moderation queue for pending employer approvals, pending submissions, and listings that may be discriminatory | Operator |
| Monthly | Reconcile the newsletter list against the consent ledger, and remove any address that has no live consent | Operator |
| Quarterly | Review administrator accounts: who has access, whether it is still needed, and whether the access is attributable | Information Officer |
| Quarterly | Test the backup restore procedure and record the result | Operator |
| Half-yearly | Review the data subject rights log: what came in, what went out, what took too long, and what was refused and why | Information Officer |
| Half-yearly | Review the processing register against the code. Any new table, new field, new endpoint or new third-party script is a change to a processing activity and must be registered | Information Officer |
| Annually | Full review of this manual, the Privacy Notice, the Cookie Policy and the Terms. Confirm the Information Regulator's current directives have been read and complied with | Information Officer |
| Annually | Re-attest the security safeguards in section 8 — is each one still switched on, and does it still do what it says it does | Information Officer |
| Annually | Re-attest the service provider agreements, including the cross-border safeguards in section 11 | Information Officer |
| On any change | Update the register, the notices and this manual before the change goes live — never after | Information Officer |
These are the outstanding actions. Each must be closed before the first compliance review.
| Item | What is needed | Owner | Status |
|---|---|---|---|
| Legal entity details | Legal entity name, CIPC registration number, registered street address and VAT number, to replace the placeholders in this manual and in the three public notices | Operator | open |
| Information Officer | Name and role of the appointed Information Officer, to replace the placeholder | Operator | open |
| Installation file | The installation script must be removed from the public server once the database is in place | Operator | open |
| Database credentials | The database user must be given only the privileges the application needs, and the password must be rotated | Operator | open |
| Administrator password | Rotate the initial administrator password and confirm the reset procedure works end to end | Operator | open |
| Session invalidation on password change | Existing sessions must be invalidated when a password is changed, so that a stolen session cannot outlive the credential | Developer | open |
| Document retention of the statutory record after a vacancy closes | Confirm the period that applies to a closed vacancy's record and align the code to it | Information Officer | open |
| Operator agreements with the host and the email provider | Confirm in writing that the agreements carry the section 8 requirements and the section 11 transfer terms | Operator | open |
| Consent banner, talent directory toggle, application consent, account deletion, CV gating | Live verification on the production server that each control behaves as this manual describes | Developer | pending |
One row per incident, whether or not it turned out to be reportable. The fact that an entry exists is not an admission of breach; the fact that an entry is missing where one was needed is a problem.
| Field | What goes in it |
|---|---|
| Reference | BR-YYYY-NNN |
| Date and time detected | As precisely as known |
| Reported by, and to | Who found it and who was told |
| Nature of the compromise | Loss, unauthorised access, disclosure, alteration, or destruction |
| Systems and data affected | Tables, files and endpoints involved |
| Categories and number of data subjects | What kind of information, and how many people |
| Containment action and time | What was done first, and when |
| Encryption status | Whether the information was encrypted at rest and in transit |
| Risk assessment | Are there reasonable grounds to believe that personal information was accessed or acquired by an unauthorised person? That is the s.22 threshold. Also record the consequences, the number of data subjects, and the reasoning, not just the conclusion |
| Regulator notified | Y/N, date, time, and the reference number |
| Data subjects notified | Y/N, date, what they were told, and the route used (mail, email, website notice, news media, or as the Regulator directed) |
| Section 22(3) delay | Where notification to the data subject was delayed: the identity of the body or the Regulator that determined that notification would impede a criminal investigation, and the date of that determination |
| Root cause and remediation | What actually allowed it, and the fix |
| Lessons and control changes | What goes into the safeguards so it does not recur |
| Closed | Date and the Information Officer's sign-off |
Every change to this manual, to the three public notices, to the processing register, or to a technical control in section 8 is recorded here before it takes effect.
| Version | Date | Change | By |
|---|---|---|---|
| 1.0 | 21 October 2026 | First issue. Manual created alongside the rewritten Privacy Notice, Cookie Policy and Terms, and the implementation of the consent ledger, the talent directory opt-in, the application consent gate, the deletion cascade, the retention sweep and the administrative audit trail | Information Officer |
| — | — | Next review due: 21 October 2027 | — |
Read it against the code, not against the description of the code. Section 8 claims that a control exists; check that it does, because that is the whole purpose of the document. If a control in this manual is not true, the manual is the thing that is wrong — fix it before the Regulator, a data subject or a court finds it for you.