Back to .md Directory

Technical Design Document — Nonprofit Compliance + Conversion Alignment

Specifies four new React components and a data layer to add nonprofit compliance, mission framing, and scholarship visibility across a Next.js site.

May 2, 2026
0 downloads
3 views
ai llm
View source

What this file does

Specifies four new React components and a data layer to add nonprofit compliance, mission framing, and scholarship visibility across a Next.js site.

When to use it

  • Adding 501(c)(3) compliance to a nonprofit website that currently reads like a for-profit business
  • Centralizing legal disclosures, mission statements, and impact metrics in a single data file
  • Ensuring every conversion page carries mission framing without interrupting checkout flow
  • Mapping BRD requirements to specific component builds and page-level integration points

Assumes this stack

Next.js 16React 19TypeScriptTailwind CSS 4GoHighLevel

Technical Design Document — Nonprofit Compliance + Conversion Alignment

Project: Azgari Foundation Website Stack: Next.js 16 (App Router) · React 19 · TypeScript · Tailwind CSS 4 · GoHighLevel (external checkout/CRM) Source BRD: Business Requirements Document — Conversion + Compliance Alignment Org type: 501(c)(3) nonprofit Conversion model: Hybrid — direct GHL checkout + sales-call-to-invoice


Table of Contents

  1. Current-State Audit Summary
  2. Gap Analysis Matrix
  3. Data Layer Changes (src/lib/links.ts)
  4. Component Specifications
  5. Page-Level Integration Map
  6. CTA Language Rules
  7. Copy Framework Enforcement
  8. Build Order + Dependencies
  9. Acceptance Criteria (testable)
  10. What NOT to Build

1. Current-State Audit Summary

AreaScoreNotes
Mission language40/100Exists on /about and /scholarships but not on conversion pages; no reusable component
Revenue reinvestment50/100"10% of enrollments fund scholarships" on /scholarships — missing from footer, pricing, homepage
Scholarship visibility75/100Dedicated /scholarships page; missing from homepage and pricing proximity
Impact metrics35/100Financial stats only (160+ launched, $285K); zero social-mission metrics
Compliance footer5/100Generic copyright line; no EIN, no nonprofit status, no reinvestment disclosure
Nonprofit positioning0/100501(c)(3) status never stated anywhere on the site
Mission-aligned CTAs0/100Every CTA is business-transaction language ("Get Started", "See If You Qualify")

Bottom line: The site reads as a premium consulting business. It does not read as a mission-driven nonprofit. BRD requires that every conversion surface carry mission framing, reinvestment disclosure, and scholarship visibility — none of which currently exist at those touchpoints.


2. Gap Analysis Matrix

Each row maps a BRD requirement to what exists today, what must change, and which component delivers it.

#BRD RequirementExists?GapComponent to Build/Modify
1Mission wrapper on every conversion pageNoNo reusable mission component; language scatteredMissionWrapper.tsx (new)
2Revenue reinvestment disclosure near pricingPartialOnly on /scholarships; not near pricing or footerReinvestmentDisclosure.tsx (new)
3Scholarship visibility before payment decisionNoScholarships page exists but not surfaced near pricingScholarshipCallout.tsx (new)
4Impact module with social metricsNoOnly financial stats; no jobs created, scholarships awarded, communities servedImpactModule.tsx (new)
5Compliance footer (EIN, nonprofit status, mission)NoFooter is generic copyright onlyFooter.tsx (modify)
6Nonprofit status sitewideNoNever statedData in links.ts + Footer + MissionWrapper
7Results disclaimer on homepageNoEarnings disclaimer only on /case-studiesAdd to Stats.tsx or Transformation.tsx
8"Apply" vs "Buy" CTA shiftPartialUses "See If You Qualify" and "Get Started" — no mission framingCTA label updates in Pricing.tsx, CTAButton.tsx
9Economic mobility / workforce framingNoMarketing copy is wealth/income focusedCopy updates across Hero, Pricing, CTA
10Governance presence (light)NoNo EIN, no 501(c)(3) claim, no transparency link slotsFooter + links.ts constants

3. Data Layer Changes

src/lib/links.ts — New Constants

Add a new NONPROFIT export block as the single source of truth for all compliance data. This keeps compliance copy centralized and prevents hardcoding across components.

// ============================================
// NONPROFIT COMPLIANCE DATA
// Single source of truth for all compliance copy
// ============================================
export const NONPROFIT = {
  name: "Azgari Foundation",
  type: "501(c)(3) Nonprofit Organization",
  ein: "XX-XXXXXXX", // ← Insert real EIN

  // Mission statement — the BRD "north star" (used in MissionWrapper + Footer)
  mission:
    "Azgari Foundation delivers entrepreneurship training that increases income potential, expands economic mobility, and creates jobs in local communities.",

  // Short mission (for tight spaces like footer tagline)
  missionShort:
    "Entrepreneurship training for economic mobility and community job creation.",

  // Revenue reinvestment disclosure (BRD §5.2, §10)
  reinvestmentStatement:
    "Program fees support training delivery, scholarships, and expansion of our nonprofit workforce initiatives.",

  // Global legal disclosure (BRD §10)
  legalDisclosure:
    "Azgari Foundation is a nonprofit organization. Program revenue is reinvested into training, scholarships, and economic mobility initiatives.",

  // Results disclaimer (FTC-safe)
  resultsDisclaimer:
    "Individual results vary based on effort, market conditions, and capital. Stated figures reflect aggregate client outcomes, not guarantees.",
};

// ============================================
// IMPACT METRICS (Social Mission)
// Used by ImpactModule component
// ============================================
export const IMPACT_METRICS = {
  businessesLaunched: { value: "160+", label: "Businesses Launched" },
  jobsCreated: { value: "XXX", label: "Jobs Created" },           // ← needs real data
  scholarshipsAwarded: { value: "XX", label: "Scholarships Awarded" }, // ← needs real data
  communitiesServed: { value: "XX", label: "Communities Served" },     // ← needs real data
};

Why centralized: BRD §12 says marketing cannot remove mission statements or reinvestment disclosures. Keeping them in a single data file makes accidental deletion visible in code review and ensures consistency across all placements.


4. Component Specifications

4.1 MissionWrapper.tsx — Mission Alignment Block

Purpose: BRD §5.1 — Reusable mission framing that appears on every conversion page.

Type: Server component (no interactivity needed)

Props Interface:

interface MissionWrapperProps {
  variant?: "hero" | "section" | "inline";
  // hero: full-width bar below page hero (homepage, program pages)
  // section: standalone card with border (pricing pages, book-call page)
  // inline: single-line text (checkout reinforcement)
}

Content Structure:

  • variant="hero" — Full-width cream background strip. Renders NONPROFIT.mission as centered text with a small leaf/community icon. Subtle, not a modal.
  • variant="section" — Bordered card (cream bg, forest-green left border). Renders mission + NONPROFIT.reinvestmentStatement stacked.
  • variant="inline" — Single paragraph with forest-green text. Renders NONPROFIT.legalDisclosure.

Design Rules:

  • Background: var(--color-cream) / #F8F6F0
  • Text: text-sm or text-xs depending on variant
  • Must never gate or interrupt checkout flow (BRD §Addendum 10)
  • Placement philosophy: reassure, not interrupt

Placement Map:

PageVariantPosition
Homepage (/)heroBelow <Hero />, above <TrustBanner />
Services (/services)sectionAbove program cards
Pricing componentsectionBetween quick-match grid and program cards
Contact / Book-call (/contact)sectionAbove form
About (/about)inlineWithin existing mission section

4.2 ReinvestmentDisclosure.tsx — Revenue Transparency Block

Purpose: BRD §5.2 — Disclose how program fees are used. Required near every pricing surface.

Type: Server component

Props Interface:

interface ReinvestmentDisclosureProps {
  size?: "default" | "compact";
  // default: card with icon + statement (near pricing tables)
  // compact: single line (footer, confirmation contexts)
}

Content:

  • Renders NONPROFIT.reinvestmentStatement
  • size="default": Includes a small icon (shield or circular-arrows), forest-green left border, cream background
  • size="compact": Single text-xs text-white/70 line (for footer)

Placement Map:

Page / ComponentSizePosition
Pricing.tsxdefaultBelow program cards grid, above Quick Win bundle
/services pagedefaultBelow program listing
/courses pagedefaultBelow course grid
Footer.tsxcompactIn compliance footer section

Acceptance: Any page rendering PROGRAMS data or pricing must also render this component.


4.3 ScholarshipCallout.tsx — Scholarship Visibility Near Pricing

Purpose: BRD §5.3 — Ensure scholarship path is visible before payment decision.

Type: Server component

Props Interface:

interface ScholarshipCalloutProps {
  variant?: "card" | "banner";
  // card: standalone module with CTA (homepage, near pricing)
  // banner: slim horizontal strip (program pages)
}

Content:

  • Headline: "Scholarships Available"
  • Body: "We fund scholarships for foster youth, veterans, single parents, and first-generation entrepreneurs. 10% of every paid enrollment goes directly to scholarship funding."
  • CTA: Link to /scholarships — label: "Learn About Scholarships" (not "Apply" — that's on the scholarships page itself)

Design:

  • card variant: Rounded card, dashed border (like existing Quick Win bundle style), centered text
  • banner variant: Slim horizontal bar, cream background, single line + link

Placement Map:

Page / ComponentVariantPosition
Homepage (/)cardAfter <Pricing />, before <HomeFAQ />
/services pagebannerBelow program cards
/contact pagebannerAbove or below contact form
Pricing.tsxEmbedded mentionText link within existing "Still unsure?" line

4.4 ImpactModule.tsx — Impact Through Entrepreneurship

Purpose: BRD §9 — Conversion-positive impact section with social metrics.

Type: Server component

Props Interface:

interface ImpactModuleProps {
  variant?: "full" | "compact";
  // full: 4-stat grid with headline (homepage, program pages)
  // compact: inline stat strip (about page, donor-readiness)
}

Content:

  • Section title: "Impact Through Entrepreneurship"
  • 4-stat grid sourced from IMPACT_METRICS:
    • Businesses Launched
    • Jobs Created
    • Scholarships Awarded
    • Communities Served
  • Below stats: NONPROFIT.missionShort as a one-liner

Design:

  • Forest-green background, white text (mirrors existing Stats.tsx pattern)
  • Stats in grid sm:grid-cols-2 lg:grid-cols-4 layout
  • Each stat: large number + small label

Placement Map:

PageVariantPosition
Homepage (/)fullBetween <Transformation /> and <Testimonials />
/about pagefullAfter mission section
/services pagecompactNear page footer area
/case-studies pagecompactBelow aggregate stats bar

Data dependency: IMPACT_METRICS values must be filled with real data before launch. Use placeholder "—" values in dev to make gaps visible.


4.5 Footer.tsx — Compliance Footer Upgrade

Purpose: BRD §5.5, §7.5, §10 — Persistent global compliance presence.

Modify: Existing src/components/Footer.tsx

Changes:

  1. Replace tagline — Current: "Helping professionals build real wealth through service business ownership." New: NONPROFIT.missionShort

  2. Add compliance section — New block between link columns and copyright. Contains:

    • Nonprofit status line: NONPROFIT.type
    • EIN: NONPROFIT.ein
    • Reinvestment disclosure: <ReinvestmentDisclosure size="compact" />
    • Results disclaimer: NONPROFIT.resultsDisclaimer
  3. Add future nav slots (hidden/placeholder, BRD §Addendum 11):

    • Comment placeholders for: Financials, Governance, Impact Reports
    • Do NOT render links yet — just {/* Future: Financials link */} comments
  4. Update copyright line: Current: © {year} Azgari Foundation. All rights reserved. New: © {year} Azgari Foundation. {NONPROFIT.type}. All rights reserved.

Resulting footer structure:

┌─────────────────────────────────────────────────┐
│  Logo + Mission tagline                          │
│  Programs | Resources | Company (existing cols)  │
├─────────────────────────────────────────────────┤
│  [NONPROFIT.type] · EIN: [NONPROFIT.ein]         │
│  [NONPROFIT.reinvestmentStatement]                │
│  [NONPROFIT.resultsDisclaimer]                    │
├─────────────────────────────────────────────────┤
│  © 2026 Azgari Foundation. 501(c)(3)...          │
└─────────────────────────────────────────────────┘

Design: Compliance section uses text-xs text-white/50 — visually lighter than link columns. Present but not attention-competing.


4.6 Results Disclaimer — Inline Addition

Purpose: BRD §8, FTC compliance — substantiation for income claims on homepage.

Modify: Existing src/components/Stats.tsx or src/components/Transformation.tsx

Change: Add NONPROFIT.resultsDisclaimer as a text-xs text-white/60 line below the stats grid. No component needed — inline text addition using the centralized string.

Pattern:

<p className="text-xs text-white/60 mt-4 max-w-lg mx-auto text-center">
  {NONPROFIT.resultsDisclaimer}
</p>

Apply to:

  • Stats.tsx — below the 4-stat grid
  • Transformation.tsx — below revenue/outcome figures
  • Homepage Pricing.tsx — below the "Average client first-year revenue: $285K" pill

5. Page-Level Integration Map

This table shows every page and what compliance elements it must contain after implementation. Checked (Y) = required. Dash (—) = not required.

PageMissionWrapperReinvestmentScholarshipCalloutImpactModuleResults DisclaimerCompliance Footer
/ (Homepage)Y (hero)Y (in pricing)Y (card, post-pricing)Y (full)Y (stats + pricing)Y (global)
/servicesY (section)Y (default)Y (banner)Y (compact)—Y (global)
/scholarships— (page IS the mission)— (already present)— (self-referential)——Y (global)
/courses—Y (default)———Y (global)
/aboutY (inline)——Y (full)—Y (global)
/contactY (section)—Y (banner)——Y (global)
/acquisitionY (section)Y (default)——YY (global)
/case-studies———Y (compact)Y (already exists)Y (global)
/faq—————Y (global)
/guides—————Y (global)
/tools—Y (default)———Y (global)
/webinarY (section)—Y (banner)——Y (global)
/media—————Y (global)
/state/[state]—————Y (global)
/privacy—————Y (global)
/terms—————Y (global)

Key rule (BRD §Addendum 5, Rules 1-3):

  1. Every page with pricing → must have ReinvestmentDisclosure
  2. Every conversion page → must have MissionWrapper
  3. ScholarshipCallout must appear at least once before payment decision

6. CTA Language Rules

Current → Updated Labels

LocationCurrent CTAUpdated CTARationale
Hero primary"Book Your Free Discovery Call""Start Your Path" or "Explore Programs"Reduce transactional feel (BRD §2.5)
Hero secondary"View Pricing""Compare Programs"Already used on services page — align
Pricing cards"Get Started""Apply Now" or "Get Started""Apply" preferred for compliance; "Get Started" acceptable
Pricing secondary"Book a Call First""Book a Free Call"Keep — already compliant
Services cards"See If You Qualify →"Keep as-isGood — implies qualification gate, not purchase
Final CTA"Book Your Free Discovery Call"Keep or shift to "Start Your Journey"Low priority
Book-call pagesN/A (external GHL)N/ACTA labels on GHL pages are outside this scope

Prohibited CTA Language (BRD §6)

  • "Buy", "Purchase", "Order"
  • "Guaranteed income", "Get rich"
  • Personal wealth focus without community framing

Required: Every conversion CTA page must also contain at least one of:

  • Economic mobility framing
  • Workforce development framing
  • Community impact framing

This is satisfied by the MissionWrapper component placement (see §5).


7. Copy Framework Enforcement

Homepage Hero — Add Mission Line

Current Hero headline area ends with CTAs. Add <MissionWrapper variant="hero" /> immediately after </Hero> in page.tsx.

This renders the BRD §5.1 required language pattern:

"We train individuals to build income-generating businesses and create jobs in their communities."

Metadata Updates

Update generateMetadata() or static metadata on conversion pages to include mission framing:

PageCurrent descriptionSuggested addition
/ (layout.tsx)Business consulting focusedAppend: "A 501(c)(3) nonprofit expanding economic mobility through entrepreneurship."
/services"Choose Your Program"Prepend: "Nonprofit entrepreneurship training —"
/aboutFounder wealth focusShift to: "Our mission: economic mobility through business ownership."

Copy Patterns to Update

These are inline copy changes (not component-level) across existing files:

  1. Footer tagline — "Helping professionals build real wealth through service business ownership" → NONPROFIT.missionShort
  2. About page mission section — Add explicit 501(c)(3) status to existing mission points
  3. Scholarships page — Already strong; no changes needed
  4. Stats component — Add results disclaimer text below stats

8. Build Order + Dependencies

Priority order based on BRD §Addendum 7 and dependency chain.

PriorityComponentDependenciesEstimated Scope
P0NONPROFIT + IMPACT_METRICS data in links.tsNone — prerequisite for everything1 file edit
P1Footer.tsx compliance upgradeNONPROFIT data, ReinvestmentDisclosure1 file edit + 1 new component
P2MissionWrapper.tsxNONPROFIT data1 new component
P3ReinvestmentDisclosure.tsxNONPROFIT data1 new component
P4ScholarshipCallout.tsxNone1 new component
P5ImpactModule.tsxIMPACT_METRICS data1 new component
P6Homepage integration (page.tsx)P1–P5 components1 file edit
P7Services + Pricing page integrationP2, P3, P42 file edits
P8Results disclaimers (Stats, Transformation, Pricing)NONPROFIT.resultsDisclaimer3 file edits
P9CTA language updatesNone2–3 file edits
P10Metadata updatesNone2–3 file edits
P11Remaining page integrations (contact, acquisition, webinar, etc.)P2–P54–6 file edits

New files created: 4 (MissionWrapper.tsx, ReinvestmentDisclosure.tsx, ScholarshipCallout.tsx, ImpactModule.tsx) Files modified: ~12–15 (links.ts, Footer.tsx, page.tsx, Pricing.tsx, Stats.tsx, Transformation.tsx, services/page.tsx, contact/page.tsx, about/page.tsx, acquisition/page.tsx, webinar/page.tsx, layout.tsx, CTAButton.tsx)


9. Acceptance Criteria

Marketing Success (conversion must not regress)

  • All existing CTA links remain functional and point to correct GHL URLs
  • Primary conversion flow (Hero → Pricing → GHL checkout) is uninterrupted
  • No compliance element gates, blocks, or modals between user and checkout
  • Quick-match grid and program cards remain visually dominant on pricing section
  • Sales call booking flow remains one-click from homepage

Compliance Success (BRD requirements met)

  • Mission present on all conversion pages: Homepage, /services, /contact, /acquisition, /webinar each render MissionWrapper
  • Reinvestment statement visible near all pricing: Pricing.tsx, /services, /courses, /tools each render ReinvestmentDisclosure
  • Scholarship path clear before payment decision: ScholarshipCallout appears on homepage (after pricing) and /services
  • Public benefit framing included: ImpactModule on homepage and /about shows social metrics (jobs, scholarships, communities)
  • EIN + nonprofit status in footer: Footer.tsx displays NONPROFIT.type and NONPROFIT.ein
  • Results disclaimer on homepage: Appears below Stats component and within Pricing section
  • No prohibited language: No instances of "guaranteed income", "get rich", or personal-wealth-only framing

Technical Success (reusable, maintainable)

  • MissionWrapper renders correctly in all 3 variants (hero, section, inline)
  • ReinvestmentDisclosure renders correctly in both sizes (default, compact)
  • ScholarshipCallout renders correctly in both variants (card, banner)
  • ImpactModule renders correctly in both variants (full, compact)
  • All compliance text sourced from NONPROFIT / IMPACT_METRICS constants — zero hardcoded compliance copy in components
  • npm run build passes with zero errors
  • npm run lint passes with zero errors
  • All new components are server components (no "use client" directive)
  • All new components follow project conventions: functional, default export, TypeScript interfaces, Tailwind utilities

Page-Level Validation Checklist

A page fails compliance if:

  • Pricing appears without ReinvestmentDisclosure
  • Conversion CTA appears without MissionWrapper on the same page
  • Book-a-call page lacks mission framing

A build passes when:

  • All rows in the §5 integration matrix are satisfied
  • Footer compliance section renders on every page (global via layout.tsx)
  • No NONPROFIT constant references resolve to placeholder "XX" values in production

10. What NOT to Build

Per BRD §15 — explicitly out of scope:

ItemReason
Form 990 pageFuture expansion — add nav slot comment only
Board governance pageFuture expansion — add nav slot comment only
Annual report sectionFuture expansion — add nav slot comment only
Donation flowNot part of current conversion model
Grant application pagesFuture donor-readiness phase
CMS permission enforcementNo CMS exists — site is static Next.js
Analytics/tracking implementationBRD mentions it but no analytics platform is configured
Admin alert system for removed componentsNo admin system exists — enforce via code review
GHL page modificationsExternal platform — out of scope for this codebase
Invoice page compliance blocksInvoices are generated in GHL — out of scope

Appendix A: Conversion Flow Diagrams

Flow A — Direct Checkout

Homepage → [MissionWrapper] → Program page → [MissionWrapper + ReinvestmentDisclosure]
→ Pricing → [ReinvestmentDisclosure + ScholarshipCallout] → GHL Checkout (external)

Flow B — Sales Funnel

Homepage → [MissionWrapper] → Program page → [MissionWrapper + ReinvestmentDisclosure]
→ Contact/Book-call → [MissionWrapper + ScholarshipCallout] → Sales call → Invoice (external)

Compliance Touchpoints (both flows)

Entry (any page)
  ↓
Mission framing (MissionWrapper — hero or section variant)
  ↓
Social proof + impact (ImpactModule + Stats with disclaimer)
  ↓
Program/pricing (ReinvestmentDisclosure + ScholarshipCallout)
  ↓
Conversion action (GHL — external; compliance already reinforced)
  ↓
Every page exit (Footer with compliance section)

Appendix B: Component File Map

src/
├── components/
│   ├── MissionWrapper.tsx          ← NEW (P2)
│   ├── ReinvestmentDisclosure.tsx   ← NEW (P3)
│   ├── ScholarshipCallout.tsx       ← NEW (P4)
│   ├── ImpactModule.tsx             ← NEW (P5)
│   ├── Footer.tsx                   ← MODIFY (P1)
│   ├── Pricing.tsx                  ← MODIFY (P7, P8)
│   ├── Stats.tsx                    ← MODIFY (P8)
│   ├── Transformation.tsx           ← MODIFY (P8)
│   ├── Hero.tsx                     ← MODIFY (P9 — CTA labels)
│   ├── CTA.tsx                      ← MODIFY (P9 — CTA labels)
│   └── CTAButton.tsx                ← MODIFY (P9 — CTA labels)
├── app/
│   ├── page.tsx                     ← MODIFY (P6 — add components)
│   ├── layout.tsx                   ← MODIFY (P10 — metadata)
│   ├── services/page.tsx            ← MODIFY (P7)
│   ├── contact/page.tsx             ← MODIFY (P11)
│   ├── about/page.tsx               ← MODIFY (P11)
│   ├── acquisition/page.tsx         ← MODIFY (P11)
│   ├── webinar/page.tsx             ← MODIFY (P11)
│   ├── courses/page.tsx             ← MODIFY (P7)
│   └── tools/page.tsx               ← MODIFY (P7)
└── lib/
    └── links.ts                     ← MODIFY (P0 — add NONPROFIT + IMPACT_METRICS)

Appendix C: Placeholder Values Requiring Real Data

Before production deployment, the following values must be replaced with verified data:

ConstantPlaceholderOwner
NONPROFIT.ein"XX-XXXXXXX"Legal/Finance
IMPACT_METRICS.jobsCreated.value"XXX"Operations
IMPACT_METRICS.scholarshipsAwarded.value"XX"Scholarships team
IMPACT_METRICS.communitiesServed.value"XX"Operations

What's inside

10 sections: audit summary, gap matrix, data layer, 5 component specs, integration map, CTA rules, copy enforcement, build order, acceptance criteria, out-of-scope list

Change this for your project

  • Replace "XX-XXXXXXX" with your real EIN
  • Replace "XXX" placeholders in IMPACT_METRICS with your actual data
  • Replace "Azgari Foundation" with your organization name
  • Replace "Azgari Foundation" in copyright line with your org name

Where it goes

Keep in docs/ or alongside the feature. Agents read it to implement against a defined contract.

Worth borrowing

  • Centralizing all compliance copy in a single NONPROFIT constant to prevent hardcoding and make accidental deletion visible in code review
  • Using a page-level integration matrix to enforce which compliance elements appear on every route
  • Explicitly listing what not to build to keep scope tight and avoid feature creep

Related Documents