EETC Notifications

Pearson VUEPearson 📌 NTN
--:-- -- --- --, ---- PT
📅 At a Glance
Loading...

👁 Preview Email Templates

Sends both evening-before and day-of previews to eetestingcenter@gmail.com — no real candidates notified.

📋 Staff Address Book

🔑 Password

Data Sync
🔄 Run Nightly Sync
Scrapes Pearson portal and generates candidate artifact
Past Exams
📅 Exam Day Viewer
View candidate roster for any past day
position: sticky; top: 0; z-index: 100; } .header-left { display: flex; align-items: center; gap: 12px; } header h1 { font-family: 'DM Serif Display', serif; font-size: 18px; font-weight: 400; } .badge { background: #0b8043; color: white; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 12px; letter-spacing: 0.05em; text-transform: uppercase; } .clock { font-size: 13px; color: rgba(255,255,255,0.7); white-space: nowrap; text-align: right; line-height: 1.4; } .clock strong { color: white; font-size: 15px; display: block; } main { max-width: 740px; margin: 0 auto; padding: 24px 16px 60px; } .glance-card, .token-card, .wf-card, .history-card, .ab-card, .preview-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 18px 20px; margin-bottom: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .glance-header, .section-label, .token-card h2 { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin-bottom: 6px; } .glance-date, .wf-title, .ab-card h2, .history-card h2, .preview-card h2 { font-family: 'DM Serif Display', serif; font-size: 17px; font-weight: 400; } .glance-pills { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; } .glance-pill { display: inline-flex; align-items: center; gap: 5px; padding: 4px 12px; border-radius: 20px; font-size: 13px; font-weight: 600; } .glance-pill.pearson { background: #e6f4ea; color: #0b8043; } .glance-pill.ntn { background: #eeeeee; color: #616161; } .glance-table, .candidate-table { width: 100%; border-collapse: collapse; font-size: 13px; margin-bottom: 16px; } .glance-table th, .candidate-table th { text-align: left; padding: 6px 10px; background: #f5f3f9; color: var(--muted); font-size: 11px; text-transform: uppercase; border-bottom: 1px solid var(--border); } .glance-table td, .candidate-table td { padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; } .glance-table tr.clickable { cursor: pointer; } .glance-table tr.clickable:hover td { background: #f0f7ff; } .status-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; } .status-dot.expected { background: var(--muted); } .status-dot.checked_in { background: var(--green); } .status-dot.departed { background: #616161; } .status-dot.no_show { background: var(--red); } .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 1000; display: none; align-items: center; justify-content: center; padding: 16px; } .modal-overlay.visible { display: flex; } .modal { background: var(--card); border-radius: 14px; padding: 24px; max-width: 480px; width: 100%; box-shadow: 0 8px 32px rgba(0,0,0,0.2); max-height: 90vh; overflow-y: auto; } .modal-input, .modal-select { width: 100%; border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; font-size: 13px; background: #faf9fc; outline: none; margin-bottom: 8px; } .btn-trigger, .modal-save { width: 100%; padding: 12px; background: var(--accent); color: white; border: none; border-radius: 8px; font-weight: 600; cursor: pointer; margin-top: 16px; } .status-msg { padding: 9px 13px; border-radius: 7px; font-size: 13px; margin-top: 10px; display: none; } .status-msg.loading { background: var(--yellow-bg); color: var(--yellow); display: block; } .status-msg.success { background: var(--green-bg); color: var(--green); display: block; } .status-msg.error { background: var(--red-bg); color: var(--red); display: block; }

EETC Notifications

Pearson VUE
--:-- -- --- --, ---- PT
📅 At a Glance
Loading...
Workflow Triggers
🌙 Evening-Before Notification
Past Exams
📅 Exam Day Viewer
z-index: 100; } .header-left { display: flex; align-items: center; gap: 12px; } header h1 { font-family: 'DM Serif Display', serif; font-size: 18px; font-weight: 400; } .badge { background: #0b8043; color: white; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 12px; letter-spacing: 0.05em; text-transform: uppercase; } .badge-full { display: inline; } .badge-short { display: none; } @media (max-width: 480px) { .badge-full { display: none; } .badge-short { display: inline; } } .clock { font-size: 13px; color: rgba(255,255,255,0.7); white-space: nowrap; text-align: right; line-height: 1.4; } .clock strong { color: white; font-size: 15px; display: block; } .clock-date-short { display: none; } @media (max-width: 600px) { header { padding: 10px 12px; align-items: flex-start; } .header-left { gap: 6px; flex-wrap: wrap; align-items: center; } header h1 { font-size: 14px; } .clock { font-size: 11px; line-height: 1.3; } .clock strong { font-size: 12px; } .clock-date-full { display: none; } .clock-date-short { display: inline; } .badge { font-size: 10px; padding: 2px 6px; } #dash-version { font-size: 10px; color: rgba(255,255,255,0.45); } .badge-full { display: none; } .badge-short { display: inline; } } main { max-width: 740px; margin: 0 auto; padding: 24px 16px 60px; } /* Token */ .token-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 18px 20px; margin-bottom: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .token-card h2 { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin-bottom: 10px; } .token-row { display: flex; gap: 10px; align-items: center; } .token-row input { flex: 1; border: 1px solid var(--border); border-radius: 8px; padding: 9px 12px; font-family: 'DM Sans', sans-serif; font-size: 14px; color: var(--text); background: #faf9fc; outline: none; } .token-row input:focus { border-color: var(--accent); } .btn-sm { background: var(--dark); color: white; border: none; border-radius: 8px; padding: 9px 16px; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap; } .btn-sm:hover { background: #2d2d4e; } .token-status { font-size: 12px; margin-top: 6px; min-height: 16px; } .token-status.ok { color: var(--green); } .token-status.err { color: var(--red); } .section-label { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: 10px; margin-top: 4px; } /* Workflow cards */ .wf-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .wf-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 12px; } .wf-title { font-family: 'DM Serif Display', serif; font-size: 17px; font-weight: 400; } .wf-subtitle { font-size: 13px; color: var(--muted); margin-top: 2px; } .toggle-row { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); flex-shrink: 0; } .toggle-switch { position: relative; display: inline-block; width: 36px; height: 20px; cursor: pointer; } .toggle-switch input { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: #ef5350; border-radius: 20px; transition: 0.2s; } .toggle-slider:before { position: absolute; content: ''; height: 14px; width: 14px; left: 3px; bottom: 3px; background: white; border-radius: 50%; transition: 0.2s; } .toggle-switch input:checked + .toggle-slider { background: #43a047; } .toggle-switch input:checked + .toggle-slider:before { transform: translateX(16px); } .toggle-dot { width: 9px; height: 9px; border-radius: 50%; background: #ccc; } .toggle-dot.on { background: #43a047; } .toggle-dot.off { background: #ef5350; } .wf-meta { font-size: 12px; color: var(--muted); background: #f9f7fc; border-radius: 6px; padding: 7px 12px; margin-bottom: 12px; border: 1px solid var(--border); } .wf-meta span { margin-right: 14px; } .options-row { display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap; } .check-label { display: flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; } .check-label input[type=checkbox] { accent-color: var(--accent); width: 15px; height: 15px; } .btn-trigger { width: 100%; padding: 12px; background: var(--accent); color: white; border: none; border-radius: 8px; font-family: 'DM Sans', sans-serif; font-size: 14px; font-weight: 600; cursor: pointer; transition: background 0.15s; } .btn-trigger:hover { background: var(--accent-dark); } .btn-trigger:disabled { background: #ccc; cursor: not-allowed; } .btn-sync { background: var(--dark); } .btn-sync:hover { background: #2d2d4e; } .status-area { margin-top: 10px; min-height: 18px; } .status-msg { padding: 9px 13px; border-radius: 7px; font-size: 13px; display: none; } .status-msg.loading { background: var(--yellow-bg); color: var(--yellow); border: 1px solid #f9a825; display: block; } .status-msg.success { background: var(--green-bg); color: var(--green); border: 1px solid #a5d6a7; display: block; } .status-msg.error { background: var(--red-bg); color: var(--red); border: 1px solid #ef9a9a; display: block; } /* Candidate panel */ .candidate-panel { margin-top: 14px; display: none; } .candidate-panel.visible { display: block; } .candidate-panel h4 { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin-bottom: 8px; } .candidate-table { width: 100%; border-collapse: collapse; font-size: 13px; } .candidate-table th { text-align: left; padding: 6px 10px; background: #f5f3f9; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); } .candidate-table td { padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; word-break: break-word; max-width: 160px; } .candidate-table tr:last-child td { border-bottom: none; } .candidate-table tr:hover td { background: #faf9fc; } .no-candidates { font-size: 13px; color: var(--muted); padding: 8px 0; } /* Past Exams table */ .past-exam-table { width: 100%; border-collapse: collapse; font-size: 13px; } .past-exam-table th { text-align: left; padding: 6px 10px; background: #f5f3f9; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); } .past-exam-table td { padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; word-break: break-word; } .past-exam-table tr:last-child td { border-bottom: none; } .past-exam-table tr:hover td { background: #faf9fc; } .past-exam-table .col-time { width: 110px; white-space: nowrap; } .past-exam-table .col-name { min-width: 160px; } .past-exam-table .col-exam { } .past-exam-table .col-locker { width: 44px; text-align: center; white-space: nowrap; } .past-exam-table .col-station { width: 44px; text-align: center; white-space: nowrap; } .past-exam-table .col-key { width: 36px; text-align: center; } /* History */ .history-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .history-card h2 { font-family: 'DM Serif Display', serif; font-size: 17px; font-weight: 400; margin-bottom: 12px; } .run-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 13px; } .run-row:last-child { border-bottom: none; } .run-info { flex: 1; } .run-name { font-weight: 500; } .run-meta { color: var(--muted); font-size: 12px; } .run-conclusion { font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 10px; text-transform: uppercase; letter-spacing: 0.04em; white-space: nowrap; } .run-conclusion.success { background: var(--green-bg); color: var(--green); } .run-conclusion.failure { background: var(--red-bg); color: var(--red); } .run-conclusion.in_progress, .run-conclusion.queued { background: var(--yellow-bg); color: var(--yellow); } .history-placeholder { color: var(--muted); font-size: 13px; } .refresh-btn { width: 100%; margin-top: 12px; } .last-run { font-size: 12px; color: var(--muted); margin-top: 6px; min-height: 16px; } .last-run .ok { color: var(--green); font-weight: 600; } .last-run .err { color: var(--red); font-weight: 600; } .cc-row { margin-bottom: 10px; } .cc-row label { display: block; font-size: 12px; font-weight: 600; color: var(--muted); margin-bottom: 5px; text-transform: uppercase; letter-spacing: 0.05em; } .cc-row input[type=text] { width: 100%; border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px; font-family: 'DM Sans', sans-serif; font-size: 13px; color: var(--text); background: #faf9fc; outline: none; } .cc-row input[type=text]:focus { border-color: var(--accent); } /* Address book */ .ab-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .ab-card h2 { font-family: 'DM Serif Display', serif; font-size: 17px; font-weight: 400; margin-bottom: 14px; } .ab-contacts { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; } .ab-contact { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; border: 1px solid var(--border); background: #faf9fc; font-size: 13px; } .ab-contact input[type=checkbox] { accent-color: var(--accent); width: 15px; height: 15px; flex-shrink: 0; } .ab-contact .ab-info { flex: 1; } .ab-contact .ab-name { font-weight: 600; } .ab-contact .ab-email { color: var(--muted); font-size: 12px; } .ab-contact .ab-sponsor { font-size: 11px; color: var(--accent); background: var(--accent-light); border-radius: 8px; padding: 1px 6px; } .ab-contact .ab-delete { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 16px; padding: 0 4px; line-height: 1; } .ab-contact .ab-delete:hover { color: var(--red); } .ab-add { display: grid; grid-template-columns: 1fr 1fr auto auto; gap: 8px; align-items: end; } @media (max-width: 540px) { .ab-add { grid-template-columns: 1fr 1fr; } } .ab-add input, .ab-add select { border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; font-family: 'DM Sans', sans-serif; font-size: 13px; color: var(--text); background: #faf9fc; outline: none; width: 100%; } .ab-add input:focus, .ab-add select:focus { border-color: var(--accent); } .ab-add-btn { background: var(--accent); color: white; border: none; border-radius: 8px; padding: 8px 14px; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap; height: 36px; } .ab-add-btn:hover { background: var(--accent-dark); } /* Preview button */ .preview-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .preview-card h2 { font-family: 'DM Serif Display', serif; font-size: 17px; font-weight: 400; margin-bottom: 6px; } .preview-card p { font-size: 13px; color: var(--muted); margin-bottom: 14px; } /* Sync card accent border */ .sync-card { border-left: 3px solid var(--dark); } /* At a Glance */ .glance-card { background: var(--card); border-radius: 12px; border: 1px solid var(--border); padding: 18px 20px; margin-bottom: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } .glance-header { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin-bottom: 6px; } .glance-date { font-family: 'DM Serif Display', serif; font-size: 17px; margin-bottom: 12px; } .glance-pills { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; } .glance-pill { display: inline-flex; align-items: center; gap: 5px; padding: 4px 12px; border-radius: 20px; font-size: 13px; font-weight: 600; } .glance-pill.pearson { background: #e6f4ea; color: #0b8043; } .glance-pill.ntn { background: #eeeeee; color: #616161; } .glance-pill.none { background: #f5f3f9; color: var(--muted); } .glance-table { width: 100%; border-collapse: collapse; font-size: 13px; margin-bottom: 16px; } .glance-table th { text-align: left; padding: 6px 10px; background: #f5f3f9; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); } .glance-table td { padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; word-break: break-word; max-width: 120px; } .glance-table tr:last-child td { border-bottom: none; } .glance-table tr:hover td { background: #faf9fc; } .glance-source-label { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); margin: 10px 0 6px; } .glance-upcoming { border-top: 1px solid var(--border); padding-top: 12px; margin-top: 4px; } .glance-upcoming-title { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin-bottom: 8px; cursor: pointer; } .glance-upcoming-rows { display: none; } .glance-upcoming-rows.visible { display: block; } .glance-upcoming-row { display: flex; align-items: center; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 13px; } .glance-upcoming-row:last-child { border-bottom: none; } .glance-upcoming-date { color: var(--text); font-weight: 500; } .glance-upcoming-pills { display: flex; gap: 6px; } .token-saved { background: var(--green-bg); border: 1px solid #a5d6a7; border-radius: 12px; padding: 10px 16px; margin-bottom: 20px; display: none; align-items: center; justify-content: space-between; font-size: 13px; color: var(--green); } .token-saved.visible { display: flex; } .token-change { font-size: 12px; color: var(--muted); background: none; border: none; cursor: pointer; text-decoration: underline; } .token-change:hover { color: var(--text); } /* Check-in modal */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 1000; display: none; align-items: center; justify-content: center; padding: 16px; } .modal-overlay.visible { display: flex; } .modal { background: var(--card); border-radius: 14px; padding: 24px; max-width: 480px; width: 100%; box-shadow: 0 8px 32px rgba(0,0,0,0.2); max-height: 90vh; overflow-y: auto; } .modal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } .modal-title { font-family: 'DM Serif Display', serif; font-size: 18px; } .modal-close { background: none; border: none; font-size: 22px; cursor: pointer; color: var(--muted); padding: 0 4px; } .modal-close:hover { color: var(--text); } .modal-section { margin-bottom: 16px; } .modal-section-label { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); margin-bottom: 8px; } .status-btns { display: flex; gap: 8px; flex-wrap: wrap; } .status-btn { padding: 8px 14px; border-radius: 8px; border: 2px solid transparent; font-size: 13px; font-weight: 600; cursor: pointer; background: #f5f3f9; color: var(--text); } .status-btn.active.expected { background: #f5f3f9; border-color: var(--muted); color: var(--muted); } .status-btn.active.checked_in { background: var(--green-bg); border-color: var(--green); color: var(--green); } .status-btn.active.departed { background: var(--ntn-bg); border-color: var(--ntn); color: var(--ntn); } .status-btn.active.no_show { background: var(--red-bg); border-color: var(--red); color: var(--red); } .modal-select { width: 100%; border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; font-family: 'DM Sans', sans-serif; font-size: 13px; color: var(--text); background: #faf9fc; outline: none; margin-bottom: 8px; } .modal-select:focus { border-color: var(--accent); } .modal-input { width: 100%; border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; font-family: 'DM Sans', sans-serif; font-size: 13px; color: var(--text); background: #faf9fc; outline: none; resize: vertical; } .modal-input:focus { border-color: var(--accent); } .modal-toggle-row { display: flex; align-items: center; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid var(--border); } .modal-toggle-row:last-child { border-bottom: none; } .modal-toggle-label { font-size: 13px; } .modal-toggle-label.warn { color: var(--red); font-weight: 600; } .modal-save { width: 100%; padding: 12px; background: var(--accent); color: white; border: none; border-radius: 8px; font-family: 'DM Sans', sans-serif; font-size: 14px; font-weight: 600; cursor: pointer; margin-top: 16px; } .modal-save:hover { background: var(--accent-dark); } .ntn-reminder { background: var(--yellow-bg); border: 1px solid #f9a825; border-radius: 8px; padding: 10px 14px; margin-top: 12px; display: none; } .ntn-reminder.visible { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .ntn-reminder-text { font-size: 13px; color: var(--yellow); font-weight: 600; } .ntn-done-btn { background: var(--green); color: white; border: none; border-radius: 6px; padding: 6px 12px; font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap; } .ntn-done-btn:hover { background: var(--green-dark, #1b5e20); } .key-alert { background: var(--red-bg); border: 1px solid #ef9a9a; border-radius: 8px; padding: 10px 14px; font-size: 13px; color: var(--red); font-weight: 600; margin-bottom: 12px; display: none; } .key-alert.visible { display: block; } .repeat-badge { font-size: 11px; background: var(--yellow-bg); color: var(--yellow); border: 1px solid #f9a825; border-radius: 6px; padding: 1px 6px; margin-left: 6px; } /* Clickable candidate rows */ .glance-table tr.clickable { cursor: pointer; } .glance-table tr.clickable:hover td { background: #f0f7ff; } .status-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; } .status-dot.expected { background: var(--muted); } .status-dot.checked_in { background: var(--green); } .status-dot.departed { background: var(--ntn); } .status-dot.no_show { background: var(--red); } /* Collapsible cards */ .wf-card-body { transition: max-height 0.2s ease, opacity 0.2s ease; overflow: hidden; } .wf-card-body.collapsed { max-height: 0 !important; opacity: 0; pointer-events: none; } .collapse-btn { background: none; border: none; cursor: pointer; color: var(--muted); font-size: 16px; padding: 0 4px; line-height: 1; transition: transform 0.2s; } .collapse-btn.collapsed { transform: rotate(-90deg); } footer { text-align: center; padding: 20px; font-size: 12px; color: var(--muted); } footer a { color: var(--accent); text-decoration: none; }

EETC Notifications

Pearson VUEPearson 📌 NTN
--:-- -- --- --, ---- PT
📅 At a Glance
Loading...

👁 Preview Email Templates

Sends both evening-before and day-of previews to eetestingcenter@gmail.com — no real candidates notified.

📋 Staff Address Book

Check contacts to CC them on the workflow trigger. Saved to this browser.
🔑 Token saved

🔑 Password

Data Sync
🔄 Run Nightly Sync
Scrapes Pearson portal and generates candidate artifact — run this first before triggering notifications
⚙️ pearson_sync.yml 🕐 Auto: ~5 PM PT nightly
Workflow Triggers
🌙 Evening-Before Notification
Syncs Pearson schedule + sends BCC to tomorrow's candidates
⚙️ pearson_sync.yml 🕐 Auto: ~5 PM PT
✓ CC pulled from address book selections above.

Tomorrow's Candidates

☀️ Day-Of Reminder
Sends BCC reminder to today's candidates
⚙️ pearson_dayof_notify.yml 🕐 Auto: disabled (manual preferred)
✓ CC pulled from address book selections above.

Today's Candidates

📌 From D1 (today)

Loading…

📦 From Artifact (sync)
⚡ Evening Notify Only
Sends evening BCC using existing schedule.html — no Pearson login needed
⚙️ pearson_notify_only.yml 🕐 Manual only
✓ CC pulled from address book selections above.

Tomorrow's Candidates

Past Exams
📅 Exam Day Viewer
View candidate roster and check-in data for any past exam day
Recent Runs

Run History

Save your token to load history.