Account & User Management
| Table Name |
Purpose |
Key Relationships |
accounts |
User account management with profile, contact info, and IsFreeAccount flag |
One-to-many with Jobs, Files, SymbolLists, Payments |
accountemailaddresses |
Multiple email addresses per account |
References Accounts |
accountemailvalidationtokens |
Email validation token management |
References Accounts |
accountsmsnumbers |
SMS phone numbers for notifications |
References Accounts |
accountfolders |
Links accounts to their folders |
References Accounts and Folders |
adminusers |
Admin user management with Azure AD integration and role-based access |
Standalone admin authentication |
loginhistories |
User login tracking with IP, location, and device info |
References Accounts |
creditcards |
Tokenized credit card storage via Stripe |
References Accounts |
Report Generation & Jobs
| Table Name |
Purpose |
Key Relationships |
jobs |
Report generation job tracking with status, priority, processing metadata, and FmpApiCallCount |
References Accounts, JobStatusTypes |
jobstatustypes |
Job processing status definitions (Queued, Processing, Complete, etc.) |
Referenced by Jobs |
jobsymbollists |
Links jobs to symbol lists for report generation |
References Jobs and SymbolLists |
jobfolders |
Links jobs to output folders |
References Jobs and Folders |
jobcharges |
Links jobs to their billing charges |
References Jobs, Charges, Accounts |
sharelinks |
Public share links for completed reports — CSPRNG token (the only identifier exposed in URLs), creation/expiry/revocation timestamps, unique-viewer count |
References Accounts and Jobs |
sharelinkviews |
Per-viewer-per-day view dedupe rows (SHA-256 IP hash + UTC date unique key) — makes view counting idempotent and feeds the FMP End User tier stats |
References ShareLinks |
jobnotificationsettings |
Job completion notification preferences |
References Jobs |
jobnotificationsaccountemailaddresses |
Email addresses for job completion notifications |
References JobNotificationSettings, AccountEmailAddresses |
jobnotificationsaccountsmsnumbers |
SMS numbers for job completion notifications |
References JobNotificationSettings, AccountSmsNumbers |
reportgenerationschedules |
Scheduled/recurring report generation with cron-like configuration. Stores TimeZoneId (IANA) to convert user local time to UTC for accurate scheduling. |
References Accounts and Jobs |
Symbol Lists & Templates
| Table Name |
Purpose |
Key Relationships |
symbollists |
Named collections of stock symbols for analysis |
References Accounts |
symbollistitems |
Individual stock symbols within a list |
References SymbolLists |
symbollisttemplates |
Pre-built symbol list templates (system-provided or customer-created) |
References Accounts (creator), has IsSystemProvided flag |
symbollisttemplateitems |
Individual stock symbols within a template |
References SymbolListTemplates |
Files & Storage
| Table Name |
Purpose |
Key Relationships |
files |
Generated report files with Azure Blob Storage references |
References Jobs, Folders, Accounts, CouponCodes |
filedownloads |
File download tracking and analytics |
References Files |
folders |
Hierarchical file organization with parent/sibling structure |
Self-referencing parent/sibling structure |
downloads |
Bulk download packaging and delivery (ZIP bundles) |
References Accounts and Files |
Portfolio & Position Reports
| Table Name |
Purpose |
Key Relationships |
positionreports |
Portfolio position tracking reports with name and description |
References Accounts |
positionreportlistitems |
Individual stock positions (symbol, shares, cost basis) within a report |
References PositionReports |
AI Analysis
| Table Name |
Purpose |
Key Relationships |
claudeanalysisjobs |
Claude AI analysis job tracking with status, model selection, and cost |
References Accounts |
claudeanalysisrequests |
Individual file analysis requests within a Claude analysis job |
References ClaudeAnalysisJobs, Files |
reportcomparisonjobs |
Report comparison job tracking with status and date range parameters |
References Accounts |
reportcomparisonjobsymbollists |
Links report comparison jobs to symbol lists being compared |
References ReportComparisonJobs and SymbolLists |
Billing & Payments
| Table Name |
Purpose |
Key Relationships |
charges |
Service usage charges with amount, description, billing period, InternalCost, and ChargeType |
References Accounts, linked to JobCharges and InvoiceCharges |
invoices |
Monthly billing invoices with status and payment tracking |
References Accounts |
invoicecharges |
Links itemized charges to invoices |
References Invoices and Charges |
payments |
Payment transaction records processed via Stripe |
References Accounts |
billingruns |
Monthly billing process execution tracking |
Tracks billing cycle status and timing |
billingrunaccounts |
Per-account processing status within a monthly billing run (success/failure and error detail) |
References BillingRuns and Accounts |
servicepricings |
Service pricing configuration, rate management, and CostPerUnit tracking |
System-wide pricing rules |
couponcodes |
Promotional codes for paid-tier discounts (free-tier entitlements are derived, not table-driven) |
Referenced by CouponUsage and Files |
couponusage |
Tracks coupon code redemption per account |
References Accounts, CouponCodes, Jobs |
failedpaymentreconciliations |
Tracks failed Stripe payments for manual reconciliation |
References Accounts |
operationalexpenses |
Operational expense tracking with Category, Description, Amount, Frequency, ExpenseDate, ExpenseYear, ExpenseMonth for cost and margin analytics |
Standalone expense management |
Stripe Integration
| Table Name |
Purpose |
Key Relationships |
stripewebhookevents |
Idempotent Stripe webhook event processing log |
Standalone event tracking |
striperefunds |
Stripe refund transaction records |
References Accounts |
stripedisputes |
Stripe payment dispute/chargeback tracking |
References Accounts |
Notifications & Messaging
| Table Name |
Purpose |
Key Relationships |
emailstosend |
Email notification queue with retry support and SendGrid integration |
Async email processing |
smsstosend |
SMS notification queue with retry support and Twilio integration |
Async SMS processing |
adminnotificationemailaddresses |
Admin email addresses for system notification alerts |
Standalone admin configuration |
Platform & Content Management
| Table Name |
Purpose |
Key Relationships |
supportrequests |
Customer support tickets with priority, status, and admin response tracking |
References Accounts |
featurerequests |
User-submitted feature ideas with category, status workflow, and admin notes |
References Accounts |
platformfeedback |
Smile/frown sentiment feedback from any page, supports public and authenticated users |
Optionally references Accounts |
bugreports |
Structured bug reports with severity, steps to reproduce, and admin triage status |
Optionally references Accounts |
knowledgebasearticles |
Self-service help center articles with categories, slugs, and publish/draft status |
Standalone content management |
announcements |
Platform-wide announcements with start/end dates and severity levels |
Standalone, polled by client apps |
changelogentries |
Version history and release notes with publish/draft workflow |
Standalone content management |
maintenancewindows |
Scheduled maintenance periods with start/end times and user-facing descriptions |
Standalone, polled by client apps |
emailpreferences |
Per-account email opt-in/opt-out preferences for different notification categories |
References Accounts (unique constraint) |
blogposts |
Blog articles with rich content, categories, slugs, view counts, and publish/draft status |
Standalone content management |
SEO & Public Ticker Pages
| Table |
Purpose |
Key Relationships |
publictickers |
Curated tickers published as free SEO grade pages (/grade/{TICKER}), with the cached generation snapshot: grade, grade date, headline stats JSON, Claude summary, and per-ticker generation status |
Standalone; unique Ticker; written by SeoPageBuilder |
publictickergroups |
Named ticker groups/indexes (S&P 500, Nasdaq, Dow Jones from FMP constituents; Russell 2000 via IWM ETF holdings; manual lists), with source type and sync timestamps |
Standalone; unique Slug |
publictickergroupmembers |
Membership of tickers in groups — drives the /grade/ landing page sections and related-ticker internal links |
References PublicTickerGroups (cascade delete, unique group+ticker) |
publictickerrefreshjobs |
Queue for page-regeneration runs: admin "Refresh & Republish" button and the monthly auto-check enqueue; the SeoPageBuilder VM service polls, executes, and records success/failure counts |
Standalone job queue |
Market Data Cache & Report Builds
| Table |
Purpose |
Key Relationships |
fmppricecache |
Daily OHLCV price bars per symbol — ~5,650 symbols back to 2006; closed trading days are immutable, so cached bars are never refetched |
Standalone; unique Symbol+TradeDate |
fmpstatementcache |
Financial statements and key metrics per symbol and period; closed fiscal years never expire — paid for once, kept forever |
Standalone; keyed by Symbol+StatementType+Period |
fmpprofilecache |
Company profiles (name, sector, market cap, description) |
Standalone; unique Symbol |
fmpsentimentcache |
Social/news sentiment series per symbol |
Standalone; unique Symbol |
fmpcachestates |
Completeness watermark per symbol/data type — answers "does the cache hold the N most recent periods" without counting rows on every read |
Standalone; unique Symbol+DataType |
fmpcachedailystats |
Per-day cache hit/miss/savings accounting — feeds the AdminWeb FMP Cache Operations dashboard |
Standalone; one row per day |
fmpnewscache |
The permanent news archive: immutable articles deduplicated by URL hash, kept forever by decision as a backtesting corpus; filled by the market-wide news wire poller |
Standalone; unique Symbol+UrlHash |
fmpnewsfetchstate |
Per-symbol news freshness timestamps, plus the @FEED sentinel row the wire poller touches so read-through knows the wire is active |
Standalone; unique Symbol |
fmpnewspolllog |
One row per news-wire poll: calls spent, articles fetched, new rows after dedup — the accounting behind the poller's ~$10/month cost guarantee |
Standalone; indexed by PolledUtc |
reportbuilds |
Build-level bookkeeping for a report job using the build cache: progress that survives the process, and a hard TTL so a crashed job cannot leak projections |
References Jobs |
reportbuildprojections |
Per-symbol pre-computed projections for an in-flight report build (dashboard and globstats rows); fat records live in blob storage, rows evicted at job end |
References Jobs (unique Job+Symbol+Kind) |
Logging & Monitoring
| Table Name |
Purpose |
Key Relationships |
activitylogentries |
Tracks user activity events with type, name, detail, and app source |
References Accounts |
auditlogs |
Tracks entity changes with old/new values for compliance |
References Accounts |
criticalerrorlogs |
Logs critical errors from background processors with resolution tracking |
Standalone, indexed by ServiceName and IsResolved |
systemhealthchecks |
System health monitoring records with disk, memory, CPU, database, API connectivity, and background service status metrics |
Standalone, written by HealthMonitor background service |
generationratelimitevents |
Per-account report-generation rate-limit events for abuse hardening (records throttled/blocked generation attempts) |
References Accounts |
Macro Dashboard (MacroDbContext)
Deliberately tiny by design — the Macro Dashboard's blob-wholesale / MySQL-sliver storage split keeps
the heavy data (snapshots, 38 full-history series, playbook, archives) in blob storage; these three
tables hold only what must answer a query.
| Table Name |
Purpose |
Key Relationships |
macroengineruns |
The macro engine's run queue and log — every trigger (scheduled, release-aware, admin, backfill) with status, timing, and series fetched/stale counts |
Standalone (referenced by macroregimehistory) |
macroregimehistory |
Event log of regime and Macro Grade changes — the queryable "what changed and when" behind the dashboard's history |
References macroengineruns (trigger run) |
macrosharelinks |
Pinned-snapshot share links: bearer token + blob path + view count; the snapshot payload itself lives in blob storage, never here |
References Accounts (by id) |