Skip to content
All notes
Operations6 min read

Credential expiry is an operations problem

Why MSPs managing many Microsoft Entra tenants need inventory, ownership, lead time, and actionable email alerts.

A client secret or certificate does not expire unexpectedly. Its expiry timestamp is known when the credential is created. Yet expired Microsoft Entra ID App Registration credentials still cause outages because knowing a date is not the same as operating it.

The technical event is simple: after a specific instant, an application can no longer authenticate with that credential. The operational system around the event is harder. Someone must know the credential exists, understand what depends on it, own the renewal, start early enough, and verify that the replacement works.

For an MSP managing roughly 20–60 Entra tenants, this is not a calendar problem repeated a few times. It is a distributed inventory and coordination problem. Every tenant adds applications, credentials, owners, change constraints, and separate failure paths.

Inventory is the first control

You cannot manage an expiry date that is absent from the working inventory.

A useful inventory needs more than the credential's display name. At minimum, an operator needs the tenant, App Registration, credential type, credential identifier, and expiry timestamp. The inventory should also make duplicates and overlapping credentials visible. A list with five entries named client-secret is technically accurate and operationally weak.

Tenant boundaries matter. The same application name may appear in several managed tenants, while credentials for one integration may be distributed across different registrations. A flat export without stable tenant and application context creates another reconciliation task before renewal work can begin.

Inventory also has to be current. A spreadsheet produced during onboarding becomes less trustworthy every time someone creates, replaces, or removes a credential. The problem is not that spreadsheets cannot store dates. It is that a manually maintained copy has no reliable relationship with the source system.

The operational question is therefore not, “Do we have a list?” It is, “Can the team use this list to state what expires next across every tenant under management?”

Ownership must be explicit

An alert without an owner is only a broadcast.

The App Registration owner recorded in Entra may be useful, but it does not always identify the person responsible for the production integration. People change roles. Vendor-managed applications outlive implementation projects. Shared automation accounts can obscure the team that understands the dependency.

Ownership should answer a practical question: who can coordinate the renewal from discovery through verification? That may involve an MSP operator, a customer-side application owner, and a vendor. One person does not need to perform every step, but one queue or role must be responsible for moving the work.

This distinction becomes important at scale. If an email reaches ten people and each assumes another recipient owns it, the notification succeeded while the operation failed. Routing needs a default destination, an escalation path, and enough context for the recipient to assign the work without opening every tenant first.

Ownership data will never be perfect. The system should expose missing ownership early rather than hide it until the credential enters a critical window. “Owner unknown, expires in 60 days” is actionable. “Authentication failed” is late.

Lead time is a property of the change

Days remaining are not the same as days available.

A credential may take minutes to create, but the complete change can require a maintenance window, customer approval, vendor coordination, secret distribution, deployment, and post-change verification. Certificates may also require generation and handling outside Entra. The correct alert window depends on that process, not on the speed of the portal action.

Use expiry windows to turn timestamps into an operating queue. A small, pure function is enough to classify the dates; policy can decide what each window means:

type ExpiryWindow = "expired" | "0-14 days" | "15-45 days" | "later";

function classifyExpiry(expiresAtMs: number, nowMs: number): ExpiryWindow {
  const remainingMs = expiresAtMs - nowMs;
  if (remainingMs <= 0) return "expired";

  const days = Math.ceil(remainingMs / 86_400_000);
  if (days <= 14) return "0-14 days";
  if (days <= 45) return "15-45 days";
  return "later";
}

The thresholds above are examples, not a universal policy. A low-impact internal integration may need less time. A credential tied to a customer production system or an external vendor may need much more.

What matters is consistency. If the team considers an item urgent at 14 days, that rule should apply across the managed inventory. Operators should not have to remember which tenant was checked recently or calculate urgency differently in each portal session.

Lead time should also account for alert failure. A single message one day before expiry assumes immediate delivery, immediate attention, clear ownership, and a successful first change. Operations rarely provides all four. Earlier notice creates room for reminders, reassignment, and recovery from a failed renewal.

Email alerts need operational context

Email is useful because MSP teams already run work through shared inboxes, ticket ingestion, and escalation rules. It is also easy to get wrong.

A useful expiry email should identify the tenant, application, credential type, expiry date, and remaining time. It should be clear whether the message is an early warning, a reminder, or an expired-state alert. The subject should support scanning and routing without requiring the body to be opened.

The alert should not include credential values. Expiry monitoring needs metadata, not secret material. Adding sensitive values would increase handling risk without helping the recipient schedule a renewal.

Frequency matters too. Sending every upcoming credential every day creates a digest that operators learn to ignore. Sending only once makes delivery and ownership assumptions that are too optimistic. A better pattern is to notify at meaningful transitions, repeat within tighter windows, and stop or reset the sequence when the inventory shows a replacement.

That last step prevents stale alerts. Renewal often creates a new credential before the old one is removed. The operating view has to distinguish the expiring credential from its replacement rather than treating the App Registration as a single undifferentiated status.

The loop ends after verification

Creating a replacement credential is not completion.

The consuming application must receive the new value or certificate, deploy it correctly, and authenticate successfully. The old credential may remain temporarily for rollback, but it should not become permanent ambiguity. The inventory should eventually reflect the active replacement and the deliberate removal of the old credential.

This gives the team a concrete loop:

  1. Find upcoming expirations across all managed tenants.
  2. Assign an accountable owner.
  3. Start work according to the required lead time.
  4. Replace and deploy the credential.
  5. Verify authentication.
  6. Remove or close out the old credential.

The expiry timestamp starts the loop, but inventory, ownership, and process state make it operable. Without those controls, teams are left with portal checks and calendar reminders that do not share a source of truth.

Credential expiry is therefore not mainly a cryptography problem. It is predictable maintenance across administrative boundaries. MSPs need a cross-tenant view, clear responsibility, enough lead time for the real change process, and alerts that enter the queue with useful context.

CredWatch is being built around that narrow problem: monitoring Microsoft Entra ID App Registration client secret and certificate expiry across multiple tenants, with email before expiry. Ask about CredWatch while it is being built.