🔐 Owner Playbook · Directors only
How to run JLK Academy
Everything you need in one place — passwords, message templates, common tasks, and what to do when something breaks. Bookmark this page. Print it once a quarter as a paper backup.
1. 🔑 System keys & URLs
Every Apps Script and manager gate uses a different password. This is deliberate — if one leaks, only that pipeline is exposed.
🔑 HOW MANAGER ACCESS WORKS NOW
There is no master key to copy any more. Signing in with your own JLK-XXXX-XXXX code is what grants access — the Apps Scripts look you up in the staff registry and check you are active with a manager-tier role.
This page used to print the master key here with a copy button. That was a mistake: /staff/ is publicly fetchable, so anyone who knew the URL could read it and reach every backend. Removed 2026-09-23.
To revoke someone, set their row to inactive in the Staff Registry. Access stops within 5 minutes (the auth cache window). To grant access, give them a manager-tier role.
The 4 per-service keys below still work — useful if you want to give someone read-only access to just one dataset (e.g. an area manager who should see training records but not staff registry).
| System | Purpose | Per-service key | Google Sheet |
|---|---|---|---|
| Staff Registry | Who works here, what role, what code | MGR-REG-JLK-REGISTRY-9K2L7P |
JLK Staff Registry |
| Training Records | Course completions, sign-offs, CPD hours | MGR-MGR-JLK-4Q9K-2N7T-8XH9 |
JLK Training Records |
| Course Feedback | How staff rate each course | MGR-FB-JLK-COURSE-ME-9X4M3P |
JLK Course Feedback |
| Parent Survey | Parent & carer feedback responses | MGR-PARENT-JLK-SURVEY-ME-40V9K |
JLK Parent Feedback |
| QA Audits | Weekly L1 audits & safeguarding-RED alerts | MGR-QA-JLK-AUDITS-ME-6H8L2W |
JLK QA Audits |
Manager dashboard shortcuts
Where the raw sheets live: all 5 sheets are in the Google Drive of the account that deployed each script. Keep the sheets shared only with owners (Kim, Maxine, Rowan). Never make them "Anyone with link can view" — the Apps Script gate is the only intended reader.
2. 👋 Adding a new hire
From offer letter to fully-signed-in should take under 5 minutes.
- Open
staff-manage.html→ enter Registry manager key (top of section 1) - Scroll to Add new staff member. Fill: first name, last name, role, site. Email is optional. Start date is optional. Tour Excellence access:
Yesonly if they'll be leading tours. - Click Generate code →. A big green panel shows their unique
JLK-XXXX-XXXXcode. A copy is also emailed toAdmin@justlittlekidz.co.uk. - Copy the code, then send them the welcome message below with their code substituted in.
- They go to
justlittlekidz.co.uk/staff/welcome.html, enter first name + last name + code → they land on Induction automatically. - Watch your inbox — as they complete steps of Induction, "Notify manager" emails will come through with their progress.
Duplicate protection: if you accidentally add the same person twice (same name + same site), the registry returns the existing code rather than making a new one — so you can't create phantom accounts by mistake.
3. 💬 Message templates
Copy any block, replace the {{placeholders}}, send. Every template is designed to work in WhatsApp, SMS or email.
A. New hire — welcome + access code
B. Existing staff — role update / promotion
C. Access revoked — leaver
D. Refresher reminder — course expiring soon
E. Lost code — resend
4. 🛠️ Common tasks
Every task below is done via staff-manage.html unless noted.
Someone left the team
- Open Staff Registry
- Find their row (use the Site filter to narrow if needed)
- In the Status column, change
active→revoked - Change saves instantly (green flash). Their next page load will bounce them to welcome.html with a "revoked" banner.
- Send template C from section 3.
Someone was promoted
- Open Staff Registry
- Their Role column isn't directly editable from the table — instead, open the raw JLK Staff Registry Google Sheet and change the
rolecolumn value in their row (e.g.practitioner→room-leader) - Next time they log in, their tiered access flags refresh automatically — Leadership Academy becomes visible, etc.
- Send template B.
Grant a specific person extra access
Example: a Room Leader who genuinely needs to see Business Excellence courses without being promoted to Director.
- Open Staff Registry, find their row
- In the relevant column (Leadership / Business / Manager area) change the dropdown from
(role default)toForce allow - Saves instantly. They'll see the new academy on their next page load.
- To remove the override later, set it back to
(role default).
Their device was lost / stolen
- Immediately: Staff Registry → their row → Status →
revoked. Their code stops working within an hour on any device (background revalidate). - Add a NEW row for them with the SAME name — you'll get a fresh
JLK-XXXX-XXXXcode. (The registry auto-detects the duplicate name but only if the old row is stillactive; because we just revoked it, a new row is fine.) - Send template E with the new code.
- Optionally, in the raw sheet, add a note in the old row's
notescolumn: "Device lost 2026-07-XX, replaced by JLK-YYYY-ZZZZ".
Nudge someone who's stalled
- Open Training Records dashboard (uses the Training Records manager key from section 1)
- Look at the staff × courses grid — grey dashes are courses not started yet
- Check
last_seen_atin the Staff Registry — that's the last time their code hit the site. Anyone with a value >30 days old is probably not engaging. - Message them template D if they have specific expiring courses, or a personal check-in otherwise.
5. 🩹 Troubleshooting
Symptoms and their most likely causes. Try the first fix; escalate to Claude if it doesn't work.
Staff says: "That code didn't work"
- Check the Staff Registry — does the row exist? Status
active? - Ask them what first name they typed. The registry validates first name matches — a typo in "Aisha" vs "Ayesha" fails.
- Codes use 2-9 A-Z only (no 0, O, 1, I, L) — check they haven't mistyped a lookalike character.
- If none of the above: hard-refresh their welcome page (Ctrl+Shift+R) in case they hit a cached version.
Staff says: "My progress disappeared"
- Completions live in the Google Sheet (source of truth), not their device. Progress "disappears" usually means they cleared browser data.
- Open Training Records — confirm their rows are still there.
- Have them refresh Academy home — cpd-sync.js pulls their completions back from the sheet within a minute.
"REGISTRY_ENDPOINT not set" error on staff-manage.html
- Means the copy of staff-manage.html on IONOS is stale (uploaded before the /exec URL was pasted in).
- Fix: re-upload
staff/staff-manage.htmlfrom your project folder → hard-refresh in Chrome.
Certificate won't print landscape
- The page tells Chrome to use landscape, but Chrome sometimes ignores it.
- In the print dialog: Layout → Landscape, Margins → None, Scale → Default.
- If it still looks wrong, try Save as PDF instead of direct-to-printer — the PDF respects the page CSS.
Apps Script paste gives "Syntax error line 120" (or any line)
- Google Docs/IDE editors sometimes swap plain quotes for curly "smart quotes" during copy.
- Fix: open the
.gsfile in Notepad (not VS Code, not any other editor), Ctrl+A → Ctrl+C, then paste into Apps Script. Notepad strips formatting.
Google says "Sorry, the file you have requested does not exist"
- Usually a multi-account collision — Chrome is running as a different Google account than the one that owns the sheet.
- Fix: Chrome profile picture top-right → Sign out of all accounts → sign back in with only
learnangrowrich@gmail.com.
6. 🔄 Rotating keys (once a year, or immediately if a key leaks)
Each Apps Script has its manager key hardcoded. Rotation = edit the script + redeploy. Takes 5 minutes per script.
- Pick a new key:
MGR-{SYSTEM}-JLK-{RANDOM}-{DATE}, e.g.MGR-REG-JLK-8K3P9Q-2027. Just make it long and hard to guess. - Open the affected Google Sheet → Extensions → Apps Script
- Find the
var MANAGER_KEY = '...'line near the top → replace with the new key → Ctrl+S - Deploy → Manage deployments → Edit the existing deployment → New version → Deploy. Keeps the same /exec URL.
- Update this playbook page (section 1) with the new key
- Test by hitting the /exec URL in a browser with
?key=NEW_KEY— should return{"ok":true,...}
You don't need to notify staff. Only owners use manager keys — staff use their JLK-XXXX-XXXX codes which are unaffected.
7. 🚀 Deploying a new Apps Script (the standard flow)
Every JLK backend service follows the same shape. Use this as a checklist.
- Create a new Google Sheet with a descriptive name (e.g. "JLK Room Observations"). Keep it private.
- Extensions → Apps Script. A new project opens.
- Open the
.gsfile in Notepad from your project folder - Ctrl+A → Ctrl+C in Notepad
- Back in Apps Script: Ctrl+A → Delete → Ctrl+V → Ctrl+S
- Edit
MANAGER_KEYnear the top to something new + strong - Run
setupSheet(or whichever setup function the script has) from the function dropdown → grant OAuth (Review permissions → Advanced → Go to project → Allow) - Deploy → New deployment → Web app → Execute as: Me → Who has access: Anyone → Deploy
- Copy the /exec URL
- Paste the URL into whichever staff-portal HTML files need it (see the script's header comment for the exact filenames)
- Upload those HTML files to IONOS → hard-refresh
- Test: hit the /exec URL directly with your manager key as a query param — should return valid JSON
- Add the new key to section 1 of this playbook
8. ⏰ Automation triggers (set once, run daily)
Two automated jobs run daily inside the JLK Training Records Apps Script. Both need to be scheduled as time-based triggers ONCE. After that they run silently every morning.
The two jobs
sendReflectionReminders— emails every staff member 28 days after they completed a course, asking how it has shown up in their practice. Only emails once per completion.sendRenewalReminders— emails staff 60 / 30 / 7 days before a course expires. Escalates to manager at day −7 and to owner at day +1 (overdue). Only emails once per threshold per completion.
Set them up (do this ONCE, ~2 minutes)
- Open the JLK Training Records Google Sheet → Extensions → Apps Script
- Left sidebar → Triggers (clock icon)
- Bottom-right → + Add Trigger
- Choose which function to run:
sendReflectionReminders - Choose which deployment should run: Head
- Select event source: Time-driven
- Select type of time-based trigger: Day timer
- Select time of day: 7am to 8am
- Save
- Choose which function to run:
- Repeat step 3 for the second function:
sendRenewalReminders(also Day timer, 7am–8am) - Both triggers should now show in the trigger list. They will fire once per day tomorrow morning and every morning thereafter.
Note: the sheet needs the newer schema columns (staff_email, reflection_28d, reflection_reminder_sent_at, renewal_60d_sent_at, etc.) for these triggers to work. Re-run setupSheet once from the Apps Script editor after pasting the updated apps-script-training-records.gs — it idempotently adds any missing columns.
9. 📱 PWA — the Academy as a real app on staff phones
The JLK Academy is now a Progressive Web App. Staff can add it to their phone home screen and it opens like a native app.
Staff instructions (share these when sending codes)
- iPhone / iPad: open
justlittlekidz.co.uk/staff/welcome.htmlin Safari → tap the Share icon (square with an up arrow) → Add to Home Screen → Add. - Android: open the same URL in Chrome → tap the ⋮ menu → Add to Home Screen or Install app.
Once added, tapping the JLK Academy icon opens the portal in full-screen (no browser chrome), and cached pages work offline. The icon uses the JLK Academy emblem.
Files that make this work
staff/manifest.json— app metadata (name, icon, colors, shortcuts)staff/sw.js— service worker (caching + offline)- Both auto-injected on every staff page via
staff/access.js
When you change core files (styles.css, main scripts): open staff/sw.js and bump the CACHE_VERSION constant at the top (e.g. jlk-academy-v1-2026-07-09 → v2-2026-07-15). Otherwise cached versions on staff phones persist for weeks. This is the CSS cache-buster equivalent for the PWA layer.
10. 💚 What's new for staff (2026-07-09 batch)
Recent additions worth pointing to when onboarding a new hire or introducing existing staff to the Academy.
- 📱 Install to home screen — the Academy is now a proper phone app (see section 9)
- 💌 4-week reflection nudge — auto-email 28 days after completion asking how the course has shown up in practice. Staff reflects at
reflect.html. Stored on their training record. - ⏰ Renewal reminders — automatic emails at 60/30/7 days before a course expires. No more surprise lapses.
- 📄 Annual CPD summary at
my-cpd.html→ "Print your annual CPD summary" button → openscpd-summary.htmlfor that year → Print / Save as PDF. Portable for NDNA / Level 3 portfolio. - 📤 Certificate share — every certificate now has Save-as-image / Share / LinkedIn "Add licence" buttons.
- 🌐 Public "how JLK invests in staff" page at
justlittlekidz.co.uk/staff-development.html— recruitment + parent-trust asset. Link from careers page + parent-hub.