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).
