Recommendations
How ZopNight finds waste, what each finding includes, and how to act on it.
Recommendations are the output of ZopNight’s audit engine; concrete, evidence-backed findings that point at specific resources costing more than they should. Each one is a single rule firing against a single resource, with the math, the evidence, and the suggested action all on the card.

Recommendations page; open findings across the estate with savings, category, and resource detail. Filterable by status, provider, category, severity, and account.
How recommendations work
A cron job evaluates every audit rule against every resource on a schedule. Findings land in the database. The Recommendations page reads from the database; no recomputation per pageview, no slow lookups.
This matters because the rules are not cheap. Some rules need 90 days of CloudWatch / Cloud Monitoring / Azure Monitor data, or a billing-history join, or both. Doing that work at request time would make the page unusable. Doing it once a day, in batches, and storing the results makes the page instant.
What’s on a recommendation card
Every card has the same shape regardless of which rule fired.
| Field | What it is |
|---|---|
| Title | One-line description of the finding (e.g. “EC2 instance underutilised for 14 days”) |
| Resource | The cloud resource the rule fired on, with cloud account and region |
| Current cost | Monthly cost of the resource as it sits today |
| Optimised cost | What the cost becomes if you apply the suggested change |
| Potential savings | The delta. ZopNight uses real billing data when available, rack rate otherwise |
| Evidence | The metric values that triggered the rule (CloudWatch averages, idle hours, etc.) |
| Severity | Critical / High / Medium / Low; based on savings size and category |
| Action | Suggested fix. Some actions are one-click via Auto-remediation; others are advisory |
Categories
Recommendations fall into eight categories, plus the Autoscaler and Databricks rule families. See Recommendation rules for the full catalogue grouped by category.
Idle
Resources running but doing no useful work; zero invocations, no connections, no CPU. The biggest single source of waste in most accounts.
Rightsizing
Resources sized for headroom they never use. Smaller instance type, same workload, lower bill.
Schedule
Resources running 24×7 that have a clear off-hours usage pattern. Candidates for ZopNight’s start/stop scheduling.
Discount
Reserved Instance, Savings Plan, and Committed Use opportunities; places where steady usage justifies a discount commitment.
Orphan
Resources no longer attached to anything that needs them; unattached EBS volumes, unassigned Elastic IPs, released PVs.
Compliance
Configuration drift from best practice; missing lifecycle policies, no logging retention, deprecated runtimes.
Security
Risky configurations with cost or operational implications; public S3 buckets, wildcard IAM, privileged containers.
Reliability
Production-shape issues that cause incidents and re-work; single-replica deployments, missing requests/limits, no HPA.
Filters
The Recommendations page supports cascading filters:
- Status: Open, Applied, Dismissed, Optimised
- Provider: AWS, GCP, Azure
- Category: see above
- Resource type: comma-separated multi-select
- Severity: Critical, High, Medium, Low
- Cloud account: multi-select
- Search: matches title, resource name, resource UID
Selecting a provider narrows the available categories, severities, types, and accounts to what that provider actually has. The dropdowns never offer dead ends.
Acting on a recommendation
There are three things you can do with any open recommendation:
Apply the suggested change (Remediate)
For 124 rules (28 one-click, 96 guided), ZopNight can run the change for you. Opens a wizard that previews the change, asks for approval if the action is destructive, runs the cloud API call, and validates the result. See Auto-remediation.
Apply it yourself, then mark Applied
For advisory rules (cases where ZopNight should not run cloud-side mutations on your behalf), the card shows a numbered “How to fix” playbook. After you’ve done the work in your cloud console or via Terraform, mark the recommendation Applied so it drops off the Open list.
Dismiss it
Sometimes a recommendation doesn’t apply; the resource has a reason to be over-provisioned, or it’s about to be deleted anyway. Dismiss the recommendation with a reason. Dismissed recommendations don’t reappear on the next cron run.
Where recommendations show up
Beyond the dedicated Recommendations page, findings surface in several places:
- Resource detail drawer: “Recommendations” tab lists every open rec for that resource
- Cost Flow Sankey: hovering a node shows a “$X reclaimable” callout when the dimension matches a recommendation filter (resource type, cloud account)
- Dashboard: the Recommendations widget shows top findings by savings
- MCP server: the AI Assistant can list and filter recommendations through 43 read-only tools
Why a recommendation might not show up
A few reasons a finding you expect to see isn’t there:
- The cron hasn’t run yet. Recommendations are computed daily. A freshly connected cloud account will see its first batch after the next run.
- Metrics aren’t flowing. Rules that need CloudWatch / Cloud Monitoring / Azure Monitor data can’t fire without the right IAM permissions. Check Cloud permissions and the metric coverage endpoint.
- Pricing data is missing. If a rule needs to compute savings but the underlying SKU isn’t in the pricing cache, the rule goes to the pricing-gap dead-letter queue so the gap is observable. Ask support to backfill.
- The rule was dismissed previously. Dismissed findings don’t reappear unless you reopen them. Check the Dismissed tab.
Exporting recommendations
You can export the filtered Recommendations list to CSV for sharing with finance or the platform team. The export runs as a background job; your browser doesn’t have to stay open. ZopNight notifies you with a signed download link when the file is ready.
Recommendation exports are persisted in a jobs table, so a crashed export shows up as a Failed row (with reason) rather than disappearing silently. Re-trigger from the UI to retry.