🔐 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.

🚨 This page contains manager passwords. Do NOT share the URL. Do NOT paste any manager key into WhatsApp, email or any channel that isn't just between the three of you. Rotate a key immediately if you suspect it has leaked (see Rotating Keys).
On this page:

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.

  1. Open staff-manage.html → enter Registry manager key (top of section 1)
  2. Scroll to Add new staff member. Fill: first name, last name, role, site. Email is optional. Start date is optional. Tour Excellence access: Yes only if they'll be leading tours.
  3. Click Generate code →. A big green panel shows their unique JLK-XXXX-XXXX code. A copy is also emailed to Admin@justlittlekidz.co.uk.
  4. Copy the code, then send them the welcome message below with their code substituted in.
  5. They go to justlittlekidz.co.uk/staff/welcome.html, enter first name + last name + code → they land on Induction automatically.
  6. 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

Hi {{first_name}} 👋 Welcome to Just Little Kidz! We're so glad to have you. Your JLK Academy access code is: {{JLK-XXXX-XXXX}} To get started: 1. Go to justlittlekidz.co.uk/staff/welcome.html 2. Enter your first name, last name, and the code above 3. You'll land on your Induction — everything you need for your first 90 days is there Take your time — most people work through Induction across their first 2-3 weeks. If you get stuck at any point, hit the "Notify manager" button on any step and one of us will jump in. See you Monday! Kim

B. Existing staff — role update / promotion

Hi {{first_name}} 🎉 Congratulations — you've been promoted to {{new_role}}. I've updated your JLK Academy record. Next time you log in you'll see new courses unlocked for your level ({{new_role_examples}}). Your existing progress, badges and CPD hours stay with you. Your access code doesn't change — same {{JLK-XXXX-XXXX}} as before. If anything looks off (missing courses, wrong site showing), just message me. Well done! Kim

C. Access revoked — leaver

Hi {{first_name}}, Thank you for your time at JLK. As of {{last_day}} your Academy access has been revoked and your access code {{JLK-XXXX-XXXX}} is no longer active. Any certificates you earned are yours — email us if you'd like PDF copies for your CPD file. Wishing you the best in what's next. Kim

D. Refresher reminder — course expiring soon

Hi {{first_name}}, Quick reminder — your {{course_title}} is due to expire on {{expiry_date}} ({{days_left}} days). Refresh takes about {{time_estimate}}. Log in at justlittlekidz.co.uk/staff/welcome.html and it'll be flagged amber at the top of your Training hub. Let me know if you need a hand. Kim

E. Lost code — resend

Hi {{first_name}}, Here's your JLK Academy access code again: {{JLK-XXXX-XXXX}} Save it somewhere — the notes app on your phone is fine. If you ever need it again, just message me and I'll resend. Kim

4. 🛠️ Common tasks

Every task below is done via staff-manage.html unless noted.

Someone left the team

  1. Open Staff Registry
  2. Find their row (use the Site filter to narrow if needed)
  3. In the Status column, change active → revoked
  4. Change saves instantly (green flash). Their next page load will bounce them to welcome.html with a "revoked" banner.
  5. Send template C from section 3.

Someone was promoted

  1. Open Staff Registry
  2. Their Role column isn't directly editable from the table — instead, open the raw JLK Staff Registry Google Sheet and change the role column value in their row (e.g. practitioner → room-leader)
  3. Next time they log in, their tiered access flags refresh automatically — Leadership Academy becomes visible, etc.
  4. 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.

  1. Open Staff Registry, find their row
  2. In the relevant column (Leadership / Business / Manager area) change the dropdown from (role default) to Force allow
  3. Saves instantly. They'll see the new academy on their next page load.
  4. To remove the override later, set it back to (role default).

Their device was lost / stolen

  1. Immediately: Staff Registry → their row → Status → revoked. Their code stops working within an hour on any device (background revalidate).
  2. Add a NEW row for them with the SAME name — you'll get a fresh JLK-XXXX-XXXX code. (The registry auto-detects the duplicate name but only if the old row is still active; because we just revoked it, a new row is fine.)
  3. Send template E with the new code.
  4. Optionally, in the raw sheet, add a note in the old row's notes column: "Device lost 2026-07-XX, replaced by JLK-YYYY-ZZZZ".

Nudge someone who's stalled

  1. Open Training Records dashboard (uses the Training Records manager key from section 1)
  2. Look at the staff × courses grid — grey dashes are courses not started yet
  3. Check last_seen_at in the Staff Registry — that's the last time their code hit the site. Anyone with a value >30 days old is probably not engaging.
  4. 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"

Staff says: "My progress disappeared"

"REGISTRY_ENDPOINT not set" error on staff-manage.html

Certificate won't print landscape

Apps Script paste gives "Syntax error line 120" (or any line)

Google says "Sorry, the file you have requested does not exist"

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.

  1. Pick a new key: MGR-{SYSTEM}-JLK-{RANDOM}-{DATE}, e.g. MGR-REG-JLK-8K3P9Q-2027. Just make it long and hard to guess.
  2. Open the affected Google Sheet → Extensions → Apps Script
  3. Find the var MANAGER_KEY = '...' line near the top → replace with the new key → Ctrl+S
  4. Deploy → Manage deployments → Edit the existing deployment → New version → Deploy. Keeps the same /exec URL.
  5. Update this playbook page (section 1) with the new key
  6. 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.

  1. Create a new Google Sheet with a descriptive name (e.g. "JLK Room Observations"). Keep it private.
  2. Extensions → Apps Script. A new project opens.
  3. Open the .gs file in Notepad from your project folder
  4. Ctrl+A → Ctrl+C in Notepad
  5. Back in Apps Script: Ctrl+A → Delete → Ctrl+V → Ctrl+S
  6. Edit MANAGER_KEY near the top to something new + strong
  7. Run setupSheet (or whichever setup function the script has) from the function dropdown → grant OAuth (Review permissions → Advanced → Go to project → Allow)
  8. Deploy → New deployment → Web app → Execute as: Me → Who has access: Anyone → Deploy
  9. Copy the /exec URL
  10. Paste the URL into whichever staff-portal HTML files need it (see the script's header comment for the exact filenames)
  11. Upload those HTML files to IONOS → hard-refresh
  12. Test: hit the /exec URL directly with your manager key as a query param — should return valid JSON
  13. 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

Set them up (do this ONCE, ~2 minutes)

  1. Open the JLK Training Records Google Sheet → Extensions → Apps Script
  2. Left sidebar → Triggers (clock icon)
  3. 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
  4. Repeat step 3 for the second function: sendRenewalReminders (also Day timer, 7am–8am)
  5. 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)

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

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.