Below projected pace but above the 70% at-risk threshold
at_risk
Significantly behind pace (below 70% of projected)
completed
Period has ended and target was met
missed
Period has ended and target was not met
The advisory object
Every compliance result includes an advisory block. When has_advisory is false, the displayed progress is likely final and the object can be ignored. When true, the messages array contains one human-readable explanation per active flag.
Advisory flags
Field
Type
Condition
period_in_progress
boolean
Current wall-clock time is before the period end. Actual counts will grow until period close.
period_recently_ended
boolean
Period ended within the last 48 hours. Late-period posts may still be processing through scrape.
scrape_stale
boolean
Creator's stats scrape is turning stale or overdue. Views, engagement, or follower counts may undercount until the next scrape runs.
not_yet_started
boolean
The goal has a start_date set in the future. No data has accrued yet.
has_advisory
boolean
Advisory context fields
Field
Type
Description
period_start
ISO timestamp
UTC start of the current period
period_end
ISO timestamp
UTC end of the current period
hours_until_period_end
number | null
Hours remaining until period closes; null if period already ended
hours_since_period_end
number | null
Hours elapsed since period closed; null if period is still open
scrape_freshness
object | null
Relationship to aggregate endpoint
Use case
Endpoint
Dashboard summary (counts only)
GET /api/v1/analytics/aggregate/goal-compliance
Per-creator, per-goal detail with advisories
GET /api/v1/projects/:id/goal-compliance
Single creator's goals
GET /api/v1/projects/:id/goal-compliance?creator_id=<uuid>
"uuid"
,
"metric": "posts",
"period": "weekly",
"target_value": 15,
"start_date": null,
"end_date": null,
"is_active": true
},
"target": 15,
"actual": 11,
"percentage": 73,
"status": "behind_pace",
"advisory": {
"period_in_progress": true,
"period_recently_ended": false,
"scrape_stale": false,
"not_yet_started": false,
"has_advisory": true,
"period_start": "2026-05-18T05:00:00.000Z",
"period_end": "2026-05-25T04:59:59.999Z",
"hours_until_period_end": 89.4,
"hours_since_period_end": null,
"scrape_freshness": null,
"goal_start_date": null,
"messages": [
"Period in progress — closes in 3 days. Final actual may be higher."
]
}
}
]
}
],
"error": null,
"meta": {
"org_tz": "America/Chicago",
"reference_date": "2026-05-20"
}
}
true when period_recently_ended is true. Drives the UI caution icon. The other flags are available for programmatic use but do not set has_advisory.
Full freshness summary (bucket, age, tooltip) when scrape_stale is true; null otherwise
goal_start_date
YYYY-MM-DD | null
The goal's start_date, when not_yet_started is true
messages
string[]
One pre-formatted explanation string per active flag, safe to display directly