UserAccount Token Flow

Orange nodes are background paths that select owner rows before token use; green nodes already consider editor tokens or are not constrained to owners.

flowchart TD
  beat["Celery beat schedule\ncron/every-interval dispatch"]

  subgraph pipeline["V2 metric + onboarding pipeline"]
    discover["AccountSyncService.discover_active_accounts\nOWNER + ACTIVE + refresh_token + non-demo V2"]
    daily["daily_sync_dispatcher\nre-query same OWNER user_account"]
    update["update_metrics_dispatcher\nre-query same OWNER user_account"]
    backfill["backfill_dispatcher / backfill_metrics / full_resync / retry_failed\nuses discover_active_accounts user_id"]
    validate["validate_user_account_for_sync_dispatch\nvalidates selected UserAccount only"]
    metricsTask["sync_account_metrics_task"]
    perf["PerformanceDataManager"]
    exactClients["Facebook/Google clients\nquery exact user+account token"]
    resolverClients["TikTok/LinkedIn/X clients\nresolve_account_token(account, user_id)"]
  end

  subgraph creative["Legacy creative/status background tasks"]
    creativeDaily["account_creatives_daily_sync\nOWNER + ACTIVE"]
    failedCreative["failed_creatives_daily_sync\nOWNER"]
    adStatus["daily_ad_status_sync -> individual_account_status_sync\nOWNER + ACTIVE + refresh_token"]
    getAssets["get_new_assets_task / fetch_ad_creative_data_task"]
  end

  subgraph comments["Comment sync"]
    commentsDaily["comments_daily_sync\nOWNER only identity"]
    tiktokComments["TikTok comment fetch\nuses selected user token"]
    fbCapability["FB comment capability probe\nACTIVE owner/default owner/editor tokens"]
  end

  subgraph migration["Onboarding/migration"]
    migrateV2["migrate_account_to_v2\nOWNER or EDITOR, owner-first"]
    onboarding["sync_account_assets_on_connect\nuses OAuth/request user passed in"]
    onboardingBackfill["dispatch_clickhouse_onboarding_backfill\npasses same user_id into metrics backfill"]
  end

  beat --> daily
  beat --> update
  beat --> creativeDaily
  beat --> failedCreative
  beat --> adStatus
  daily --> discover
  update --> discover
  backfill --> discover
  discover --> validate
  daily --> validate
  update --> validate
  validate --> metricsTask
  backfill --> metricsTask
  metricsTask --> getAssets
  metricsTask --> perf
  getAssets --> perf
  adStatus --> perf
  creativeDaily --> getAssets
  failedCreative --> getAssets
  perf --> exactClients
  perf --> resolverClients
  commentsDaily --> tiktokComments
  commentsDaily --> fbCapability
  migrateV2 --> onboarding
  onboarding --> onboardingBackfill
  onboardingBackfill --> metricsTask
  resolverClients -. "if user_id is passed, helper checks only that row" .-> validate

  classDef ownerOnly fill:#ffe8e0,stroke:#b44,stroke-width:2px,color:#111;
  classDef ok fill:#e8f5e9,stroke:#2e7d32,stroke-width:1px,color:#111;
  classDef downstream fill:#eef3ff,stroke:#4765a8,stroke-width:1px,color:#111;
  class discover,daily,update,backfill,creativeDaily,failedCreative,adStatus,commentsDaily ownerOnly;
  class migrateV2,onboarding,fbCapability ok;
  class perf,exactClients,resolverClients,metricsTask,getAssets,tiktokComments,onboardingBackfill,validate downstream;

  click beat "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/crux_ferrous_insights_app/celery.py&line=187&column=1"
  click discover "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_pipeline_module/services/sync_service.py&line=76&column=1"
  click daily "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_pipeline_module/tasks/pipeline.py&line=178&column=1"
  click update "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_pipeline_module/tasks/pipeline.py&line=386&column=1"
  click backfill "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_pipeline_module/tasks/pipeline.py&line=298&column=1"
  click validate "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/organization_auth/tasks/auth_tasks.py&line=38&column=1"
  click metricsTask "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_pipeline_module/tasks/pipeline.py&line=53&column=1"
  click perf "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/platform_service.py&line=36&column=1"
  click exactClients "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/data_module/services/fb_services.py&line=400&column=1"
  click resolverClients "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/organization_auth/tasks/auth_tasks.py&line=329&column=1"
  click creativeDaily "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=2806&column=1"
  click failedCreative "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=2922&column=1"
  click adStatus "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=3207&column=1"
  click getAssets "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=1123&column=1"
  click commentsDaily "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/comment_analysis/tasks/data_fetch_tasks.py&line=933&column=1"
  click tiktokComments "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/comment_analysis/tasks/data_fetch_tasks.py&line=343&column=1"
  click fbCapability "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/comment_analysis/services/fb_comment_capability.py&line=283&column=1"
  click migrateV2 "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/management/commands/migrate_account_to_v2.py&line=251&column=1"
  click onboarding "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=1757&column=1"
  click onboardingBackfill "zed-open://open?path=/Users/pranavanurag/Documents/code/crus_ferrous_insights_app/creative_module/tasks/ad_creative_task.py&line=2121&column=1"