Skip to main content

Developer Page Specifications

Data Model

11 tables. CalendarEvent with 30+ fields in 11 logical clusters. 5 cross-module reference arrays.

Complete

11 tables backing the Calendar. CalendarEvent is the central record (30+ fields organised into 11 logical clusters per §9.6). 4 join tables for the multi-value taxonomies (audiences, stages, sectors, countries when multi-country eligibility). Plus Organizer (shared with Coverage), Country (shared platform-wide), and CalendarEventLang for i18n.

Table 1 · CalendarEvent (core)

Identity
Id (uuid PK), Slug (varchar(120) unique).
Organizer
OrganizerName (varchar(200)), OrganizerType (Accelerator|Incubator|VC|Corporate|Government|University|Community|Media|Other), OrganizerLogoUrl, OrganizerWebsite. Denormalised from Organizer for query speed; Organizer table holds the canonical record + cross-module reference target.
Location
CountryCode, City, Venue, VenueAddress, GeoLat (numeric), GeoLng (numeric), OnlineUrl, Mode (physical|online|hybrid).
Time
StartDate (timestamptz, required), EndDate (timestamptz, nullable), Timezone (IANA, e.g. Africa/Cairo, required), RegistrationDeadline, ApplicationDeadline.
Classification
Category (1 of 17 values), Status (computed-but-stored: upcoming|open|closing-soon|live|completed|postponed|cancelled). Industries (text[], free taxonomy).
Action URLs
WebsiteUrl, RegistrationUrl, ApplyUrl, ContactEmail. SocialLinks (jsonb: twitter, linkedin, instagram).
Media
CoverImageUrl (16:9 ≥1200×675), LogoUrl.
Provenance
SourceUrl (required), VerificationStatus (pending|verified|rejected|needs_info, required), LastVerifiedAt, VerifiedByUserId.
Editorial decisions
EditorialPriority (standard|featured|spotlight, default standard), CoverageEligible (bool), CoverageStatus (not_planned|planned|covered).
Cross-module reference arrays
RelatedEditorialIds (uuid[]), RelatedStartupIds, RelatedFounderIds, RelatedOpportunityIds, RelatedFileIds. All optional.
SEO + audit
MetaTitleLang + MetaDescriptionLang stored on CalendarEventLang. CreatedAt, UpdatedAt, PublishedAt.

Tables 2-11

  • CalendarEventLang (composite PK EventId + Lang): Title, ShortDescription, FullDescription, WhyItMatters?, MetaTitle?, MetaDescription?.
  • CalendarEventAudience (join: EventId ↔ AudienceCode). AudienceCode values: founders, startups, investors, students, operators, ecosystem-builders, corporates, government, media.
  • CalendarEventStage (join: EventId ↔ StageCode). StageCode mirrors Opportunity Radar stages.
  • CalendarEventSector (join: EventId ↔ SectorCode).
  • CalendarEventCountry (join: EventId ↔ CountryCode) — for multi-country eligibility (anchor country lives on CalendarEvent.CountryCode).
  • Organizer (Id, Name, Type, CountryCode, LogoUrl, WebsiteUrl, IsVerified). DescriptionLang companion.
  • Country (shared lookup, Id, Code, NameLang, Region: GCC|Levant|North Africa).
  • EventCategory (lookup, Slug, NameLang, DescriptionLang, IconKey).
  • CalendarEventSubmission (Id, EventId, SubmitterEmail, SubmitterName, RawPayload jsonb, Status: pending|verified|rejected|needs-info, CreatedAt, IpAddress).
  • CalendarEventAuditLog (Id, EventId, Action: created|updated|verified|published|postponed|cancelled, ActorUserId, ActorIp, BeforeJson, AfterJson, CreatedAt). Append-only.