Skip to main content

Developer Page Specifications

Data Model

10 tables. FounderFileLead is the legal record — never hard-delete, 7-year retention.

Complete

10 tables: FounderFile core + FounderFileLang + 3 child tables (LearningPoints, BestFor, Artifacts) + 2 join tables (Authors, Topics) + Sponsor + FounderFileLead + FounderFileReadSession. The consent record on FounderFileLead is GDPR/PDPL load-bearing — never delete, never bypass.

Table 1 · FounderFile (core)

Id, Slug, Number
Id (uuid PK), Slug (varchar(120) unique), Number (varchar(8), e.g. "FF#04", auto-assigned).
Category, ReadingTimeMinutes
Category enum (strategy | operations | fundraising | product | sales | leadership | hiring). ReadingTimeMinutes (int, computed from body word count, denormalised for fast card display).
CoverImageUrl, SponsorId, IsFeatured, IsActive
Cover: 3:4 portrait. Sponsor FK nullable (most files unsponsored). IsFeatured drives banner B on listing.
DownloadCount (int, denormalised counter)
Atomic increment on every successful POST /api/founder-files/{id}/leads. Drives "most-downloaded" sort.
PublishedAt, CreatedAt, UpdatedAt
Standard timestamps.

Tables 2-10 · Companions

  • FounderFileLang (composite PK FounderFileId + Lang): Title, BestForTagline, Subtitle?, MetaTitle?, MetaDescription?, ReaderBodyHtml (sanitised HTML).
  • FounderFileBestForBullet (FK FounderFileId, DisplayOrder, lang companion: Text).
  • FounderFileLearningPoint (FK FounderFileId, DisplayOrder, lang companion: Text).
  • FounderFileArtifact (FK FounderFileId, ArtifactType: pdf | template | checklist | spreadsheet, FileUrl, FileSize, DisplayOrder, lang: Label).
  • FounderFileAuthor (join: FounderFileId ↔ FounderId, DisplayOrder).
  • FounderFileTopic (join: FounderFileId ↔ TopicCode).
  • Sponsor (Id, Name, LogoUrl, Tier: gold/silver/bronze, ContractExpiry, ConsentPartnersWebhookUrl).
  • FounderFileLead (Id, FounderFileId, Email, Name, Role, Country, Stage?, ConsentPlatform, ConsentPartners, Source: 'details' | 'reader', CreatedAt, IpAddress, UserAgent).
  • FounderFileReadSession (SessionId, FounderFileId, LeadId?, FirstViewAt, LastViewAt, ScrollDepthPct, CompletedAt?) — analytics-only, not GDPR-sensitive (anonymous unless lead is attached).