Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

School of Freelancing — Site Audit

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.


1. Full-Site Audit — Prioritized Action Plan

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

2. Deep Single-Page Analysis — VoIP Phone System Guide

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


3. Schema Markup Audit

3.1 Detect

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.

3.2 Generate

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." }
  ]
}

3.3 Validate

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


4. AI Search Optimization

What's already working in your favor

  • Your robots.txt explicitly welcomes AI answer-engine crawlers (OAI-SearchBot, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User) with Allow: /, and your content-signal header (ai-input: yes via use=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

  1. 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.
  2. 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 + Person schema (author) linking guide content to his bio. AI systems weight attributed, credentialed authorship when deciding which source to cite as primary.
  3. Add visible + structured "last updated" dates. Neither the VoIP guide nor the pages I fetched show a visible modification date. Add dateModified to Article/HowTo schema and show it on-page — freshness signals matter more for AI citation of technical/how-to content than for general SEO.
  4. 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.
  5. 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.

Suggested Rollout Order

  1. Fix canonical host mismatch + /linux-ai-services/ link drift (§1.1–1.2) — quick, prevents ongoing indexing confusion.
  2. Fix the ClaudeBot robots.txt contradiction (§1.4) — one-line change.
  3. Add Service schema to all client-support pages (§3.2C) — highest schema ROI, near-mechanical.
  4. Add FAQPage schema everywhere you already have FAQ accordions (§3.2D) — content is ready, just wrap it.
  5. Add Course schema to the 5 training pages (§3.2B).
  6. Retrofit "Key Takeaways" + author byline + HowTo/Article/BreadcrumbList schema onto resource-center guides, starting with the VoIP page (§2, §3.2E–F, §4.2).
  7. Longer-term: differentiate the ~20 near-duplicate service pages with at least one unique section each (§1.5, §4.5).

About

backup

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors