Grace period and paywall behavior

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

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

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

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 Skipped row 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:

  1. A failed payment shouldn't break production overnight. Card declines happen; finance approval cycles take time; webhooks shouldn't pay for that.

  2. You need a clear prompt to renew. A silent passthrough turns into a forgotten subscription. The amber banner + paywall on writes is loud enough.

  3. 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?

Status

Lozenge

Stats counted?

Auto-disable counted?

Normal 2xx

Green 200 OK

✅ Success

—

Normal 4xx/5xx

Red 503 etc.

✅ Failed

✅ Counted

License skip

Neutral Skipped — license EXPIRED

❌

❌

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