Grant Pages — Content Architecture

Directory structure

grants/
  <programme-slug>/
    index.md          # Programme landing page (type: programme)
    <call-slug>.md    # Specific call page (type: call)
    <call-slug>.md    # Another call under the same programme

Each programme has one index.md and zero or more call pages as siblings.

Two page types

Programme pages (type: programme)

Landing pages for funding programmes (Horizon Europe, Business Finland, Global Gateway, etc.). These aggregate their child call pages automatically.

---
layout: grant.njk
type: programme
order: 1                    # display order on /grants/ listing
status: open|closed|upcoming

title: "Programme Name"
shortTitle: "Short Name"
description: "2-3 sentence summary"

hero:
  label: "Grant Programme"  # literal value, always this
  titleLine1: "First Part"
  titleHighlight: "Highlighted Part"
  subtitle: "Full description"

openCalls:
  heading: "OPEN"
  headingHighlight: "CALLS"
  moreCallsText: "Text about call frequency"

customSections:
  - type: about
    heading: "ABOUT PROGRAMME"
    text: "Description paragraph"
  - type: stats
    items:
      - value: "90%"
        label: "Funding Rate"
  - type: list
    heading: "FOCUS AREAS"
    items:
      - "**Bold label** — description"
  - type: grid
    heading: "HEADING"
    items:
      - title: "Card Title"
        description: "Card description"

finalCta:
  style: default
  headline: "CTA Headline"
  headlineLine2: "Second line"
  subtitle: "Supporting text"
  buttons:
    - text: "Button"
      href: "/path/"
      style: primary
---

Call pages (type: call)

Specific funding calls within a programme. These are the pages users land on.

---
layout: grant.njk
type: call
status: open|closed|pending
programme: "Parent Programme"           # REQUIRED — must match parent index.md title
programmes: ["Cross-ref Programme"]     # OPTIONAL — cross-references to other programme pages
industries: ["energy", "ai-tech", ...]  # for filtering on listings

title: "Full Call Title"
shortTitle: "Short Name"
callId: "CALL-ID-2026"                  # OPTIONAL — official call reference
description: "1-2 sentence summary with budget, who, timeline"

hero:
  badge: "Now Open|Upcoming|Closed"
  headline: "Main headline text"
  headlineHighlight: "Highlighted portion"
  subtitle: "Full description paragraph"
  ctas:
    - text: "Check My Eligibility"
      href: "#eligibility-form"
      style: primary
    - text: "View Topics"
      href: "#topics"
      style: outline

deadline:                               # OPTIONAL — omit if rolling/no fixed deadline
  date: "YYYY-MM-DD"
  lastOnboarding: "MMM DD"             # display format
  lastOnboardingDate: "YYYY-MM-DD"     # last date to engage Fundwiser
  submissionLabel: "MMM DD"            # display format

stats:                                  # 3-4 key numbers, always present
  - value: "€40.5M"
    label: "Total Budget"
  - value: "€500K–€2M"
    label: "Per Project"
  - value: "90%"
    label: "EU Funding"
  - value: "12–36"
    label: "Month Projects"

aboutHeading: "What Is"
aboutHeadingHighlight: "This Call?"
aboutSidebar:
  title: "What Gets Funded"
  style: checklist                     # always checklist
  items:
    - "Funded activity 1"
    - "Funded activity 2"

eligibility:
  heading: "Is This Grant"
  headingHighlight: "For You?"
  qualify:
    - "Positive eligibility criterion"
  notQualify:
    - "Exclusion criterion"

# ── Optional sections (include as needed) ──────────────────────

topicsLabel: "lots|tracks|strands"
topicsHeading: "Main Heading"
topicsHeadingHighlight: "Highlighted Part"
destinations:
  - name: "Group Name"
    topics:
      - title: "Topic Title"
        budget: "€X.XM"
        description: "What this topic funds"
        featured: true|false

packages:                               # Fundwiser service tiers
  - name: "Eligibility & Strategy"
    items:
      - "Service item"
    price: "Fixed fee"
    cta: "Get Assessed"
    ctaStyle: outline
    featured: false
  - name: "Proposal Development"
    badge: "Most Popular"
    items:
      - "Service item"
    price: "Performance-based pricing"
    cta: "Start Now"
    ctaStyle: primary
    featured: true

faq:
  - question: "Question text?"
    answer: "Answer text"

form:
  subtitle: "Prompt text"
  submitText: "Button label"
  includeAssociated: true|false
  sectorOptions:
    - value: "slug"
      label: "Display Label"
  fields: []

timeline:
  - date: "Month DD, YYYY"
    label: "Event description"
    type: default|highlight|deadline

card:                                   # metadata for homepage/listing cards
  budget: "€X–€YM"
  deadlineDisplay: "Deadline: Month DD, YYYY"
  tags: ["Tag1", "Tag2"]
  featured: true|false
  order: 1

finalCta:
  style: default|yellow
  headline: "CTA Headline"
  headlineLine2: "Second line"
  subtitle: "Supporting text"
  buttons:
    - text: "Button"
      href: "/path/"
      style: primary
---

Cross-referencing calls across programmes

Use the programmes field (plural, array) to make a call appear on other programme pages. The call lives in its primary programme folder but is listed on the cross-referenced programme pages too.

Example: A Finnpartnership call focused on Ukraine:

programme: "Finnpartnership"            # lives in finnpartnership/
programmes: ["Ukraine Recovery"]        # also appears on Ukraine Recovery page

Currently used for Ukraine-related calls that span multiple programmes.

Industry tags

Standard values used across the site:

Status values

Style conventions

Adding a new call

  1. Identify the parent programme — does a grants/<programme>/index.md exist?
  2. If not, create the programme index.md first
  3. Create grants/<programme>/<call-slug>.md using the call template above
  4. Set programme: to match the parent's title exactly
  5. Fill all required sections (hero, stats, about, eligibility)
  6. Add optional sections as needed (topics, packages, faq, form, timeline)
  7. Set status: based on current deadline
  8. Test locally with npm start