Skip to main content
A licence cost analysis tool that calculates total SaaS spend, identifies stale users, and shows potential savings from reclaiming inactive seats. Teams using this pattern typically surface meaningful licence savings within an hour of building. Time: ~30 minutes · Difficulty: Beginner · Pre-built equivalent: Licence management

What you’ll build

By the end, you’ll have:
  • Input fields for cost-per-license per major SaaS app
  • A total-spend calculation based on active users in your data
  • A table of users inactive for 30+ days, with licenses they hold
  • A potential-savings calculation if those licenses are reclaimed
  • A downloadable CSV of inactive users to send to procurement

Prerequisites

  • Dimension access (Analyst or Super Admin role)
  • A workspace you can build in
  • One of the following data sources connected:
    • Identity / SSO — Entra ID, Okta, Google Workspace
    • Optional: HR system — for ground-truth termination dates
If you haven’t wired up identity yet, see Connect Your Data.

Step 1 — Start a blank canvas

In Builder Mode, click New App → pick Blank Canvas Light. You’ll land in the Studio editor with an empty preview and an empty Composer.

Step 2 — Generate the structure

Paste into the Composer:
Send. Composer thinks, generates the components, and renders the live preview. If your workspace has no Data Feeds, you’ll see the “Did you forget to add a data feed?” confirmation. Click Proceed with no data feeds if you want to scaffold UI first and wire data later; otherwise Cancel and connect your identity Feed first.

Step 3 — Make the savings calculation explicit

Composer rebuilds the bottom of the dashboard with the savings call-out.

Step 4 — Filterability

These let you slice the inactive list by org boundary — useful when sending the list to specific cost-centre owners.

Step 5 — Export

Composer wires up the CSV generator using the standard Studio component.

Step 6 — Polish

Step 7 — Auto-refresh & PDF

The PDF button is convenience; ⋯ → Generate PDF also works at any time.

Step 8 — (Optional) Notify managers

If you want managers to receive the inactive-user list for their team:
  1. First, create an Email Action named Notify Manager with inputs manager_email, inactive_users (the recipients must be tenant users).
  2. Then in Studio:
Email Action recipients are tenant-user-only. If your department managers aren’t ThreatAware users, replace the Email Action with a Webhook Action against your email service (SendGrid, Postmark, AWS SES) instead.

Step 9 — Publish

Click the Published chip at the bottom-left. The app:
  • Becomes visible to everyone with access to the workspace
  • Auto-creates a Shortcut (e.g. https://<tenant>/app/license-tracker)
  • Fires a Publish app notification

What you’ve built

Customisation ideas

  • Multi-currency — “Add a currency dropdown (£/$/€) that applies to all costs”
  • Renewal calendar — “Add a Renewals tab listing each SaaS with renewal date and projected cost”
  • Cost trend — “Add a 90-day line chart of total spend”
  • Inactive thresholds per app — “For Salesforce specifically, treat inactive as 90 days, not 30”
  • Auto-ticket — “On each inactive user, add an Open Ticket button that creates a Jira issue via our Jira Webhook Action”

See also

Licence management (pre-built)

A pre-built version of this app you can import and customise

Connect Your Data

Wire up the identity Data Feed this tutorial needs

Actions

Email + Webhook Actions for the manager-notify step

Exporting & Sharing

PDF, CSV, Share URL, Pin to Sidebar