DraftDaily — Data Integration

Low-fi wireframe · Jordan · v0.1 · Apr 17, 2026
WORK IN PROGRESS
What data we need, grouped by where it comes from and who owns it.
LAYER 1 · SLATE
Raw slate data
  • Games & start times
  • Rosters + positions
  • Injuries / lineups
  • Weather (MLB/NFL)
  • DFS salaries per platform
LAYER 2 · MODEL
Projections
  • Proj fantasy points
  • Variance / confidence
  • Usage, pace, matchup
  • Model version + run ts
LAYER 3 · DERIVED
Picks + value
  • Value score (proj÷$)
  • Edge vs. market
  • Top-3 ranker output
  • AI blurb (cached)
LAYER 4 · USER
User state
  • Auth / session
  • Preferences
  • Push tokens
  • Streak, tails, reads
LAYER 5 · $$
Attribution
  • CTA click events
  • Partner → pick → user
  • Conversions (if feed)
  • Revenue reconciliation
external source internal core / product differentiator user-facing output
How data moves from provider → app, once per day.
Sports feed
Sportradar / SDIO
Ingest
cron · 6 AM
Warehouse
Postgres
Projection
model · 8:30 AM
Top-3 picker
rank by edge
Blurb gen
LLM · cached
Slate JSON
immutable · 1/day
Mobile API
CDN cached
App
iOS / Android
CTA click
tracked link
Partner
DK / FD / PP / UD
The rhythm the whole product runs on. All times ET.
6:00 AMmorning pull
Pull fresh slate data. Games, confirmed lineups, latest injury reports, weather. Retry logic for late-posting rosters.
cronsportradar
8:30 AMmodel run
Run projection model. Score every eligible player, compute value = proj÷salary per platform. Rank, select top 3 per sport with liquidity floor.
model
8:45 AMblurbs + QA
Generate AI blurbs, cache to slate JSON. Human QA pass on top-3 reads sanity-check. Slate becomes immutable.
llm
9:00 AMpublish
Publish slate. Fire push notifications. Warm CDN cache. App fetches today's slate on cold start.
fcm / apnsslate/today
Throughoutmonitor
Watch for late scratches. If a published pick is ruled OUT, push "pick affected" alert. Only case where a slate mutates mid-day.
alert
7:30 PMlock
Lock slate. Client switches to live-tracking mode. Low-latency score feed drives the lock-screen ticker.
live/scores
11:59 PMsettle
Settle results. Compute hit rate per pick, update user streaks, archive day to history.
settle
Things I need your call on before I can commit to a design.
Answer these first — everything downstream depends on them.
Q1

Projections: build or buy?

Build. Differentiator. 3–6 mo lead time. Needs a DS.
License. Ship in weeks. Same numbers as competitors.
Hybrid. License day 1; build over time.
Q2

Launch sports?

NBA only. 1 model, 1 schedule.
NBA + MLB. 2x data, daily year-round.
All 4. Full promise — slow.
Q3

Salary source?

Partner feed. Clean — depends on deal.
Scrape. Cheap. ToS risk.
Manual. MVP only. Doesn't scale.
Q4

Live tracking?

Real-time. Websocket. Sticky. $.
Polling (30s). Good enough.
Manual refresh. Skip it v1.
Q5

Auth gate?

Required. Know every user.
Optional. Gate only alerts+history.
None v1. Anonymous device IDs.
Q6

Regions / legality?

US only. Geofence allowed states.
US + CA. Similar rules.
Global content-only. No picks where gated.
A narrow slice that ships in weeks, not months. Everything else queued for v2+.

In scope — v1

  • NBA only
  • Licensed projection source (1 provider)
  • One publish/day · 9:00 AM ET
  • 3 picks, one platform per pick
  • AI blurbs generated at publish
  • Anonymous browse · optional sign-in for alerts
  • Affiliate CTA as tracked outbound link
  • History computed from stored slates
  • Daily push notifications
  • Lock at 7:30 PM · static "locked" UI

Out of scope — v2+

  • Proprietary projection model
  • Live in-game score tracking
  • MLB / NFL / NHL
  • Multi-platform cross-comparison
  • Parlays, lineup builder
  • User-submitted picks / social
  • Partner conversion attribution
  • Subscription tier / pro features
  • Web version
A starting point — 4 entities cover most of v1.
slate
iduuid
sportenum
datedate
published_atts
locks_atts
model_versionstr
pick
iduuid
slate_idfk
rank1..3
player_idfk
proj / salary / valuenum
blurbtext
platformenum
result (nullable)enum
player
iduuid
ext_idstr
name / team / posstr
injury_statusenum
updated_atts
user
iduuid
device_idstr
push_tokenstr?
prefsjsonb
streakint
Next → answer Q1–Q6 · then wire into UI as real states, empty/loading/error handling.
Early access

Be first in line.

Daily DFS edge. Data-driven picks. One app. See you at 9 AM ET.