Build something that is not there yet
Measure SaaS license utilization and shelfware before renewal
- When a SaaS renewal is due in weeks and nobody knows how many of the paid seats are actually used.
- When the vendor's own usage dashboard doesn't match the seat count on the invoice.
Build utilization and shelfware measures per application from entitlements against active-user activity, with the cost of unused seats and an inactive-user list. Covers utilization measurement, not the renewal negotiation or license procurement itself.
Sample This Recipe has not been materialized in the Cookbook repository yet. Its trigger, description, prompt, agent guidance and acceptance conditions, and the explanation below, are prototype drafts. Its name, job, area and readiness come from the reconciled Cookbook seed snapshot. Readiness is a separate question from this one: it says whether the capability exists, not whether the writing has been reviewed.
Use this Recipe
Use the VibeData Recipe `finops-saas-license-utilization` at https://getvibedata.ai/cookbook/finops-saas-license-utilization Read the Recipe and execute it in the context of the current Intent.
Recipe id finops-saas-license-utilization · Not yet materialized in the Cookbook repository, so the pointer addresses this page.
Verified by
What has to be observably true before this Recipe is finished.
- the entitlement seat count ties to the vendor invoice for the same billing period
- utilization percentage is computed against the agreed definition of active, not a default assumption
- the cost of unused seats reproduces a hand-checked figure for at least one sampled application
- the inactive-user list is available in aggregate first, with drill-down only on request
Recipe promptThe task specification the agent reads. Reference only — it is not what you copy.
Deliver: Measure SaaS license utilization and shelfware before renewal. Build utilization and shelfware measures per application from entitlements against active-user activity, with the cost of unused seats and an inactive-user list. Covers utilization measurement, not the renewal negotiation or license procurement itself. Execute inside the current Intent. Its Domain, repository, platform, environment and attached sources are the context for this work — read them rather than asking for them. The work is done when: - the entitlement seat count ties to the vendor invoice for the same billing period - utilization percentage is computed against the agreed definition of active, not a default assumption - the cost of unused seats reproduces a hand-checked figure for at least one sampled application - the inactive-user list is available in aggregate first, with drill-down only on request Report the evidence for each condition above with the result. A condition you cannot meet is something to say, not something to work around.
Agent guidanceHow the agent approaches the work, and what it will not do.
Profile the inputs the grain, joins and measures actually depend on before proposing a model. Put the design up for review — grain first — then build in an isolated copy with tests and documentation landing beside the model rather than after it.
Composes
- permission and billing reads
- dbt in the project
- dlt in the project
- isolated-copy execution and gate verification
Asks first
Semantic decisions the Intent cannot supply. Never context Studio already holds.
- which Fabric target this work lands on, when the Domain carries both a Lakehouse and a Warehouse
- the grain the requester expects, where the request leaves it open to more than one reading
Guardrails
- Build in an isolated copy. Production is read, never written.
What you need
- Microsoft Fabric Lakehouse, Microsoft Fabric Warehouse, MotherDuck, or DuckDB.
- Read access to the billing or permission surface the work reads from.
- dbt and dlt in the project, or the intent to add it.
- Carries personal data in the inactive-user list; aggregate first.
How it goes
- State the outcome in one sentence, in the language the request arrived in.
- Let it profile the inputs the grain, the joins and the measures actually depend on.
- Review the design. Disagreeing about grain here costs a sentence; after the model exists it costs a rewrite.
- Let it build in an isolated copy, with the tests and the documentation landing beside the model rather than after it.
- Read the acceptance conditions against the run.
What you end up with
The deliverable, in your own repository, as governance and cost work a reviewer who knows the project reads as native to it. Alongside it, the evidence for every one of the acceptance conditions above — which is the part that is still there in three weeks when somebody asks.
