Skip to content

Optional Services Configuration

Sam Betts edited this page Oct 22, 2026 · 1 revision

Configuration Reference → Optional Services Configuration

Copilot Adoption tenant settings

Stable 1854 exposes 33 governed fields in the Administration editor: weights/bands, engagement targets, habit boundaries, licence opportunities, Cowork readiness, agent lifecycle, reclaim grace and segment privacy. History/query windows, row caps and activation windows are not editable. See Copilot Adoption Settings for defaults, a safe change procedure and the exact scope.

Configured storage has a ten-second linked deadline for each settings read/save/reset, covering lazy Table opening, reads and the conditional write, including SDK retries. It is not a ten-second budget for the whole analysis. Unavailable settings still refuse the request with 503, even when an analysis is cached; neither cached nor default scores bypass that check. This is one point read per report request, not per person or analysis step. Caller cancellation stays cancellation and does not cancel shared analysis another caller is using. After a timed-out save, read the current settings and history before retrying: a lost acknowledgement is not proof that nothing was saved. No new app setting controls this deadline.

Shipped expanded controls

Released in 1854, PR #755 extends the same tenant-wide editor. It retains versioned Azure Table storage, conditional saves, history, reset and settings-sensitive analysis caching. This feature adds no database migration or installer-schema change of its own. Older saved settings receive the existing calculation defaults for added fields. The release's separate installer changes advance saved configuration to 3.4.0.

Group Released editable controls and safeguards
Engagement targets Frequency ratio and working days per week; depth target and minimum active days; breadth target. The editor previews the active-day target for a 28-day period
Habit frequency Ordered Moderate/Frequent/Daily active-day boundaries within the fixed 28-day normalization; names and normalization are not editable
Licence opportunity Recommendation score, minimum proven-demand days and four percentage weights totalling 100
Cowork readiness Independent workload/fluency thresholds, regular-use minimum days and its own four percentage weights totalling 100. These do not become engagement band thresholds
Agent lifecycle Review/retirement inactivity, newness and minimum users. Review precedes retirement; newness is 1–118 days and strictly shorter than retirement. The minimum stays at or above three users
Seat reclaim Grace period, with explicit confirmation for saves or resets that change it. This changes recommendations, never removes a licence automatically
Segment privacy Minimum group size may increase but cannot fall below five seats

Effective custom rules appear in report method/help, customisation notices and workbook settings. A save applies to the next requested analysis/export; an already-open report keeps the rules it was calculated with until refreshed. The editor, help and validation are supplied in English and Spanish. History/query windows and performance row caps remain fixed.

Activation is not implemented by this change. There is no editable or persisted activation-window tenant setting, and the API rejects that field rather than accepting a no-op that changes audit/cache/customisation state. Operational activation requires a separately defined first-observed seat-tenure feature, including seeded holdings and reassignment semantics. Account creation and period-clipped seat-held days are not substitutes. That part of #684 remains outstanding.

Agent costs (optional)

Settings for the two agent-cost imports. Only meaningful when CopilotStudioCredits / AzureCostManagement are enabled in ImportJobSettings. Full guidance, including the permission grants both need, is in Agent costs.

Setting Default Purpose
CopilotStudioCreditsIntervalHours 24 Minimum hours between Copilot Studio credit imports. 0 = every cycle.
CopilotStudioCreditsTrailingWindowDays 7 Days re-read each run so restated usage days are corrected. Capped at 180 — the import makes at least one request per day in the window, so this is a direct multiplier on request count.
AzureCostScopes (none) Required for the Azure import, which otherwise declines to run rather than guessing a subscription. ;-separated Cost Management scopes, e.g. /subscriptions/00000000-0000-0000-0000-000000000000.
AzureCostMeterFilterValues (none) ;-separated values to filter to. Empty imports every meter at the scope — deliberately, so you can discover what your agent spend is called, then narrow.
AzureCostMeterFilterDimension ServiceName Which dimension the filter matches. MeterCategory and Meter are the other sensible choices. Filtering is not limited by the grouping cap below.
AzureCostGroupBy ResourceId;Meter Which dimensions to group by. Cost Management allows at most two and rejects a query with more, so anything beyond the first two is ignored with a warning. ResourceId is the default because the subscription and resource group can be recovered from it.
AzureCostTrailingWindowDays 5 Minimum days re-read each run. The import automatically reaches further back while an older billing period is still open, so figures stop being marked "estimate" once Azure closes the period.
AzureCostIntervalHours 24 Minimum hours between Azure cost imports.

Credit cadence uses the current connection-generation suffix in 1852 with a current/previous connection; Azure still uses ImportSchedule / AzureCostLastImported. Clear only the matching row if needed. Restarting does not clear Table state; see Forcing a retry.

Message tracing (optional diagnostics)

Settings for message tracing, which saves the API responses that match a pattern to Azure Blob storage so you can see exactly what Microsoft returned. It is off unless MessageTraceMatch is set.

Only the Office365ActivityImporter web job reads these settings, once, when it starts; the web app and the AppInsightsImporter web job ignore them. Set them on the solution's App Service, like the rest of this page. Saving app settings restarts the web jobs, so a change takes effect straight away.

The installer doesn't write these settings, and it keeps them when you re-run it: it preserves every app setting it doesn't manage, and its log names them ("Preserved … existing app setting(s) the installer does not manage: …"). An upgrade therefore doesn't switch tracing off; remove MessageTraceMatch yourself.

Setting Default Purpose
MessageTraceMatch (none): off Turns message tracing on. One or more patterns separated by ;, each matched against the whole JSON response body, ignoring case. * matches any run of characters and ? one character, so put * at both ends to find text anywhere, such as *00000000-0000-0000-0000-000000000000*. Each pattern needs at least four characters that aren't * or ?; if one doesn't, tracing stays off. Empty or missing turns tracing off.
MessageTraceContainer message-traces The private blob container that receives the captures, in the storage account named by the Storage connection string. It must be a valid container name: 3–63 lowercase letters, digits and hyphens, starting and ending with a letter or digit, with no two hyphens together. If it isn't, tracing stays off.
MessageTraceMaxBodyBytes 33554432 (32 MB) Responses larger than this are skipped. The most it can be is 268435456 (256 MB); a higher value is treated as 256 MB.
MessageTraceMaxPerHour 500 The most captures saved in a clock hour (UTC) by each running importer; later matches are dropped until the next hour.

A value for either of the last two that isn't a whole number greater than zero leaves the default.


Return to Configuration Reference · All topics in this guide

Previous: Importer Tuning Reference

Start here

Copilot analytics

Using the portal

Install & configure

Beyond Copilot

Operate

Upgrading from an older build

Reference

Project

Clone this wiki locally