# INFOTICS platform audit: October 2026

This audit covers course content, SEO/AEO/GEO, UI/UX, and the new operations added in this release. Each finding links to the fix that shipped, or is listed under "Open items" for a decision.

## 1. Course content audit (checked against vendor exam pages, 1 Oct 2026)

| Course | Finding | Action taken |
|---|---|---|
| Microsoft Azure 2 in 1 | **AZ-500 retired 31 Aug 2026.** Its successor is **SC-500** (Cloud and AI Security Engineer). | Certification, exam code, description, FAQ and modules now cover SC-500, plus a new "AI workload security" lesson. A notice is shown on the page. |
| Windows Server Hybrid Administrator | **AZ-800 / AZ-801 retired 30 Sep 2026.** Replaced by the single exam **AZ-802**. | Course retargeted to AZ-802. FAQ explains the change. |
| Microsoft 365 Administration | **MS-102 retires 30 Nov 2026.** No successor has been confirmed yet. | Marked "Retiring soon" with a notice telling learners to book before the date. Review again in November. |
| CCNA | The 200-301 blueprint was refreshed on **3 Feb 2026** (same code). It adds AI/ML in network operations. | Notice added, plus a lesson on AI in network operations. |
| CCNP Enterprise | **ENCOR 350-401 v1.2** (19 Mar 2026). Wireless moved out of the core exam, and SD-WAN is now "Catalyst SD-WAN". | Removed the wireless design lesson and renamed SD-WAN. Notice added. |
| RHCSA | **EX200 is now based on RHEL 10.** | Notice added. The VDO lesson was updated to LVM-VDO (standalone VDO is removed in RHEL 10). |
| VMware VCF | VCF 9 administrator exam **2V0-17.25**. | Exam code set. |
| CISM | **New ISACA job practice from 3 Nov 2026.** | Notice added. |
| AWS Dual Certification | Sources disagree about SAA-C03 changes. | Marked **"Needs review"** and left the content unchanged. Check aws.amazon.com/certification before the next batch. |
| RHCE, OpenShift, AZ-104, AZ-400, ITIL 4, DevOps, VVF | No change found. | Marked verified on 1 Oct 2026. |

**Process change:** every course now records an exam status, a public exam notice, a "last checked" date and a review interval. **Admin → Academics → Content freshness** lists overdue reviews first, and admins get an email digest of stale courses every Monday (`infotics:ops`). Existing databases were patched by migration `2026_10_03_000002_refresh_exam_content` (catalogue courses only; fees and batches are untouched).

## 2. SEO / AEO / GEO audit

The crawler checked all 104 URLs in the sitemap plus the key pages. It looks at HTTP status, title length (20–60), meta description (70–165), exactly one H1, canonical, og:image, `lang`, valid JSON-LD and image alt text.

| Finding | Fix |
|---|---|
| Seven course titles and four exam titles were longer than 60 characters, so search engines cut them off. | New `CourseController::seoTitle()` puts the search term first and fits 60 characters, for example "CCNA Training (200-301) in Karachi & Online". Exam and job titles are also capped. |
| `/corporate` returned 404 (people type it, and old links use it). | 301 redirect to `/corporate-training`. |
| Hidden fees could leak through price sorting, the fee range, schema.org `Offer` and `llms.txt`. | All of them now respect the course pricing mode. Fee-on-request courses publish no price anywhere. |
| AI answer engines (AEO/GEO) had no freshness signals. | Course JSON-LD now has `dateModified`. The page shows "Exam outline checked {date}", and `llms.txt` lists the exam code and any exam update for each course. |

**Result after the fixes:** 0 issues on 104 URLs. Every page has a canonical, OG image, one H1 and valid JSON-LD. Course, FAQ, breadcrumb, organisation and credential schemas were already present.

**Recommended next steps (content, not code):**
1. Publish one article per exam change ("AZ-500 retired: what SC-500 means for you", "AZ-800/801 → AZ-802"). These are high-intent searches right now, and AI engines quote dated, specific pages.
2. Add a 40–60 word "direct answer" paragraph at the top of each article (AEO).
3. Collect Google reviews and show them with `AggregateRating` only once they are real. Never fabricate them.

## 3. UI/UX audit

A Playwright pass at 1440 px and 390 px covered admin, learner and public pages. It checked horizontal overflow, console errors and visual layout.

| Area | Finding | Fix |
|---|---|---|
| Certificate | Generic layout, with weak hierarchy and security cues. | Full redesign: navy credential band with gold foil and seal, guilloche security pattern, microtext border, evidence chips, skills, live QR and a **tamper-evident fingerprint** that is also shown on the verification page. |
| Badges | Flat hexagon, generic icon, truncated names. | Metal rim by level (bronze, silver, gold, platinum), exam code as the hero, kind pill, two-line ribbon. SVG and PNG versions match. |
| Invoice / quote / receipt | Clean but plain, and the totals were hard to scan. | Navy guilloche letterhead, light security watermark, and a **key-figures strip** at the top (total, balance, due date, status). Invoices mention online payment when it is available. |
| Course page | Learners had no way to get the details by email. | "Email me the full details" form: instant email, and a lead for counsellors. |
| Full batches | "Join waitlist" only went to the contact form. | Real waitlist with automatic 48-hour seat offers. |
| Student dashboard | Learners didn't know when to book the vendor exam. | An **Exam readiness** bar on each course. |
| Fee screen | The choice cards wrapped awkwardly. | 2×2 grid, one column on mobile. |

No horizontal overflow was found on any audited page at 390 px. The only console errors in the sandbox were Google Fonts certificate errors caused by the network proxy, which won't happen in production.

## 4. New workflows

### Enrolling without a published fee ("fee on request")
1. **Admin → Courses → Edit → Fee on website = Fee on request.** The price disappears from every public surface and the buttons say **Apply**.
2. The learner clicks **Apply** (they can add a note, such as "my company may sponsor"). The enrollment becomes *Pending · awaiting fee* and the seat is held. The learner gets an "Application received" email, and admissions gets an alert.
3. **Admin → Enrollments → Awaiting fee → Set fee.** Pick one:
   - **Single invoice**: fee minus discount is invoiced.
   - **Installment plan**: invoiced and split, with automatic reminders.
   - **Sponsored / scholarship**: recorded at full value with a 100% sponsorship, then activated.
   - **Free / waived**: activated straight away.

   Every choice is written to the immutable finance ledger.
4. From there it is the **normal money flow**. The invoice, receipts and statements show the agreed amount, but only to that learner, and online payment works. Access activates at the configured percentage paid.
5. Staff can also enrol someone directly with an agreed fee (the "Fee" field on Add learner or Lead → Enrol), or send the course details with a privately quoted fee.

### How receipts work when the fee is hidden
The fee is hidden only on **public** pages. Invoices, receipts, plans and statements are private documents for the learner, so they show the agreed amount as usual, with a QR verification code and an amount in words.

### Online payments (JazzCash, Easypaisa, PayFast)
The invoice page offers **Pay online now** (full balance or the next installment). The learner pays on the gateway's own page. The callback is verified (JazzCash HMAC-SHA256, PayFast validation hash, Easypaisa server-side inquiry) and checked against the amount, then applied once. That records the payment, numbers and emails the receipt, updates the balance and activates access. Setup steps and callback URLs are in **Admin → Integrations**.

### Video platforms
Zoom, Google Meet and Webex links are created automatically for meetings, workshops and batches once their API keys are set. A batch gets one recurring link that is copied onto every class. NetAcad, Teams and any other link can be pasted and are recognised, so learners see "Join on NetAcad". If an API call fails, the session is still saved and the admin sees a warning.

## 5. Practices most academies don't offer

| Practice | Where |
|---|---|
| Live exam-currency notices on course pages, plus a weekly content-freshness digest | Course page, Admin → Content freshness |
| Tamper-evident certificate fingerprint, checked live on the verification page | Certificate PDF, /credentials/verify |
| Exam-readiness score, so vouchers go to learners who are ready | Student dashboard, Admin → Exam vouchers (✓ ready) |
| Exam-voucher pool with masked codes and 30/14/3-day expiry reminders | Admin → Exam vouchers |
| Automatic waitlist seat offers with a 48-hour hold | Course page, `infotics:ops` |
| Fee on request, with personalised fees in the normal accounting flow | Courses, Enrollments → Awaiting fee |
| Trainer and course NPS from automatic feedback requests | Admin → Quality & NPS |
| One-click workshop registration from the portal, with calendar files and Join buttons that name the platform | Portal → Workshops & meetings |
| Drive, Docs, Slides and Loom files play inside the LMS | Learning materials |

## 6. Open items (your decision or credentials needed)

1. **Payment gateways:** sign merchant agreements, add the keys to `.env`, run one sandbox payment each, then set `*_MODE=live`.
2. **Zoom / Google Workspace / Webex:** create the API apps (see Admin → Integrations) and add the keys.
3. **Signatures:** set the signatory names and signature text in Admin → Settings so certificates show real signatures. We never generate them.
4. **MS-102 successor:** update the course when Microsoft publishes it (review due in November 2026).
5. **AWS Dual Certification:** confirm the current associate exam codes.
6. **Official logo:** upload it in Admin → Settings if the designed logo should be replaced.
7. **Pricing mode per course:** decide which courses should use "Fee on request". In the local demo, CISM is set that way to show the flow.
