Site: schooloffreelancing.com · Date: August 9, 2026 · Pages sampled: homepage, /client-support/ (hub), /client-support/linux-server-services/, /freelancing-training/linux-freelancing-training/, /about-us/, /resource-center/voip-setup/ (full source), robots.txt
Method note: I fetched pages directly from the live site plus the full HTML source you uploaded for the VoIP guide. Fetched pages come back as cleaned text (script tags stripped), so I can confirm structure, meta tags, headings, and internal links sitewide, but I can only 100%-confirm the presence/absence of JSON-LD on the one page where I have raw source (the VoIP guide). Treat the schema findings for other page types as "not detected in what I could inspect" rather than a guaranteed negative — worth a 2-minute view-source check before you act on it.
| # | Priority | Finding | Fix |
|---|---|---|---|
| 1 | 🔴 High | Canonical domain mismatch. Homepage/hub/about pages self-canonicalize to https://schooloffreelancing.com/... (no www). But /client-support/linux-server-services/ — and likely the other ~20 individual service pages built from the same template — self-canonicalize to https://www.schooloffreelancing.com/... (with www), and its OG/Twitter image URLs also use the www host. |
Pick one canonical host (you're clearly standardizing on non-www everywhere else) and fix the service-page template's canonical/OG/Twitter URL generation. If www.schooloffreelancing.com doesn't 301 to the bare domain, add that redirect too. |
| 2 | 🔴 High | Internal link drift: /linux-ai-services/ vs /client-support/. The About Us page's nav and footer link to /linux-ai-services/... for every service link, while every other page (home, client-support hub, service pages) links to /client-support/.... /linux-ai-services/ does 301 to /client-support/, so it's not broken — but it's an unnecessary redirect hop on every nav click from that template, it dilutes internal link equity, and it signals the site templates are out of sync (probably a leftover from a URL migration). |
Update About Us's nav/footer partial to use /client-support/ directly, matching every other template. |
| 3 | 🟠 Medium | Template version drift. The footer badge reads "v1.3.4" on the live homepage/hub/service/about pages, but the VoIP guide file you had me edit locally read "v1.3.5". That's expected if it's a local build not yet deployed — but worth confirming nothing else changed between those versions before you push. | Diff v1.3.4 → v1.3.5 before deploying; confirm the nav-logo icon fix is included. |
| 4 | 🟠 Medium | robots.txt has a contradictory rule for ClaudeBot. The Cloudflare-managed block explicitly Disallows ClaudeBot, but a later custom block explicitly Allows it under "AI training crawlers." Parsers differ on which wins (most take the more specific or first match) — right now it's ambiguous whether ClaudeBot can crawl you at all. |
Remove the Disallow: / for ClaudeBot in the Cloudflare-managed section, or confirm intent and make it unambiguous. Your Content-Signal: ai-train=no already communicates "don't train on this" — that's a cleaner, less error-prone way to express the same preference. |
| 5 | 🟠 Medium | ~20 nearly-identical service pages (linux-server-services, ubuntu-linux-services, centos-linux-services, github-services, gitlab-services, etc.) share the same sentence skeleton ("Deploy production-grade... Our certified engineers/systems engineers deliver...", "24-hour dedicated post-installation... support", "$500 Flat Rate / 72 Engineering Hours / 3 Days" repeated verbatim on most). This is a duplicate/thin-content pattern that can dilute rankings for all of them and gives AI answer engines little differentiated material to cite. |
Not a rewrite-everything ask — but each page needs at least one genuinely unique section (a real troubleshooting scenario, a specific config snippet, a "what breaks and why" paragraph) so it isn't functionally the same page with the noun swapped. |
| 6 | 🟢 Low | Sitemap (/sitemap.xml) and a video sitemap are correctly declared in robots.txt — good. I couldn't text-inspect sitemap.xml's contents (returned as binary to my fetch tool), so I can't confirm all ~40+ URLs I saw linked in nav/footer are actually listed — worth a manual check in Search Console's sitemap report. |
Confirm sitemap coverage in Search Console. |
/resource-center/voip-setup/ (based on the full source you uploaded)
On-page elements
- Title tag: "How to Set Up Your Own VoIP Phone System | School of Freelancing" — good length, keyword-forward.
- Meta description present and accurately summarizes scope (FusionPBX/FreeSWITCH, extensions, IVR, routing, SIP trunking).
- Canonical is correctly self-referencing, non-www — consistent with the homepage (unlike the service-page template, see §1.1).
- Heading structure is clean and logical: single H1 → H2 section headers → H3 sub-steps. No skipped levels.
- Breadcrumb (
Home / Resource Center / How-To Guides) is present as plain text/links only — see schema §3.
Content quality
- Genuinely instructive, sequential, command-level detail (real
apt install,git clone, dialplan expressions) — this is exactly the kind of concrete, verifiable content that both ranks well and gets cited by AI answer engines. - No visible author byline, credential, or "last updated" date. You already have a named, credentialed founder (S K Chowdhury Masum, 11+ years Linux infra, VoIP/FusionPBX explicitly listed in his bio on About Us) — this guide doesn't connect to him at all right now.
- No internal links back to related service pages except the one FusionPBX training CTA at the end — the
/client-support/fusionpbx-voip-services/,/client-support/telnyx-sip-trunking-services/, and/client-support/twilio-sip-trunking-services/pages are natural, relevant link targets (this guide literally configures Telnyx and Twilio trunks) and none are linked. - Known template bug (from our earlier session): the Telnyx SMS API training page was rendering Twilio page content due to a shared-template issue. Worth re-verifying that's fully resolved before this guide goes live, since it links into that same section of the site.
Schema: none present. See §3.2 for exactly what to add.
Across everything I could inspect at the raw-HTML level (the VoIP guide) and everything visible in the rendered structure of the other pages, I did not find any JSON-LD or microdata — no Organization, Course, Service, FAQPage, BreadcrumbList, or Article/HowTo. Given the content already exists in exactly the shape these schema types expect (see below), this is the single highest-leverage gap on the site.
Ready-to-drop-in JSON-LD for the four page types that need it most. Adjust IDs/URLs/values to match your actual data before publishing.
A. Sitewide — EducationalOrganization (put in the global <head> or homepage only)
{
"@context": "https://schema.org",
"@type": "EducationalOrganization",
"name": "School of Freelancing",
"url": "https://schooloffreelancing.com",
"logo": "https://schooloffreelancing.com/assets/images/og-home.jpg",
"foundingDate": "2015",
"founder": {
"@type": "Person",
"name": "S K Chowdhury Masum",
"jobTitle": "Founder & Lead Instructor"
},
"sameAs": [
"https://github.com/SchoolOfFreelancing",
"https://www.youtube.com/@SchoolOfFreelancing",
"https://www.linkedin.com/company/schooloffreelancing",
"https://www.facebook.com/SchoolOfFreelancing",
"https://instagram.com/schooloffreelancing",
"https://x.com/SchoolOfFreelan"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "5.0",
"reviewCount": "36"
}
}(Only include aggregateRating if the 36 reviews are genuine, verifiable, and the same figure quoted consistently — which they are across the pages I checked. Google does periodically audit these for AggregateRating spam, so keep the count accurate as it grows.)
B. Training pages — Course (e.g. Linux Freelancing Training: 180 hrs, 6 months, $599)
{
"@context": "https://schema.org",
"@type": "Course",
"name": "Linux Freelancing Training",
"description": "180-hour, 6-month hands-on Linux Systems Administration training with guaranteed minimum income support.",
"provider": {
"@type": "EducationalOrganization",
"name": "School of Freelancing",
"sameAs": "https://schooloffreelancing.com"
},
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"courseWorkload": "P180H"
},
"offers": {
"@type": "Offer",
"price": "599",
"priceCurrency": "USD"
}
}Repeat per training page — you already list format, hours, and price consistently in the "Training at a Glance" tables, so this is close to a copy-paste job across all 5 training pages.
C. Service pages — Service (e.g. Linux Server Support: $350, 72 hrs, 3 days)
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Linux Server Support",
"serviceType": "Linux system administration and server support",
"provider": {
"@type": "EducationalOrganization",
"name": "School of Freelancing"
},
"areaServed": "Worldwide",
"offers": {
"@type": "Offer",
"price": "350",
"priceCurrency": "USD"
}
}This is the highest-ROI, lowest-effort win on the site: you have ~24 service pages, every one already states price and turnaround in a "Services at a Glance" table — it's a near-mechanical template addition.
D. FAQ blocks — FAQPage (client-support hub, every individual service page, and /resource-center/faqs/)
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Can you start immediately?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, in most cases we can begin as soon as the project requirements are confirmed."
}
},
{
"@type": "Question",
"name": "Do you provide remote support?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. We provide secure remote support for servers, cloud infrastructure, and applications worldwide."
}
}
]
}Every FAQ accordion I saw already has clean, self-contained Q/A text — mark it up as-is, no rewriting needed.
E. Breadcrumbs — BreadcrumbList (VoIP guide and any page with a visible breadcrumb trail)
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://schooloffreelancing.com/" },
{ "@type": "ListItem", "position": 2, "name": "Resource Center", "item": "https://schooloffreelancing.com/resource-center/" },
{ "@type": "ListItem", "position": 3, "name": "How to Set Up Your Own VoIP Phone System" }
]
}F. HowTo guides — HowTo (VoIP guide specifically; you already have numbered Step 1–6 H2s with clear sub-actions)
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Set Up Your Own VoIP Phone System",
"step": [
{ "@type": "HowToStep", "name": "Install FusionPBX", "text": "Install FreeSWITCH dependencies, clone the FusionPBX repo, and run the installer." },
{ "@type": "HowToStep", "name": "Configure Extensions", "text": "Create your first extension in Dialplan → Extensions → Add." },
{ "@type": "HowToStep", "name": "Build an IVR", "text": "Create an IVR menu under Dialplan → IVR → Add." },
{ "@type": "HowToStep", "name": "Set Up SIP Trunking", "text": "Configure a Telnyx or Twilio SIP trunk under Advanced → SIP Profiles." },
{ "@type": "HowToStep", "name": "Enable Call Recording & Voicemail", "text": "Turn on Record Calls and configure voicemail-to-email." },
{ "@type": "HowToStep", "name": "Backup & Monitoring", "text": "Schedule daily pg_dump backups and monitor via System → System Status." }
]
}Once implemented, run each template through Google's Rich Results Test and Schema.org validator before wide rollout — Course and Service in particular have required-property nuances (e.g., Course increasingly expects hasCourseInstance with a real workload/schedule to be eligible for rich results, not just a name/description).
What's already working in your favor
- Your
robots.txtexplicitly welcomes AI answer-engine crawlers (OAI-SearchBot,Claude-SearchBot,Claude-User,PerplexityBot,Perplexity-User) withAllow: /, and your content-signal header (ai-input: yesviause=reference,ai-train=no) is a clear, modern, unambiguous policy — most sites haven't set this up at all. Just fix the ClaudeBot contradiction in §1, item 4. - The newer service-page template (e.g. Linux Server Support) already writes in a highly citable shape: a "Key Takeaways" bullet list, a "Services at a Glance" table, and short FAQ Q/A pairs. Those are close to ideal AI-citable passages — self-contained, factual, no pronouns referring outside the sentence.
Gaps to close
- Retrofit the "Key Takeaways" pattern onto older pages. The VoIP guide and (from what's visible) the homepage don't have this pattern yet — an AI engine answering "how do I set up FusionPBX" has to extract facts from prose paragraphs instead of a ready-made summary block. Add a 4–6 bullet "Key Takeaways" box near the top of every resource-center guide, mirroring the service-page format.
- Primary-source alignment / E-E-A-T. You have a named, credentialed founder with specific, relevant experience (11+ years, FusionPBX/FreeSWITCH/SIP trunking explicitly listed) — but none of the technical guides are attributed to him. Add a byline +
Personschema (author) linking guide content to his bio. AI systems weight attributed, credentialed authorship when deciding which source to cite as primary. - Add visible + structured "last updated" dates. Neither the VoIP guide nor the pages I fetched show a visible modification date. Add
dateModifiedtoArticle/HowToschema and show it on-page — freshness signals matter more for AI citation of technical/how-to content than for general SEO. - Numeric claims need a citable, standalone sentence. "$599 · 180 Training Hours / 6 Months" appears in a table, which is good, but AI extraction is more reliable from a plain sentence too: "Linux Freelancing Training costs $599 for 180 hours of instruction over 6 months." Consider adding one such sentence per training/service page even where the table already exists — belt and suspenders for passage extraction.
- Duplicate service-page prose (§1, item 5) hurts AI citability more than traditional SEO, since answer engines actively deduplicate near-identical passages across a domain and will tend to pick one page as canonical and ignore the rest — meaning most of your 20 service pages may currently be invisible to AI search regardless of ranking. This makes the content-uniqueness fix a genuine AI-search priority, not just a traditional-SEO one.
- Fix canonical host mismatch +
/linux-ai-services/link drift (§1.1–1.2) — quick, prevents ongoing indexing confusion. - Fix the ClaudeBot robots.txt contradiction (§1.4) — one-line change.
- Add
Serviceschema to all client-support pages (§3.2C) — highest schema ROI, near-mechanical. - Add
FAQPageschema everywhere you already have FAQ accordions (§3.2D) — content is ready, just wrap it. - Add
Courseschema to the 5 training pages (§3.2B). - Retrofit "Key Takeaways" + author byline +
HowTo/Article/BreadcrumbListschema onto resource-center guides, starting with the VoIP page (§2, §3.2E–F, §4.2). - Longer-term: differentiate the ~20 near-duplicate service pages with at least one unique section each (§1.5, §4.5).