Site IA & Organizations Landing¶
Status: shipped (2026-07-10) Owner: Bhanu Last updated: 2026-07-13 Related: b2c-landing-and-freemium.md, apps-site-ssg-migration.md, b2c-signup-attribution.md
The marketing site's information architecture after the B2C home promotion: which route owns which audience, how navigation and footer route between them, and what the reworked B2B landing at /organizations looks like.
Why this exists (Product Mindset Gate)¶
- Who asked for it? Owner-driven, executed from a design handoff alongside the B2C home redesign. Self-initiated, flagged as such.
- What user pain? The old site made every visitor pick an audience before seeing anything. Learners, who are the growth audience, landed on a page that hedged between institutions and individuals. A visitor from a JEE-prep ad had to find themselves in a picker before reaching relevant content.
- Cost of not doing it? Paid learner traffic bounced off an ambiguous home. B2B visitors got a page styled differently from the rest of the brand.
- Validated or guess? Weak validation: owner dogfooding, no interviews. Same caveat as the home redesign.
- How we know it worked? Signups attributed to home CTAs via internal UTM, bounce on
/, and demo-form submissions from/organizations. Counterfactual: reverting restores the audience-picker home, and both funnels re-merge.
IA contract¶
One audience per page. No mix and match.
| Route | Audience | Content |
|---|---|---|
/ |
Learners (B2C) | Single-track exam-prep landing, the site home |
/organizations |
Institutions and corporates (B2B) | Single-track B2B landing with demo form |
/individuals |
(retired) | 301 redirect to / |
Rules:
/owns learners. No audience picker, no persona toggle, no B2B teaser blocks beyond the nav link./organizationsowns B2B. The audience picker and learner tiles were removed; it does not link learners sideways into B2C content beyond the shared nav and footer.- A page never serves two audiences. If a new segment needs a landing, it gets its own route, not a toggle on an existing one.
Redirects, canonicals, sitemap¶
/individualsresponds with a 301 to/. Existing backlinks and ad destinations keep working.- Canonicals moved with the content: the learner landing's canonical is
/, the B2B landing's canonical is/organizations. - The sitemap and the prerender manifest (
apps/site/scripts/prerender.mjs) were updated to match:/and/organizationsare listed,/individualsis not.
Navigation and footer contract¶
- The main nav carries one cross-audience link: "For organizations", which opens
/organizationsin a new tab. Rationale: the visitor on/is usually a learner mid-evaluation; a curious click on the B2B link should not destroy their place on the learner page. The new tab makes the B2B page a side reference, not a navigation away. - The footer solutions column is split by audience:
- B2B links: four of the six solution pages (handwritten grading, NEP 2020 builder, DPDP proctoring, CO-PO tracker:
LandingFooter.tsx:197-214). The two SEO pillar pages are deliberately not in the footer (see below). - B2C anchors:
/#study-plan,/#practice-hub,/#exam-readiness. These are section anchors on the home page, not standalone pages (a deliberate non-goal for now, owned by the landing doc).
- B2B links: four of the six solution pages (handwritten grading, NEP 2020 builder, DPDP proctoring, CO-PO tracker:
The solutions tree and the SEO pillar pages¶
/solutions/* is the site's organic-search surface. Six pages today, all rendered by one component (apps/site/src/pages/solutions/SolutionLayout.tsx) and all prerendered with the same schema stack.
| Route | Shape | Copy source |
|---|---|---|
/solutions/handwritten-answer-sheet-grading |
feature page | i18n/locales/en/solutions.json |
/solutions/nep-2020-curriculum-builder |
feature page | solutions.json |
/solutions/dpdp-compliant-proctoring |
feature page | solutions.json |
/solutions/co-po-attainment-tracker |
feature page | solutions.json |
/solutions/higher-education-ai-platform |
pillar page | i18n/locales/en/solutionsExtra.json |
/solutions/naac-nba-accreditation-ai |
pillar page | solutionsExtra.json |
Feature page vs pillar page. The four feature pages each answer one capability query ("how do I grade handwritten answer sheets"). The two pillar pages answer the broad category queries an institutional buyer actually types ("AI learning platform for colleges in India", "NAAC accreditation software") and hand the visitor down to the feature pages through their Related links. Traffic direction is deliberate: the pillars link out to the four feature pages, the feature pages do not link back up.
Consequence, recorded honestly: the two pillar pages currently have no inbound internal link anywhere on the site. They are not in the nav, not in the footer's B2B column, and not in any other page's Related list. They are reachable from search, the sitemap, and the pillars' own canonical URLs only. That is a live gap, not a design decision.
Page anatomy (SolutionLayout)¶
Breadcrumb, H1, subtitle, N copy sections, a demo/pricing CTA block, an FAQ accordion, and a Related-solutions list. Meta comes from <Helmet>: title, description, canonical, og:*, twitter:*. Copy is entirely i18n-keyed, so a page component is a list of section keys plus a routeKey. No copy lives in TSX.
Schema and prerendering¶
The pages are React at runtime but static HTML in production. apps/site/scripts/prerender.mjs renders every route through the server bundle and writes dist/client/<route>/index.html; Cloudflare Pages serves those files. There is no SSR server in production, so the JSON-LD has to be injected at build time, not by React.
buildFullHead (prerender.mjs:569-621) appends the schema blocks Helmet does not own. A solution route gets four:
| Schema | Builder | Source |
|---|---|---|
BreadcrumbList |
buildBreadcrumbJsonLd (prerender.mjs:237) |
the route's breadcrumbs array: Home → Solutions → page H1 |
FAQPage |
buildFaqJsonLd (prerender.mjs:250) |
the page's own faqItems from its i18n file |
Service |
buildSolutionServiceJsonLd (prerender.mjs:409-424) |
meta.title as name, meta.description as description, h1 as serviceType, areaServed: India, EducationalAudience |
Organization |
buildOrganizationJsonLd (prerender.mjs:426) |
site-wide, emitted on every route |
The two pillar pages are wired into that machinery exactly like the four originals: registered in routes.json (solutionsHigherEdPlatform, solutionsNaacNbaAccreditation), routed in App.tsx:108-112, given prerender entries with breadcrumbs + FAQ + solutionKey (prerender.mjs:167-194), listed in sitemap.xml at monthly / priority 0.8 (prerender.mjs:722-723), and given Cache-Control lines in public/_headers. Their copy lives in a second i18n file (solutionsExtra.json) that the prerender script merges with solutions.json into one ALL_SOLUTIONS lookup (prerender.mjs:33); the key namespaces do not collide.
Their FAQ items are also folded into the aggregate /faq page's FAQPage schema (prerender.mjs:224-225), so each question is marked up twice: once on its own page, once on /faq.
Two more gaps worth naming. The IndexNow ping script (apps/site/scripts/indexnow-ping.mjs:24-33) still lists only the four original solution routes, so the pillars are not pushed to Bing on deploy. And every solution breadcrumb points at a /solutions hub URL that has no route, so it 404s.
The organizations landing (/organizations)¶
The B2B landing moved from the old home to /organizations and was restyled to the B2C design language so the two pages read as one brand: neutral extrabold display type, warm canvas background, no leftover legacy styling.
Section order:
- Hero. Faculty photo, single-track B2B headline, demo CTA. No audience picker or learner tiles.
- Dark trust band. Stats on a dark surface.
- Agents loop and sticky assistants stack. The AI assistants are presented as a sticky scroll-stack: each assistant card pins while the next scrolls in.
- Demo form. The conversion action for B2B is a demo request, not self-serve signup.
Design language and fonts¶
Both landings share the same primitives from @kwilo/ui: SmartSurface, SmartBadge, Heading with display-2xl size and extrabold weight, and Text with the lead variant.
Manrope is now self-hosted via @fontsource in both apps/site and apps/web. Before this change the font was declared in CSS but never loaded, so every page rendered in a system-font fallback. apps/web also dropped its consent-gated Google Fonts loading in the process; self-hosting removes the third-party request entirely.
Non-goals¶
- A
/solutionshub page. The six pages are entered from search, not browsed from an index. (The breadcrumbs assume a hub that does not exist; see the gap above.) - Pillar pages in the main nav. They are search entry points for buyers, not navigation for visitors already on the site. Footer placement is still an open question.
- Standalone B2C solution pages. Footer B2C entries stay as home-page anchors until the sections earn their own pages.
- A shared audience switcher. There is no component that flips a page between audiences; routing is the switch.
- B2B self-serve signup. The organizations funnel ends at the demo form.
Rejected alternatives¶
- Audience switcher on the B2B page. Would reintroduce the mixed-audience page this change removes. Rejected:
/owns learners,/organizationsowns B2B. - Keeping
/individualsalive as a duplicate. Two URLs with the same learner content splits SEO equity and confuses attribution. Rejected for the 301. - Same-tab "For organizations" link. Cheaper default, but it navigates the learner away from the page they were evaluating. Rejected for the new tab.
Where it lives¶
- Routes and redirects:
apps/siterouter (src/App.tsx, paths insrc/constants/routes.json) pluspublic/_redirects(Cloudflare Pages) for the/individuals301. - Solution pages:
apps/site/src/pages/solutions/(SolutionLayout.tsxplus one folder per route); copy insrc/i18n/locales/en/solutions.jsonandsolutionsExtra.json. - JSON-LD, robots, sitemap:
apps/site/scripts/prerender.mjs. Search-engine ping:apps/site/scripts/indexnow-ping.mjs. - B2B page:
apps/site/src/pages/Organizations/(hero, trust band, assistants stack, demo form). - Prerender and sitemap:
apps/site/scripts/prerender.mjs. - Attribution: every site to app CTA carries internal UTM (see b2c-signup-attribution.md); home CTAs use
source=individuals.
Changelog¶
- 2026-07-13: Documented the solutions tree and the two SEO pillar pages (
/solutions/higher-education-ai-platform,/solutions/naac-nba-accreditation-ai, commitsb57f61d5/a17ba5dd): schema stack (BreadcrumbList, FAQPage, Service, Organization), build-time injection, sitemap entries. Corrected the footer claim (it links four solution pages, not six) and recorded three gaps: no inbound internal links to the pillars, IndexNow list not updated,/solutionsbreadcrumb hub 404s. - 2026-07-10: Doc created. B2C home promotion,
/organizationsB2B landing,/individuals301, nav and footer contract, one-audience-per-page principle recorded.