Business operations
Audit software subscriptions with AI: duplicate charges, unused seats and renewals
To audit software subscriptions with AI, reconcile billing records with a subscription inventory, assigned licenses, service-specific usage and contract terms. Keep possible duplicate charges, spare capacity and no-activity candidates separate. Normalize recurring costs by billing period and currency, then ask each owner to confirm the finding before changing a subscription. A missing usage report cannot establish an unused seat.
In this article
Start with a review queue you can act on
A list of software charges can show where money was billed. It cannot explain every reason a service exists, whether an assigned person needs access, or whether a contract permits an immediate change. A useful subscription audit connects those questions instead of turning every unfamiliar charge into a cancellation recommendation.
The task in this guide is to produce a short owner-review queue. Each finding needs a stable subscription reference, the supporting billing or usage evidence, the uncertainty and a next question. Keep suspected duplicate transactions, unassigned seats, recorded inactivity and upcoming renewal decisions as separate finding types.
The fictional pack contains five subscriptions and six billing rows. LedgerDesk, SketchSpace, MeetRoom, ArchiveKeep and MailLite are invented services with invented prices. The files are not price comparisons or examples of actual customer accounts. Their purpose is to expose common reasoning errors in a controlled exercise.
Use an approved data export when you adapt the method to your own organization. Minimize the fields shared with an assistant. Pseudonymous account IDs are enough to reconcile the practice data, and the report does not need private message content, card details or individual performance judgments.
Freeze the snapshot and the usage window
The exercise snapshot is 1 November 2026. Usage covers 2 October through 31 October inclusive, a thirty-day window. Billing rows refer to their own stated service periods, including annual terms that started earlier. Those dates serve different purposes and should not be collapsed into one reporting month.
A last-activity date tells you something about the measured service and reporting coverage. It does not tell you whether the account's owner was on leave, performing a seasonal task, running a background process or using an unmeasured feature. Record the coverage definition beside the candidate finding.
Microsoft's usage-report overview illustrates why these details matter: available windows and service reports vary, and reporting can lag. Check the actual export's date and completeness before treating its newest day as final. This article does not require a particular Microsoft product or admin role.
Keep the snapshot fixed while you compare outputs. If your assistant applies today's date to one file and the export date to another, an unchanged account can switch categories between runs. A reproducible exercise should change its result only when the inputs or documented rules change.
Sources: Microsoft: usage-report availability, windows and reporting delays
Separate billing observations from the subscription inventory
Each billing row is an observed charge record, identified by ChargeID. Each subscription is a continuing service arrangement, identified by SubscriptionID. A service may generate several invoices or transaction rows. Counting billing rows as subscriptions would make this pack appear to contain six services when it contains five subscription identities.
For each subscription, establish the vendor, currency, cadence, service period, purchased units and unit type. The unit type matters: a workspace plan is not one unused user license merely because the purchased quantity is one. Preserve these source fields before adding any annualized estimate.
The source deliberately repeats LedgerDesk invoice LD1101 as C01 and C06. Their subscription, invoice, currency, period and amount match. That is a possible duplicate group requiring reconciliation. The files do not include payment settlement IDs or a credit history, so they cannot prove that two payments occurred.
Keep both billing observations and represent the uncertainty explicitly. A reviewer might discover a repeated export row, a failed payment followed by settlement, or a genuine repeat charge. None of those explanations should be chosen by an assistant without the relevant evidence.
Normalize recurring costs without confusing them with cash paid
For a monthly subscription, multiply the supplied recurring period charge by twelve to obtain an annual equivalent. For an annual subscription, divide the annual charge by twelve to obtain a monthly equivalent. These calculations provide a comparable recurring-cost view under the exercise's unchanged-price assumption.
They do not forecast the next twelve months of cash payments. A prepaid annual plan can have a monthly equivalent even when no invoice is due this month. Likewise, a monthly plan may change price or seat count later. Keep billing dates, recurring equivalents and payment events in different columns.
LedgerDesk's USD 120 monthly charge becomes USD 1,440 annually. SketchSpace's USD 960 annual charge becomes USD 80 monthly. MeetRoom adds USD 75 monthly, and ArchiveKeep's USD 240 annual workspace adds USD 20 monthly. The provisional USD recurring total is USD 295 monthly, or USD 3,540 annually.
That total represents LedgerDesk once while its repeated billing observation is reviewed. State the assumption. It is not evidence that C06 can be deleted or refunded. The raw USD charge rows total USD 1,515 across their different billing periods, which is a different measure from a monthly recurring total.
| Subscription | Monthly equivalent | Annual equivalent |
|---|---|---|
| LedgerDesk | USD 120 | USD 1,440 |
| SketchSpace | USD 80 | USD 960 |
| MeetRoom | USD 75 | USD 900 |
| ArchiveKeep | USD 20 | USD 240 |
| MailLite | EUR 30 | EUR 360 |
Keep currencies, tax and exceptional charges visible
MailLite is billed at EUR 30 monthly, or EUR 360 annually under the exercise rule. Keep that total separate from USD 3,540. Adding the numbers into a currency-free grand total would conceal an exchange-rate assumption that the pack never supplies.
If a real review needs a common reporting currency, obtain the organization's rate source, effective date and conversion convention. Retain native-currency amounts alongside converted values. Do not fetch a current spot rate and apply it to historical invoices merely to finish a table.
All practice charges exclude tax. The data has no credits, usage-based overages, implementation fees or proration. A real export might contain all of those, so classify recurring charges and one-off adjustments before annualizing. Multiplying a one-time setup payment by twelve creates a false recurring expense.
Also check what the amount already includes. A line with PurchasedUnits equal to twelve and ChargeExTax equal to 120 represents the total period charge in this exercise. Multiplying 120 by twelve seats again would inflate the cost. Read the data dictionary before deciding whether a field is a unit price or a line total.
Reconcile purchased capacity with assignments
LedgerDesk has twelve purchased seats and ten assigned accounts. The difference is two unassigned seats. SketchSpace has eight seats and eight assignments. MeetRoom has five and five, while MailLite has three and three. ArchiveKeep's single workspace is excluded from the seat comparison because its unit is different.
The unassigned quantity is a capacity observation. It does not establish that a contract can be reduced by two seats today or that a refund is available. The organization might reserve access for planned starters, maintain a contractual minimum, or buy only fixed-size bundles. Those details require owner and contract evidence.
Keep identifiers stable when joining the assignment export. Account names and display labels may change, while one human can also have multiple legitimate accounts. Inspect assignment duplicates at the subscription/account level before counting users. Do not infer a headcount measure from a license table.
If the assignment list contains only active users, it cannot establish the count of all assigned accounts. The exercise supplies the complete assigned-account rows for its seat plans. In a real audit, request the missing inventory rather than subtracting an activity count from purchased seats and calling the difference unused.
When importing the usage file, preserve SubscriptionID and AccountID as text. Check that the joined assignment count stays unchanged after adding billing fields; a repeated billing row can otherwise duplicate every account and inflate both assigned seats and activity counts.
Classify usage only where the reporting coverage supports it
Ten LedgerDesk accounts have complete exercise coverage. Seven show activity within the window. Two have their last recorded activity before 2 October, and one has a blank date under the supplied rule that complete coverage contains no recorded activity for that account. That creates three no-activity-in-window candidates.
SketchSpace has six active-in-window accounts and two whose last recorded activity predates the window. MailLite's three assigned accounts show activity. Across the twenty-one assigned accounts with complete coverage, sixteen show activity and five are candidates for owner review.
MeetRoom supplies no usage export. Its five assignment rows explicitly say unavailable, with blank activity dates. Those blanks support no inactivity conclusion. ArchiveKeep's workspace retention service is not meaningfully evaluated through the seat-activity rule, so its row says not applicable.
Make the category names precise. No recorded interactive activity in the selected window is defensible for the five candidates under the exercise rules. Unnecessary account, unproductive employee and safe to remove are different claims with no support here. Keep the audit about service access and business requirements.
Ask the service owner what the export cannot show
Send the owner a small set of evidence-linked questions rather than a generic request to justify a tool. For LedgerDesk, ask whether two unassigned seats are intentionally reserved and whether the three no-activity candidates still need access. Include the reporting window and the export's interactive-activity limitation.
For SketchSpace, ask whether the two accounts belong to seasonal work or shared deliverables, and what the annual term allows at renewal. A low-activity seat can still be necessary for a later project. For ArchiveKeep, ask about retention and retrieval obligations instead of counting logins.
For MeetRoom, the immediate action is to obtain appropriate usage evidence or another agreed measure of need. The owner may explain that a different data source captures the relevant activity. Do not reinterpret the missing export as a cost-saving opportunity merely because every account has a blank date.
Record proposed owners as proposed until they accept the task. A useful review tracker distinguishes the AI's suggested question, the owner's response, the evidence supplied and the final action. That separation prevents a generated recommendation from appearing to be an approved change.
Build a renewal calendar from contract evidence
The billing file includes OwnerReviewBy, an invented internal follow-up date. It is not a cancellation deadline, renewal-notice date or guarantee that a plan can be changed then. The article uses it to demonstrate planning without inventing contractual rights.
In an operational tracker, keep service-period end, renewal date, notice requirement, internal review target and decision status as separate fields. A notice period may begin well before the invoice date. Request the actual agreement or owner-confirmed terms rather than guessing a standard thirty-day rule.
For the three monthly exercise plans, the internal review target is 20 November. SketchSpace and ArchiveKeep have later targets associated with their annual terms. Sort those follow-ups within the fixed snapshot and keep each subscription linked to its source. Do not turn a list of dates into automatic cancellation instructions.
If a renewal condition is unknown, make the missing evidence the action. A useful entry says confirm renewal and notice terms with Design, not cancel by an invented date. Once the owner supplies a reliable deadline, preserve its source and record who will decide before that deadline.
Give the assistant a bounded review contract
Provide the rules file before the exports. Ask the assistant to state the meaning of a billing row, a subscription, a seat assignment and a usage record. Those definitions are the foundation for every total and candidate finding that follows.
Require a subscription-level table for recurring costs and a separate transaction-level note for duplicate candidates. Keeping those outputs distinct avoids a common error: either counting a repeated charge twice in the recurring view or deleting it so completely that no one reviews the payment question.
The usage output should include coverage status and candidate reason, not only a yes/no inactive column. Require explicit missing-evidence labels for MeetRoom and a not-applicable seat result for ArchiveKeep. Keep the original account IDs so the owner can reconcile the list without receiving unnecessary personal details.
Save the first output before checking the answer key. A model that produces the expected USD total but labels every blank date unused has still failed an essential part of the review. Numerical correctness and evidence handling need separate inspection.
Read subscriptions-rules.md before the fictional billing and usage CSVs. Report the six billing observations and five subscription identities. Keep C01/C06 as an unresolved duplicate candidate. For provisional recurring equivalents, represent S01 once and state that assumption; show monthly and annual equivalents separately by currency, excluding tax. Reconcile purchased seats with assignments only for seat plans. Classify activity using the fixed 2026-10-02 through 2026-10-31 window and each row's Coverage. Unavailable coverage is unknown, not inactive. Workspace capacity is not a user seat. Produce an owner-review queue with source IDs, missing evidence and proposed next questions. Do not cancel services, remove users, claim refunds or estimate realized savings.
Verify the recurring view and the candidate counts independently
The provisional USD monthly equivalent should be 120 plus 80 plus 75 plus 20, giving 295. Its annual equivalent is 3,540. EUR stays separate at 30 monthly and 360 annually. Check that the assistant neither annualized the annual rows again nor multiplied total line charges by seat counts.
There should be two unassigned LedgerDesk seats and five no-activity candidates across the complete coverage rows. The five MeetRoom accounts must remain unknown for activity. ArchiveKeep must remain outside seat arithmetic. The repeated LedgerDesk billing observation must still be visible after the provisional recurring total is calculated.
Inspect the population behind every rate. Five candidates out of twenty-one assigned accounts with complete coverage is a different measure from five out of all twenty-six assigned seat accounts. Either denominator can answer a defined question, but they cannot be swapped without relabeling the metric.
The answer key is a reference for this authored dataset, not a benchmark for an assistant. If your output disagrees, identify the first incorrect assumption. Fixing only the final total can leave the classification or coverage problem intact and make the next audit fail in a less obvious way.
Record confirmed actions before calling anything a saving
A potential opportunity becomes an action only after an owner checks business need, terms, dependencies and timing. The action might be to keep a seat, reassign it, change a plan at renewal or request transaction reconciliation. A valid audit can conclude that a low-activity service should remain unchanged.
Keep proposed recurring reductions separate from contracted reductions and realized cash savings. An annual prepayment may produce no immediate refund even if access is removed. A future smaller invoice needs its own confirmation, and an avoided renewal is different from a credit received today.
After an approved change, verify the new assignment count, plan terms or subsequent bill against the intended result. Preserve a record of what changed and any business requirement that remained. If the owner retains a service for a defined reason, record that reason so the next reviewer does not reopen the same question without context.
For the next cycle, reuse the structure and refresh the snapshot, exports and confirmed terms. Compare like-for-like periods and coverage before describing a trend. The useful outcome is a smaller set of clear decisions with evidence, rather than the largest possible number of accounts labeled unused.
Related guide: Compare spreadsheet versions before replacing a review tracker