Grace period and paywall behavior
The grace period is the cushion between "your paid subscription stopped being valid" and "outbound webhooks actually stop firing". A failed renewal won't break your CI/CD overnight — but you do get a clear prompt to renew.
The window length depends on your billing cycle:
Billing period | Grace window |
|---|---|
Monthly | 3 days |
Annual | 14 days |
A short grace on monthly is intentional: a 14-day cushion would be ~16% of the paid period, which is a long ride for an unpaid customer. On annual, 14 days is under 4% of the cycle and matches enterprise procurement timelines.
Trials and never-licensed installs have no grace window at all. A trial ending or a fresh install with no Marketplace license goes straight to "delivery blocked" — see How the Webhooks Pro trial works and Subscription states and SEN.
When grace starts
The first moment Webhooks Pro observes active: false from Atlassian on a paid subscription — typically the day after:
Your monthly or annual payment fails.
A subscription is cancelled and reaches its end date.
(A trial ending does not start grace — the trial itself was the free window.)
The Subscription card on Settings → About flips to state GRACE, an amber Subscription lapsed — grace period active banner appears at the top of every page, and a countdown begins (3 days on monthly, 14 days on annual).
What still works during grace
Action | During grace |
|---|---|
Outbound webhook deliveries | ✅ Continue normally |
HMAC signing, retries, auto-disable | ✅ Continue normally |
Webhook Logs page (read, filter, export) | ✅ Continue normally |
Read every page of the admin UI | ✅ Allowed |
Disable an existing webhook (toggle OFF) | ✅ Allowed |
Delete a webhook or template | ✅ Allowed |
Export webhooks / templates / full bundle to JSON | ✅ Allowed |
Import a JSON bundle on Backup tab | ✅ Allowed (see note below) |
Settings changes (retention, language, refresh interval) | ✅ Allowed |
Queue management (release / purge) | ✅ Allowed |
Why import stays open while everything else write-class is blocked: import is a recovery action — admins reach for it precisely when something has gone wrong (re-install, migration, accidental delete). Imported webhooks always land disabled regardless of what the JSON file says, so importing during grace doesn't actually start any new deliveries. To turn an imported webhook on, you still need an active license — the Enable action below is gated.
And what gets blocked:
Action | During grace |
|---|---|
Create a new webhook | ❌ Paywall modal |
Edit an existing webhook | ❌ Paywall modal |
Enable a disabled webhook (toggle ON) | ❌ Paywall modal |
Create / edit a payload template | ❌ Paywall modal |
Save a workflow post-function binding | ❌ Paywall modal |
Replay (Run again) of past deliveries | ❌ Paywall modal |
The principle: anything you might need to wind things down or look at past data stays open. New configuration is blocked. That includes deletes — you can clean up cleanly without renewing first.
The paywall modal
When you try a blocked action during grace, a modal intercepts the click:
Headline matches the current state (
Subscription lapsed,Trial ended,Subscription expired, etc.).Action button: Renew subscription (or Buy now / Start free trial depending on state) — opens the Atlassian Marketplace listing in a new browser tab.
Cancel button returns you to the page you were on; nothing was saved.
The modal is only triggered by a blocked action. Browsing read-only pages doesn't pop it up.
What happens when grace ends
After the grace window (3 days on monthly, 14 on annual) without renewal, the state moves to EXPIRED:
Banner turns red.
Outbound deliveries stop. Any event that would have fired is logged as a
Skippedrow instead.Configuration is still locked.
Read access remains, so you can look at past deliveries and export your config.
Skipped rows in Webhook Logs are excluded from success/failure stats and from the auto-disable counter — your webhooks won't be silently auto-disabled because of a license problem.
If you renew at any point — during grace, at expiry, or after — the state flips back to ACTIVE within about 5 minutes (Atlassian caches license status for up to 5 minutes). Click Refresh status on the Subscription card to force an immediate re-fetch.
Why these numbers?
Three reasons for having grace at all:
A failed payment shouldn't break production overnight. Card declines happen; finance approval cycles take time; webhooks shouldn't pay for that.
You need a clear prompt to renew. A silent passthrough turns into a forgotten subscription. The amber banner + paywall on writes is loud enough.
It's a middle ground. A hard cutoff at expiry would be too abrupt; a 30-day grace would be too lax.
And the reason monthly is shorter than annual:
On a monthly cycle a 14-day grace would be a free 14 days on top of a paid 30 — 47% extra service, easy to game by deliberately late renewals. 3 days is enough to cover a delayed card update without bending the economics.
On an annual cycle 14 days is ~3.8% of the paid period — well under any reasonable abuse threshold, and matches the procurement / PO cycles common in enterprise customers.
The values are fixed — there is no per-tenant override. If your billing cycle genuinely needs a longer window (e.g. you're on a multi-week PO process for renewal), tell us at support@ux-software.com — we may be able to coordinate with Atlassian on your behalf or grant a one-off extension.
A nudge before grace ever starts
Seven days before your subscription expires, the top-of-page banner flips to an amber Subscription ending soon state with a Renew button. This is the same regardless of monthly or annual billing — a week of advance notice is comfortable on both. The intent is for grace to be a fallback, not the primary signal: most renewals should happen during this 7-day window so you never enter grace at all.
What customers see in Webhook Logs after expiry
A delivery that would have fired but was suppressed because of the license gate appears as:
Status | Lozenge | Stats counted? | Auto-disable counted? |
|---|---|---|---|
Normal 2xx | Green | ✅ Success | — |
Normal 4xx/5xx | Red | ✅ Failed | ✅ Counted |
License skip | Neutral | ❌ | ❌ |
The neutral Skipped lozenge makes it obvious that the receiver didn't reject this — Webhooks Pro never sent it. Once you renew, normal delivery resumes on the next event.
Related
How the Webhooks Pro trial works — the step before grace, when grace doesn't apply yet.
Subscription states and SEN — the full five-state machine.
Webhook logs — where Skipped rows appear after grace ends.
Re-enable an auto-disabled webhook — different from the license gate, but often confused.