Back to the build library
Education & training
Standard

Certification Renewal Reminders

Every credential gets an expiry clock, a staged reminder ladder and a requirements checklist, so renewals land before the certificate lapses.

Industry
Education & training
Build effort
Standard
Typical time to launch
2–3 weeks
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

A certification is a dated asset that nobody is watching. The holder got their certificate two years ago, filed it, and has not thought about it since. The training provider issued it, invoiced it, and moved the record into a spreadsheet that one person maintains. The expiry date sits in both places and triggers nothing in either. Then one of two things happens: the holder discovers they are out of ticket on the morning of a job, or an auditor discovers it for them.

Renewal is the most predictable revenue a training provider has and the most commonly lost. The customer already knows the brand, already passed once, and has a legal or contractual obligation to renew. You do not need to sell anything. You need to be the one who reminds them first, because whoever reminds them first gets the booking. Providers routinely lose renewals not to a competitor's better offer but to a competitor's earlier email, or to the holder simply letting it slide until the requirement becomes urgent and they take the first available slot anywhere.

The leak compounds. A lapsed credential often cannot be renewed at all, only re-earned, which means the holder faces the full course instead of a short refresher, and a decision they would have made automatically becomes one they weigh against doing nothing. Continuing-education hours make it worse: a renewal that needs twelve logged hours is not a single transaction, it is a six-month tracking problem, and holders routinely arrive at the window with zero hours logged and no time left to earn them. Employer-funded renewals add a third failure mode, where the holder is willing, the provider is ready, and nobody chased the purchase order until after the expiry date.

02

What gets built

Pipeline and stages

One pipeline, Renewals. A credential enters when it is issued and only leaves when it is renewed or finally lapsed. Every holder sits on it permanently, which is the whole point: this is a standing asset register, not a campaign list.

  • Credential Active - issued, not yet inside the renewal window. The resting state.
  • Window Open - inside the reminder window, first notification sent.
  • Requirements Outstanding - the holder is engaged but continuing-education hours, a declaration or an assessment is missing.
  • Refresher Booked - a seat on a refresher course or an assessment slot is confirmed.
  • Awaiting Payment - booked, invoice or purchase order outstanding.
  • Awaiting Employer Authorization - a separate stage, because the blocker is a third party and the chase is a different conversation.
  • Renewed - new certificate issued, new expiry written, clock reset.
  • Grace Period - expired but still inside the awarding body's grace window.
  • Lapsed - past grace, renewal no longer possible without reinstatement or a full re-sit.
  • Reinstatement - working back from lapsed.
  • Closed - Left Sector - no longer needs the credential. The honest end state, and worth separating so it does not pollute the lapse rate.

Calendars

  • Refresher Course - a class-style calendar with fixed dated sessions and a seat cap per session, so the reminder ladder can offer real dates rather than a vague invitation.
  • Assessment Slot - 45 min - round robin across assessors, with a hard cut-off so nobody books an assessment after their expiry date.
  • Renewal Advice Call - 15 min - for holders who do not know what they need. Held by the renewals coordinator.
  • Employer Renewal Review - 30 min - for accounts with several holders expiring in the same quarter.

Custom fields

If a holder carries more than one credential, model each credential as its own opportunity on the pipeline and keep the credential fields on the opportunity rather than the contact. Flattening two credentials onto one contact record is the single most common way this build breaks.

  • Credential: credential_name, credential_code, credential_number, issue_date, expiry_date, renewal_cycle_months, awarding_body, days_to_expiry, renewal_window_opens_date, grace_period_days, grace_period_end_date.
  • Requirements: cpd_hours_required, cpd_hours_logged, cpd_hours_outstanding, assessment_required, assessment_booked_date, assessment_result, declaration_signed, evidence_uploaded, requirements_complete.
  • Commercial: employer_pays, employer_name, employer_contact_name, employer_contact_email, purchase_order_number, invoice_status, payment_received_date.
  • History: renewal_count, last_renewal_date, renewal_notified_dates, preferred_channel, lapse_reason, reinstatement_route.

Tags

  • State: credential-holder, cred-[credential_code], window-open, renewed, grace-period, lapsed.
  • Ladder position: notified-t120, notified-t90, notified-t60, notified-t30, notified-t14, notified-t7, notified-t1, notified-expired. One tag per rung so you can see exactly where a holder stopped responding.
  • Blockers: cpd-outstanding, assessment-due, declaration-missing, payment-pending, po-pending.
  • Commercial: employer-funded, self-funded, multi-credential, key-account.
  • Suppression: sms-opt-out, email-opt-out, left-sector, do-not-chase.

Forms and surveys

  • Credential Details Confirmation - sent once at the start of the window. Asks the holder to confirm credential number, expiry date, employer and who pays. This is how you clean a bad legacy spreadsheet without a data project: let the holders correct their own records.
  • CPD Hours Log - self-service, repeatable. Activity name, date, hours, type, evidence upload. Each submission increments cpd_hours_logged and recalculates cpd_hours_outstanding.
  • Renewal Declaration - the awarding body's wording, captured as a form with a dated signature field. Sets declaration_signed.
  • Employer Authorization - sent to employer_contact_email. Captures approval, purchase order number and billing contact. Writes back to the holder's opportunity.
  • Lapse Reason - one question, sent after grace expires. Left the sector, moved provider, cost, forgot, no longer required, other. This is the most valuable survey in the build.

BO and the guardrails

  • BO may: tell a holder their expiry_date and days_to_expiry, state cpd_hours_outstanding, send the CPD Hours Log and declaration links, read out the next three available refresher dates and book a seat, send a payment link, send the employer authorization form to an address the holder supplies, and reissue a certificate copy.
  • BO may not: confirm that someone is compliant, interpret awarding-body or regulatory rules, waive a requirement, extend a grace period, accept continuing-education hours as valid, or discuss a refund. Each of those creates a task for the renewals coordinator.
  • BO must never state or imply that a lapsed holder may continue working, practising or operating. If a holder asks whether they can keep working past expiry, BO gives the expiry fact, declines the judgment, and escalates. Write this as an explicit prohibition, not a tone preference.
  • BO always quotes the stored expiry date as the stored expiry date, and offers the Credential Details Confirmation form if the holder disputes it. It never silently overwrites a credential date from a chat message.

Numbers and channels

  • One dedicated number for renewals, with the sender name consistent across the whole ladder so a holder recognizes the thread at T-7 as the same one from T-120.
  • Email as the primary channel for the long-horizon rungs and SMS only from T-30 inwards. Texting someone four months before an expiry date trains them to ignore you.
  • Employer messages go to a separate thread on the employer contact record, never into the holder's thread.
  • Quiet hours and business-day-only sending for every rung. A renewal reminder at 7am Sunday reads as spam.
  • Printed or PDF certificate delivery as a terminal channel, with the new expiry date on the face of it.
03

How it runs, step by step

One holder, from a quiet certificate to a renewed one.

  1. The credential is issued. Marcus passes his assessment. The issue workflow writes credential_code, credential_number, issue_date, renewal_cycle_months of 24, and calculates expiry_date and renewal_window_opens_date at 120 days before it. An opportunity is created in Credential Active and tagged credential-holder and cred-FLT3.
  2. Twenty-two months of silence. The nightly clock updates days_to_expiry every morning and does nothing else. No drip, no newsletter from this build. The record just sits there being correct.
  3. The window opens at T-120. The opportunity moves to Window Open, window-open and notified-t120 apply, and Marcus gets one email: his credential expires on a named date, here is what renewal requires, and here is the Credential Details Confirmation form.
  4. He corrects his own record. He submits the form, changes his employer to a new company, and ticks that his employer pays. employer_pays becomes yes, employer_name and employer_contact_email are written, and employer-funded is tagged. That one submission just saved a failed chase at T-14.
  5. The requirements gap is calculated. His credential needs 12 continuing-education hours. cpd_hours_logged is 0, so cpd_hours_outstanding is 12, cpd-outstanding applies, and the opportunity moves to Requirements Outstanding.
  6. T-90 lands with a specific ask. Not a reminder that renewal exists, which he already knows. An email saying he has 12 hours outstanding and 90 days to log them, with the CPD Hours Log link and the next three eligible short courses with dates.
  7. He logs some hours. Two submissions over six weeks take cpd_hours_logged to 7. cpd_hours_outstanding drops to 5. Each submission triggers a short confirmation naming the new running total, because a visible counter is what makes people finish.
  8. T-60 pushes the booking. The gap chase now offers the refresher course that covers the remaining 5 hours and closes the renewal in one sitting, with three real dates and a seat count. He books the one four weeks out. Stage moves to Refresher Booked, assessment-due applies.
  9. Payment is where it stalls. Because employer_pays is yes, the invoice routes to the employer, the opportunity moves to Awaiting Employer Authorization, and the Employer Authorization form goes to his training manager on a separate thread. po-pending applies.
  10. The employer chase runs without involving him. Two reminders to the employer at 3 and 7 days. On the second, Marcus gets one short copy-in so he knows it is his employer holding things up, not the provider. The purchase order arrives, purchase_order_number is written, and the stage moves to Awaiting Payment then clears.
  11. Course reminders fire. Seven days, two days and three hours before the session, with the venue or joining link, what to bring, and the reschedule link. Reschedule is offered deliberately: a rescheduled holder renews, a no-show often does not.
  12. He attends and passes. The assessor records assessment_result as pass. requirements_complete flips to yes.
  13. The clock resets itself. The renewal workflow writes a new issue_date, recalculates expiry_date 24 months out and renewal_window_opens_date 120 days before that, increments renewal_count, clears every notified- and blocker tag, issues the certificate PDF, and moves the opportunity back to Credential Active.
  14. The employer gets the summary. His training manager receives the certificate copy and a list of their other holders expiring in the next two quarters, which is how one renewal becomes a conversation about eleven.
04

Automations in detail

Eight workflows. Workflow 1 is the clock and must be built and tested against known dates before anything that sends a message is switched on.

1. Nightly Expiry Clock and Window Opener

Trigger: scheduled daily at 02:00, over every opportunity on the Renewals pipeline not in Renewed resting state conflict, meaning every record whose expiry_date is set.

Steps:

  1. Recalculate days_to_expiry as expiry_date minus today.
  2. Recalculate grace_period_end_date as expiry_date plus grace_period_days.
  3. Recalculate cpd_hours_outstanding as cpd_hours_required minus cpd_hours_logged, floored at 0.
  4. Set requirements_complete to yes only when cpd_hours_outstanding is 0, declaration_signed is yes, and either assessment_required is no or assessment_result is pass.
  5. If days_to_expiry equals 120 and the stage is Credential Active, move to Window Open, apply window-open, and start workflow 2.
  6. If days_to_expiry is below 0 and the stage is not Renewed, move to Grace Period and apply grace-period.
  7. If today is past grace_period_end_date, move to Lapsed, apply lapsed, remove grace-period, and hand to workflow 7.

Branches: skip any record tagged left-sector or do-not-chase entirely. Skip stage moves for records in Reinstatement, which is human-owned.

Stop conditions: no message is sent by this workflow. It writes fields and moves stages only. Keeping the clock and the messaging separate is what lets you re-run or backfill the clock safely.

2. Renewal Reminder Ladder

Trigger: stage moves to Window Open; then each rung is gated on the current days_to_expiry.

Conditions: every rung checks requirements_complete and the stage first. A holder already in Refresher Booked or Awaiting Payment skips the generic rungs and gets the booking or payment sequences instead. Never send a renewal reminder to someone who already booked.

Rungs in order:

  1. T-120, email. Subject: "Your [credential_name] expires on [expiry_date]". Body states the expiry date, lists the renewal requirements for this credential plainly, links the Credential Details Confirmation form, and ends with the next three refresher dates. Apply notified-t120.
  2. T-90, email. Branch on cpd_hours_outstanding. If above 0, the subject is "[n] hours still to log before [expiry_date]" and the body is the hours log plus eligible activities. If 0, the subject is "Ready to book your [credential_name] renewal" and the body is three dates and a booking button. Apply notified-t90.
  3. T-60, email plus first SMS. Email as above. SMS: "Hi [first name], your [credential_name] expires [expiry_date]. Renewal dates still open: [link]. Reply with a question any time." Apply notified-t60.
  4. T-30, email plus SMS, tone shifts. Name what happens if it lapses, factually and without threat: "After [grace_period_end_date] this credential can't be renewed, only re-taken in full." Apply notified-t30 and create a task for the renewals coordinator for anyone tagged key-account.
  5. T-14, SMS plus a call task. Every holder still unbooked at T-14 gets a human task, not just a message. SMS: "Hi [first name], two weeks until your [credential_name] expires and there are [n] seats left on [date]. Shall I hold one? [link]" Apply notified-t14.
  6. T-7, SMS. "Hi [first name], one week left on your [credential_name]. The last session before expiry is [date]: [link]. If you'd rather talk it through, call [number]." Apply notified-t7.
  7. T-1, SMS and email. Plain and short. State the expiry date, state that grace runs to grace_period_end_date, give the booking link. Apply notified-t1.

Stop conditions: any booking, sms-opt-out for the SMS legs, email-opt-out for the email legs, left-sector or do-not-chase at any point, or the stage reaching Renewed. If both channels are opted out, the ladder converts entirely into call tasks at T-60, T-30 and T-7.

3. Continuing-Education Gap Chase

Trigger: cpd_hours_outstanding above 0 while days_to_expiry is under 120, re-evaluated weekly rather than on a fixed calendar, because this is a progress problem not a date problem.

Steps:

  1. Apply cpd-outstanding, move to Requirements Outstanding.
  2. Every 14 days, send one email with the running counter in the subject: "[cpd_hours_logged] of [cpd_hours_required] hours logged". Body lists what has been logged, so the holder can see their own record and spot anything missing, then the log link and the eligible activities with dates.
  3. On every CPD Hours Log submission, send an immediate confirmation naming the new total and the remaining gap. "Logged: [activity], [hours] hours. You're at [cpd_hours_logged] of [cpd_hours_required]." This single message does most of the work in this workflow.
  4. When cpd_hours_outstanding reaches 0, remove cpd-outstanding, send "All [cpd_hours_required] hours are in" and immediately offer booking.
  5. If days_to_expiry falls under 45 with hours still outstanding, escalate: create a coordinator task, and send a message that names the exact arithmetic - how many hours, how many eligible sessions remain before expiry, and whether it is still achievable.
  6. If it is no longer arithmetically achievable, stop the chase entirely and task the coordinator to have an honest conversation about grace or re-sit. Continuing to send cheerful hour-logging reminders to someone who cannot make it is the fastest way to lose them permanently.

Stop conditions: cpd_hours_outstanding at 0, or stage Lapsed.

4. Booking, Reminders and No-show Recovery

Trigger: a booking on the Refresher Course or Assessment Slot calendar.

Steps:

  1. Move to Refresher Booked, write assessment_booked_date, suppress workflows 2 and 3 for this record.
  2. Immediate confirmation with date, time, location or joining link, what to bring, prerequisites, and the reschedule link.
  3. T-7 days: email with the same details plus any pre-work.
  4. T-2 days: SMS. "Hi [first name], your [credential_name] renewal session is [day] at [time], [location]. Bring [items]. Need to move it? [reschedule link]"
  5. T-3 hours: SMS with location or joining link only. Short.
  6. If marked attended and passed, hand to workflow 6.
  7. If marked no-show, apply no-show, and within 2 hours send: "Hi [first name], we missed you today. Your [credential_name] still expires [expiry_date] and the next sessions are [dates]. Let's get you rebooked: [link]" Create a coordinator task the same day.
  8. If no rebooking within 48 hours and days_to_expiry is under 30, escalate to a call task and, for employer-funded holders, notify the employer contact.
  9. If marked failed, do not automate anything beyond one neutral acknowledgement. Task the assessor to agree a re-sit. A failed assessment is never a sequence.

Stop conditions: pass recorded, or stage Lapsed.

5. Payment and Employer Authorization

Trigger: booking confirmed with payment outstanding.

Branch at the top on employer_pays.

Self-funded path:

  1. Move to Awaiting Payment, apply payment-pending, send the payment link immediately with the booking reference.
  2. Wait 3 days. If unpaid, one email reminder. Wait 4 more days, one SMS. Wait 3 more days, a coordinator task.
  3. If still unpaid 5 days before the session, send a clear notice that the seat will be released and offer a call. Then release the seat and return the record to Window Open so the ladder resumes.

Employer-funded path:

  1. Move to Awaiting Employer Authorization, apply po-pending, send the Employer Authorization form to employer_contact_email on the employer thread, listing the holder, credential, session date and what approval is needed.
  2. Wait 3 working days. Second request to the employer. Wait 4 working days. Third request, and copy the holder once: "Hi [first name], we're still waiting on approval from [employer_name] for your renewal seat on [date]. Might be worth a nudge from your side."
  3. On submission, write purchase_order_number and employer_contact_name, move to Awaiting Payment, and raise the invoice through the accounting integration.
  4. If no authorization 7 days before the session, task the account owner to call the employer directly and offer to move the holder to a later session rather than lose the renewal.

Stop conditions: payment received, or the record moving to Lapsed or Closed - Left Sector.

6. Renewal Completion and Clock Reset

Trigger: assessment_result set to pass with requirements_complete yes and payment received, or a coordinator manually moving the stage to Renewed.

Steps:

  1. Write the new issue_date as the completion date, recalculate expiry_date as issue date plus renewal_cycle_months, and recalculate renewal_window_opens_date.
  2. Increment renewal_count, write last_renewal_date, reset cpd_hours_logged to 0 and declaration_signed to no for the new cycle.
  3. Remove every notified- tag and every blocker tag. This matters: a stale notified-t7 will suppress a rung two years from now and nobody will know why.
  4. Generate the certificate PDF with the new credential_number and expiry_date, and email it with a one-line summary of the new cycle dates.
  5. Send SMS: "Renewed. Your [credential_name] is now valid to [expiry_date]. Certificate is in your email."
  6. Move the opportunity back to Credential Active.
  7. Wait 14 days, then send a single review request. A renewal just completed is the best moment to ask and the worst moment to waste.
  8. If employer_pays is yes, send the employer the certificate copy and hand to workflow 8.

Stop conditions: none. This workflow always completes.

7. Grace Period, Lapse and Reinstatement

Trigger: stage moves to Grace Period.

Steps:

  1. Day 1 of grace, email and SMS. Factual, no scolding: "Your [credential_name] expired on [expiry_date]. You can still renew until [grace_period_end_date] without re-taking the full course. Next available: [dates]."
  2. Wait 7 days, repeat with the remaining grace days named.
  3. At the midpoint of grace, create a coordinator call task for every record. This cohort has the highest recovery rate per call in the whole build.
  4. Three days before grace_period_end_date, final message stating plainly what changes after that date.
  5. On lapse, move to Lapsed, apply lapsed, stop all renewal messaging, and send one email with the Lapse Reason form and the reinstatement or re-sit route.
  6. Branch on the Lapse Reason answer. Left the sector: move to Closed - Left Sector, apply left-sector, suppress everything. Moved provider: one short message asking what would bring them back, then suppress. Cost: task the coordinator to discuss options on a call, never by automated message. Forgot: move to Reinstatement and send the full re-qualification route.
  7. At 90 days after lapse, one single win-back message naming the re-qualification route and the next three course dates. One message. Not a sequence, not a campaign.

Stop conditions: left-sector or do-not-chase, or renewal completed, which routes to workflow 6.

8. Employer Cohort Renewal Report

Trigger: scheduled monthly on the first working day, for every employer with two or more holders where employer_pays is yes.

Steps:

  1. Build a per-employer list of their holders with credential, expiry date, days to expiry and current stage.
  2. Email the employer contact a single summary: how many of their holders are current, how many expire in the next 90 days, how many are already in grace or lapsed, and a booking link for the Employer Renewal Review calendar.
  3. If the employer has three or more holders expiring in the same quarter, add an explicit offer to run a closed cohort session on a date of their choosing, and create a task for the account owner.
  4. If any of their holders is in Grace Period or Lapsed, flag it at the top of the email and create a priority account task. An employer discovering a lapsed holder from an auditor rather than from you is an account-ending event.
  5. Wait 5 working days. If the email is unopened, task the account owner to call.

Conditions: only credential status and dates go in this report. No continuing-education detail, no assessment results, no personal circumstances.

Stop conditions: employer contact opted out, or the account marked closed.

05

What changes

What is different afterwards

  • Expiry dates stop living in a spreadsheet one person maintains and start driving work on their own. Nobody has to remember to run the renewals report, because there is no renewals report.
  • The reminder ladder starts four months out instead of two weeks out, which is the difference between a planned renewal and a scramble. You become the first person to remind them, which in renewal is most of the competition.
  • Continuing-education hours become a visible running counter rather than a surprise at the window. Holders who can see a number finish it; holders who cannot, do not.
  • Employer-funded renewals get chased on a separate track with the employer, so the holder is never the messenger for their own purchase order and the provider never finds out at T-5 that approval was never requested.
  • Lapses are captured with a reason, so the lapse rate becomes diagnosable. Usually it splits into left the sector, which is fine, and forgot or too expensive, which are fixable in different ways.
  • The data cleans itself. The Credential Details Confirmation form at T-120 corrects employers, numbers and contact details across the whole base every cycle, without a data project.
  • Renewal revenue becomes forecastable. A list of credentials by expiry month is a pipeline forecast, which it never was while it sat in a spreadsheet.

Metrics to watch

  • Renewal rate - renewed divided by expiring in the period, with Closed - Left Sector excluded from the denominator so the number means something.
  • On-time renewal rate - renewed before expiry_date rather than in grace. This is the metric that shows the ladder is working, not just the recovery.
  • Median days before expiry at booking - should move steadily earlier each cycle. If it does not, the early rungs are not landing.
  • Rung attribution - which notified- tag was last applied when the holder converted. Tells you which rungs earn their place and which to delete.
  • Requirements completion curve - share of holders with cpd_hours_outstanding at 0 by T-60. The leading indicator for everything downstream.
  • Blocker distribution at expiry - of the holders who lapsed, what was outstanding. Hours, payment, purchase order or assessment. Each points at a different fix.
  • Employer authorization cycle time - days from authorization request to purchase order. If this exceeds the T-30 to T-0 window, the whole ladder has to start earlier for funded holders.
  • Grace period recovery rate - share of holders who renew after expiry but inside grace.
  • Lapse reason distribution - the counts from the Lapse Reason form, reviewed quarterly.
  • Reminder fatigue - unsubscribe and opt-out rate by rung. A rung with a high opt-out rate and low conversion should be removed.
  • Multi-credential coverage - holders with more than one credential where all are current. A good proxy for account health.
06

Before you start

Credential data, which decides whether this works

  • Get the existing credential register in one place and judge its quality honestly before building anything. Missing expiry dates, duplicate holders, dead email addresses and credentials recorded against a company rather than a person are all normal. The T-120 confirmation form is the repair mechanism, but you need a starting record to send it to.
  • Confirm the renewal rule per credential with the awarding body, in writing: cycle length, whether the window runs from expiry or from issue, how many continuing-education hours count, which activities qualify, whether a grace period exists and how long, and what happens after grace. Getting grace_period_days wrong by two weeks means telling people they are fine when they are not.
  • Decide the data model before you import. One opportunity per credential, not per holder. Holders with multiple credentials are the normal case in most sectors, and retrofitting this later means rebuilding every workflow.
  • Agree who owns the renewal clock as a role. The system does the work, but someone has to own threshold changes, awarding-body rule updates and the exception queue.

Integrations and provisioning

  • Certificate issuing or credential system, if one exists separately, with a read and write path so new expiry dates flow both ways. A one-way sync creates two divergent truths within a cycle.
  • Payments connection such as Stripe for self-funded renewals, and accounting such as QuickBooks or Xero for employer invoicing and purchase order matching.
  • Calendar connections for every assessor, plus a seat-capped class calendar for refresher sessions.
  • A dedicated renewals number, and a separate reply-to address for employer correspondence.
  • Document generation for the certificate PDF, with expiry_date and credential_number merged onto the face of it.
  • Connector such as Zapier or Make only where a direct integration does not exist, and keep the number of hops small - every hop is a place expiry dates go stale.

Messaging compliance

  • Complete A2P 10DLC brand and campaign registration before any SMS rung goes live. Register the campaign for the traffic you actually send: renewal reminders are informational notifications, but if you also use the same number for promotional offers on other courses, declare that, or you risk the whole number being filtered.
  • Be careful about consent age. A credential issued two years ago may carry consent captured on a form nobody can produce now. Re-permission the base before launch rather than assuming the original enrollment covers a renewal campaign two cycles later.
  • Keep transactional and marketing streams separate in both consent and sending. An expiry notification for a credential someone holds is a different thing from an offer for an unrelated course, and mixing them lets one unsubscribe suppress the notifications that keep people compliant.
  • Honor STOP, UNSTOP and HELP automatically, and make sms-opt-out suppress every rung. Keep the email rungs running when only SMS is opted out, and record preferred_channel so the ladder adapts rather than falling silent.
  • Quiet hours, business days only, and a hard cap of one message per holder per day across all workflows including the employer track.

Data protection and accuracy

  • Credential status is close to employment data and in many sectors it is effectively regulated professional information. Restrict who can see and edit credential_number and assessment_result, and keep an audit trail of every change to expiry_date.
  • Employer disclosure needs an explicit basis. Telling an employer that a named person's credential expires next month is a disclosure about that person. Where employer_pays is yes there is usually a clear basis for it, but capture the holder's acknowledgement at the confirmation step and keep employer reporting to credential status and dates only.
  • Never let an automated message assert compliance. The system reports stored dates and stored hours; it does not certify anyone. Phrase every message as a factual statement about the record, and keep the awarding body as the authority on validity.
  • Set a retention period for lapsed credential records and the evidence uploaded against continuing-education hours, and delete or anonymize on schedule.
  • Renewal obligations, grace periods, evidence requirements and the rules on disclosing credential status to employers all vary by sector, jurisdiction and awarding body, and some are statutory. Confirm the renewal rules, the declaration wording, the employer disclosure basis and the retention periods with the client's own counsel and their awarding body before launch. Nothing here is legal advice.
Field notes

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call