diff --git a/apps/docs/content/docs/platform/enterprise/usage-tracking.mdx b/apps/docs/content/docs/platform/enterprise/usage-tracking.mdx
index fba4f443d8f..53f42f47227 100644
--- a/apps/docs/content/docs/platform/enterprise/usage-tracking.mdx
+++ b/apps/docs/content/docs/platform/enterprise/usage-tracking.mdx
@@ -16,7 +16,9 @@ Organization owners and admins open **Settings → Organization → Insights**.
| **Last 7 days** / **Last 30 days** | Rolling window ending now. |
| **Custom range** | Selected dates, up to 92 days. |
-The period applies to every tab. Daily bars use your browser's timezone, while billing periods begin at a fixed UTC instant. The first and last bars can be partial. Different timezones can split the same total differently across days.
+The period applies to every tab's charts and breakdowns. The **Usage heatmap** below the credit chart in Overview and workspace details always shows the last 365 days, including today's partial day. Hover, select, or use the arrow keys to inspect a day. A positive charge below one displayed credit reads **<1 credit** and remains colored.
+
+Daily bars and heatmap cells use your browser's timezone, while billing periods begin at a fixed UTC instant. The first and last bars can be partial. Different timezones can split the same total differently across days.
Spend is in **credits**, where 1 credit = $0.005; the UI rounds displayed credits. [Logs](/logs-debugging/logging) and Logs API costs are in USD, while Billing and run-resource API amounts use their documented credit units. Check the endpoint contract before comparing amounts. See [cost calculation](/platform/costs).
@@ -67,7 +69,7 @@ Each charge has one source. The exact **Agent block** label in Insights refers t
An ordinary Agent block's hosted model calls remain under Workflow. The Workflow base charge applies even without model calls. To assess a workflow using the Sim Chat block, read its Workflow charges and the separately metered Agent block source; neither charge is counted twice.
-A hosted-key tool called inside a workflow belongs to Workflow; the same tool called directly belongs to API tool call. Chat panel, API agent, and Inbox charges cannot be separated by source. Dedicated workspace attribution can distinguish them when those surfaces actually name different workspaces. Usage without a workspace appears under **No workspace** and remains part of the organization total.
+A hosted-key tool called inside a workflow belongs to Workflow; the same tool called directly belongs to API tool call. Chat panel, API agent, and Inbox charges cannot be separated by source. Dedicated workspace attribution can distinguish them when those surfaces actually name different workspaces. Usage without a workspace link appears under **Unassigned usage** and remains part of the organization total. This includes organization-level activity and retained charges from permanently deleted workspaces; the row cannot distinguish between them.
### Reconcile totals
diff --git a/apps/sim/app/api/organizations/[id]/usage/calendar/route.ts b/apps/sim/app/api/organizations/[id]/usage/calendar/route.ts
new file mode 100644
index 00000000000..ecb915e03b5
--- /dev/null
+++ b/apps/sim/app/api/organizations/[id]/usage/calendar/route.ts
@@ -0,0 +1,29 @@
+import { getOrganizationUsageCalendarContract } from '@/lib/api/contracts/organization-usage'
+import {
+ defineInternalJsonRoute,
+ internalRateLimits,
+ internalSessionAuth,
+} from '@/lib/api/server/routes'
+import { getOrganizationUsageCalendar } from '@/lib/billing/application/organization-usage/get-organization-usage-calendar'
+import { organizationUsageOperations } from '@/lib/billing/application/organization-usage/operations'
+import { organizationUsageErrorPolicy } from '@/app/api/organizations/[id]/usage/error-policy'
+
+export const dynamic = 'force-dynamic'
+
+export const GET = defineInternalJsonRoute({
+ contract: getOrganizationUsageCalendarContract,
+ auth: internalSessionAuth,
+ operation: organizationUsageOperations.readCalendar,
+ rateLimit: internalRateLimits.none({
+ reason:
+ 'Authenticated org-admin settings read, gated on enterprise entitlement and billing authority',
+ }),
+ errorPolicy: organizationUsageErrorPolicy,
+ mapInput: ({ params, query }) => ({
+ organizationId: params.id,
+ workspaceId: query.workspaceId,
+ timezone: query.timezone,
+ }),
+ useCase: getOrganizationUsageCalendar,
+ present: (result) => result,
+})
diff --git a/apps/sim/ee/organization-usage/components/activity-summary.tsx b/apps/sim/ee/organization-usage/components/activity-summary.tsx
index 75376f8e62d..0d590c02a40 100644
--- a/apps/sim/ee/organization-usage/components/activity-summary.tsx
+++ b/apps/sim/ee/organization-usage/components/activity-summary.tsx
@@ -25,13 +25,12 @@ import type { OrganizationUsageWindowKey } from '@/hooks/queries/utils/organizat
const CHART_HEIGHT = 180
/**
- * Outcome layers, bottom-up. Failed is the status red and sits on the stack where a
- * spike reads at a glance; Other (cancelled, paused, unfinished) stays neutral, in a
- * gray whose lightness keeps it apart from the red for color-vision deficiency.
+ * Outcome layers, bottom-up. Failed stays red; cancelled, paused and unfinished
+ * runs share the neutral remainder.
*/
const OUTCOMES = [
- { id: 'completed', label: 'Completed', color: 'var(--brand-blue)' },
- { id: 'failed', label: 'Failed', color: 'var(--text-error)' },
+ { id: 'completed', label: 'Completed', color: 'var(--usage-workflow)' },
+ { id: 'failed', label: 'Failed', color: 'var(--usage-failed)' },
{ id: 'other', label: 'Other', color: USAGE_OTHER_COLOR },
] as const
diff --git a/apps/sim/ee/organization-usage/components/usage-calendar.tsx b/apps/sim/ee/organization-usage/components/usage-calendar.tsx
new file mode 100644
index 00000000000..6171d2093ad
--- /dev/null
+++ b/apps/sim/ee/organization-usage/components/usage-calendar.tsx
@@ -0,0 +1,36 @@
+'use client'
+
+import { ChartFrame } from '@sim/emcn'
+import { SettingsSection } from '@/app/workspace/[workspaceId]/settings/components/settings-section/settings-section'
+import { UsageHeatmap } from '@/ee/organization-usage/components/usage-heatmap'
+import { useOrganizationUsageCalendar } from '@/hooks/queries/organization-usage'
+
+interface UsageCalendarProps {
+ organizationId: string
+ timezone: string
+ workspaceId?: string
+}
+
+/** Loads the year separately so its history cannot delay the selected period's chart. */
+export function UsageCalendar({ organizationId, timezone, workspaceId }: UsageCalendarProps) {
+ const calendar = useOrganizationUsageCalendar(organizationId, timezone, workspaceId)
+ return (
+ Last 365 days}
+ >
+ {calendar.isError || !calendar.data ? (
+ void calendar.refetch()}
+ >
+ {null}
+
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/apps/sim/ee/organization-usage/components/usage-consumers.tsx b/apps/sim/ee/organization-usage/components/usage-consumers.tsx
index ac8087b0888..7ee9a3f5eff 100644
--- a/apps/sim/ee/organization-usage/components/usage-consumers.tsx
+++ b/apps/sim/ee/organization-usage/components/usage-consumers.tsx
@@ -1,8 +1,20 @@
'use client'
-import type { ComponentType } from 'react'
-import { Avatar, cn, disclosureChevronClass, formatChartCompactNumber } from '@sim/emcn'
-import { ArrowRight, ChevronDown } from '@sim/emcn/icons'
+import { type ComponentType, useId, useState } from 'react'
+import {
+ Avatar,
+ Button,
+ cn,
+ disclosureChevronClass,
+ FloatingTooltip,
+ formatChartCompactNumber,
+ OverflowText,
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+ useFloatingTooltip,
+} from '@sim/emcn'
+import { ArrowRight, ChevronDown, CircleInfo } from '@sim/emcn/icons'
import {
AnthropicIcon,
AzureIcon,
@@ -91,6 +103,7 @@ const PROVIDER_ICONS: Readonly !open, { revalidateKey: open })
+
+ return (
+
+
+
+
+
+ {info}
+
+ {!open && (
+
+ )}
+
+ )
+}
+
/**
* A tabular row, not `SettingsResourceRow` — tabular columns are the sanctioned
* exception in `sim-settings-pages.md`, alongside billing invoices and credit usage.
*/
function UsageConsumerRow({
row,
+ info,
isMember,
showTokensOnly,
onSelect,
@@ -158,7 +205,14 @@ function UsageConsumerRow({
) : (
ProviderIcon &&
)}
- {row.label}
+