CLAUDE.md — ftpartners.com-ssg

Tech Stack


Directory Structure

_data/          # JS data files — each fetches a Contentful content type
_includes/      # Layouts, partials, utilities
  utils/
    entry-fetcher.js   # Wraps Contentful SDK, handles pagination
    slugify.js
fintech-strategic-insights/   # Research report pages
interviews/                   # VIP panel / interview pages

Contentful Content Types

Content Type ID Description URL Pattern
researchReportPage Research reports (main library) /fintech-strategic-insights/{slug}/
almanacReportPage Almanac reports (special layout) /fintech-strategic-insights/{slug}/
vipConferencePage VIP panel video pages /interviews/{slug}/
interview Executive interview pages /fintech-strategic-insights/library/interviews/{slug}/
curatedList Ordered lists of mixed content items Keyed by internalId field
customPage Catch-all for misc pages Uses internalUrl field

researchReportPage Fields

Field Type Notes
title Short text
slug Short text Used in permalink
featureTitle Short text Headline on feature/landing sections
featuredSummary RichText ⚠️ Must be RichText document, NOT a string
featuredImage Asset link
coverImage Asset link Cover shown on detail page
ctaLabel Short text Button label (default: "View")
reportUrl Short text DocSend/external link (use when no PDF)
reportPdf Asset link Direct PDF asset (optional)
summary RichText Full executive summary on detail page
slideImages Asset array Featured page slides (lightbox)
cardTitle Short text Card heading on index listing
cardSummary RichText ⚠️ Must be RichText document, NOT a string

vipConferencePage Fields

Field Type Notes
title Short text Full conference title
slug Short text Used in permalink
vimeoUrl Short text Full Vimeo player URL (https://player.vimeo.com/video/{ID})
featuredImage Asset link Primary image (shown below video)
coverImage Asset link Cover image (fallback for featuredImage)
summary RichText Full conference description
slideImages Asset array Optional: Featured slides (lightbox)
cardTitle Short text Card heading on index listing
cardSummary RichText Card description (falls back to summary)
cardImage Asset link Card image (falls back to featuredImage)
cardCtaLabel Short text Card button label (falls back to ctaLabel, then "Watch the recording")
publicationDate Date Conference date (used for sorting)
ctaLabel Short text Detail page button label
includeInList Boolean Controls visibility in index listings. If false, page is still built and accessible via direct URL but hidden from listing pages.

almanacReportPage Fields

Field Type Notes
title Short text Almanac title (e.g., "FinTech Almanac Q4 2024")
slug Short text Used in permalink
category Short text Category for grouping (e.g., "fintech", "insurtech", "payments")
year Number Publication year (e.g., 2024, 2025)
quarter Number Quarter: 1-3 for quarterly, 4 for annual/full-year reports
reportTitle Short text Optional subtitle for the report section
summary RichText Almanac introduction/description
coverImage Asset link Cover image shown with report
reportUrl Short text DocSend/external link (use when no PDF)
reportPdf Asset link Direct PDF asset (optional)
ctaLabel Short text Button label (default: "View Report")
slideImages Asset array Featured page thumbnails (lightbox)
leftContent RichText Left column content (full template only)
rightContent RichText Right column content (full template only)

Template Behavior:


Contentful Import JSON Format

File: contentful-import-research-reports.json (created per-batch, not committed)

{
  "assets": [ ... ],
  "entries": [ ... ]
}

Asset format

{
  "sys": { "id": "asset-{slug}-cover" },
  "fields": {
    "title": { "en-US": "Description" },
    "file": {
      "en-US": {
        "contentType": "image/png",
        "fileName": "filename.png",
        "url": "https://www.ftpartners.com/assets/images/..."
      }
    }
  }
}

⚠️ Use "url" — NOT "upload" — for the file field key.

Entry format

{
  "sys": {
    "id": "research-report-{slug}",
    "contentType": { "sys": { "type": "Link", "linkType": "ContentType", "id": "researchReportPage" } }
  },
  "fields": {
    "title":        { "en-US": "..." },
    "slug":         { "en-US": "..." },
    "featureTitle": { "en-US": "..." },
    "ctaLabel":     { "en-US": "View" },
    "reportUrl":    { "en-US": "https://finte.ch/..." },
    "featuredImage": { "en-US": { "sys": { "type": "Link", "linkType": "Asset", "id": "asset-{slug}-cover" } } },
    "coverImage":    { "en-US": { "sys": { "type": "Link", "linkType": "Asset", "id": "asset-{slug}-cover" } } },
    "slideImages":   { "en-US": [ { "sys": { "type": "Link", "linkType": "Asset", "id": "asset-{slug}-slide-1" } }, ... ] },
    "featuredSummary":  { "en-US": { "nodeType": "document", "data": {}, "content": [ { "nodeType": "paragraph", ... } ] } },
    "cardTitle":     { "en-US": "..." },
    "cardSummary":   { "en-US": { "nodeType": "document", "data": {}, "content": [ { "nodeType": "paragraph", ... } ] } },
    "summary":       { "en-US": { "nodeType": "document", "data": {}, "content": [ ... ] } }
  }
}

RichText Document Structure

Plain paragraph

{
  "nodeType": "document", "data": {},
  "content": [
    { "nodeType": "paragraph", "data": {}, "content": [
      { "nodeType": "text", "value": "Text here.", "marks": [], "data": {} }
    ]}
  ]
}

Summary with Executive Summary heading + bullets

{
  "nodeType": "document", "data": {},
  "content": [
    { "nodeType": "heading-4", "data": {}, "content": [
      { "nodeType": "text", "value": "Executive Summary:", "marks": [{ "type": "bold" }], "data": {} }
    ]},
    { "nodeType": "paragraph", "data": {}, "content": [
      { "nodeType": "text", "value": "Main summary text...", "marks": [], "data": {} }
    ]},
    { "nodeType": "paragraph", "data": {}, "content": [
      { "nodeType": "text", "value": "Key discussion topics of the report include:", "marks": [{ "type": "italic" }], "data": {} }
    ]},
    { "nodeType": "unordered-list", "data": {}, "content": [
      { "nodeType": "list-item", "data": {}, "content": [
        { "nodeType": "paragraph", "data": {}, "content": [
          { "nodeType": "text", "value": "Bullet item", "marks": [], "data": {} }
        ]}
      ]}
    ]}
  ]
}

Hyperlink (inline)

When source HTML contains <a href="...">link text</a> inside summary paragraphs, use:

{ "nodeType": "hyperlink", "data": { "uri": "https://full-url-here.com" }, "content": [
  { "nodeType": "text", "value": "link text", "marks": [], "data": {} }
]}

Internal links using / must be converted to full URLs: https://www.ftpartners.com/.

⚠️ Only bilt-overview had inline links in its summary text. All other reports use plain text.


Image URL Construction

/assets/ = /assets/ → full URL = https://www.ftpartners.com/assets/images/...

Common image paths:

/assets/images/ftresearch/fintech-africa/
/assets/images/ftresearch/wift/
/assets/images/ftresearch/bilt/
/assets/images/ftresearch/what-to-watch/
/assets/images/ftresearch/spot-etf/
/assets/images/stablecoin/
/assets/images/interviews/wift-2025/
/assets/images/ftresearch/fintech-2025/
/assets/images/ftresearch/UnlockingDataCover.png
/assets/images/ftresearch/auto/

Workflow: Migrating a Static Page to Contentful

  1. Read the .liquid file to extract: title, slug, summary text, image paths, reportUrl, slide images, cardTitle/cardSummary (from index.liquid "Selected Reports" section)
  2. Build contentful-import-research-reports.json with assets + entry
  3. Import via npx contentful-import --space-id ... --management-token ... --content-file contentful-import-research-reports.json
  4. Delete the static .liquid file — leaving it causes an 11ty output conflict with research-report-detail.liquid

curatedLists.js — enrichItem Pattern

_data/curatedLists.js computes added.url per content type:

researchReportPage  → /fintech-strategic-insights/{slug}/
almanacReportPage   → /fintech-strategic-insights/{slug}/
vipConferencePage   → /interviews/{slug}/
interview           → /fintech-strategic-insights/library/interviews/{slug}/  (or bitlyLink if no slug)
customPage          → item.fields.internalUrl

Known Gotchas


Imported Reports (completed)

Batch 1: stablecoin-payments, women-in-fintech-2025, fintech-2025, digital-asset-ecosystem, parking-payments

Batch 2: fintech-in-africa-thriving-opportunity, women-in-fintech-resilience, bilt-overview, what-to-watch-2024, spot-etf

Remaining Static Reports (not yet imported)

See "Selected Reports" section of fintech-strategic-insights/index.liquid for card copy: fintech-in-india, innovations-in-payroll, women-in-fintech-rising-stars, blockchain-accounting, b2b-payments, blockchain-economy, women-in-fintech2022, race-to-super-app, buy-now-pay-later, open-banking-rearchitecting-financial-landscape, women-in-fintech, alternative-investments, challenger-banks, brazil-fintech, wealth-technology-report

Some entries (healthcare-payments, stablecoins video recap, youth-focused-fintech, insurtech, auto-fintech) link directly to external DocSend URLs and may not have a corresponding static .liquid page.