# Release notes (plain-language)

This page is the **story** of what shipped—not a commit list. For every line item and hash, see the package changelogs and GitHub releases:

- [`accrue/CHANGELOG.md`](https://github.com/szTheory/accrue/blob/main/accrue/CHANGELOG.md) — machine-precise history for the core library
- [`accrue_admin/CHANGELOG.md`](https://github.com/szTheory/accrue/blob/main/accrue_admin/CHANGELOG.md) — same for the admin UI package
- [GitHub releases](https://github.com/szTheory/accrue/releases) — tags and generated notes (more technical)

`accrue` and `accrue_admin` live in one repo and are usually bumped together so your host app never depends on mismatched versions. `accrue_portal` ships in the same version family; for now, its package-specific history is easiest to track through the package changelog and README.

---

## Stable-core posture

Accrue follows a **stable-core / demand-driven expansion** posture. Release notes are a change story, not the static support contract. For canonical posture and boundaries, use [`maturity-and-maintenance.md`](maturity-and-maintenance.md), [`first_hour.md`](first_hour.md), and [`jobs_to_be_done.md`](jobs_to_be_done.md#scope-and-maturity).

## accrue

### 1.3.0

**Dunning analytics, recovered-revenue dashboard, in-app dunning banners, ENT-10 webhook scoping fix, and dependency maintenance.**

`1.3.0` ships the v1.46 feature batch. The recovered-revenue analytics API is now complete: `recovered_vs_lost_mrr/1`, `recovery_rate/1`, `funnel/1`, `at_risk_subscriptions/1`, `campaign_timeline/2`, `campaign_timeline_grouped/2`, and `invoices_for_campaign/2` are all documented, spec-annotated, and tagged `(since 1.3.0)` in ExDoc. The `/billing/analytics/recovery` LiveView integrates these into an operator-facing recovery funnel dashboard. In-app dunning banners ship in the `accrue_admin` package via the `DunningBanner` component, so operators can surface recovery prompts directly in the admin UI. The ENT-10 webhook scoping bug is fixed: the webhook cache is now per-entity, not global, eliminating cross-entity contamination for multi-tenant setups. Dependency maintenance: `accrue`, `accrue_admin`, and `accrue_portal` are all current on their upstream package floors.

### 1.2.0

**Idempotency foundations, Phase 128-142 rollout, and cross-currency analytics.**

`1.2.0` introduces the full dunning campaign engine, robust idempotency controls, and recovered-revenue analytics that correctly support multi-currency MRR aggregations. Includes major additions to the admin UI and structural foundations for offline proof paths.

### 1.1.2

**Patch release for linked release-contract alignment and CI stability.**

`1.1.2` is a small follow-up to the `1.1.1` linked publish line. It keeps the same public billing surface, then tightens the release contract around it: package docs, release notes, and CI now agree on the same three-package `accrue` / `accrue_admin` / `accrue_portal` version family.

### 1.1.1

**Linked-release recovery and public release-truth cleanup.**

`1.1.1` keeps the active-subscription-change and three-package release story from `1.1.0`, then tightens the public release contract after the first linked publish attempt. The shipped line, package docs, and recovery workflow now describe the same `accrue` / `accrue_admin` / `accrue_portal` version family more clearly.

### 1.1.0

**Official subscription-change flows, clearer release truth, same-version three-package publishing.**

This release makes **active subscription changes** feel first-party instead of implied. `swap_plan/3` and `preview_upcoming_invoice/2` are now part of the explicit public story, with provider-honest boundaries across Stripe, Fake, and the bounded Braintree path.

The operator and self-serve surfaces moved with the same contract: admin and portal flows now describe the same preview-before-commit story as the core library. The release process was also tightened so `accrue`, `accrue_admin`, and `accrue_portal` publish together with one clearer public version line, changelog, and install story.

### 1.0.0

**Stable public baseline for the core billing surface.**

`1.0.0` is the point where Accrue stopped reading like a promising pre-1.0 library and started reading like a deliberate public contract. The core checkout, billing portal, webhook, invoice, admin, docs, and proof surfaces were locked into a stable release line with clearer upgrade and maintenance expectations.

### 0.2.0

**Stripe Tax–ready billing, calmer installs, stronger CI trust.**

You can turn on **automatic tax** for subscriptions and checkout in a first-class way, with billing state and observability columns to match. The **Fake** processor understands the same shapes, so tests stay deterministic.

Install and boot got **clearer diagnostics**: preflight checks, webhook route awareness, and migration inspection errors surface as ordinary setup hints instead of mystery crashes. Docs and the **checked-in host demo** stay aligned so “what CI proves” and “what you run locally” mean the same thing.

Under the hood: Connect, webhooks, telemetry, and config refinements; release gates and package-doc checks got stricter so regressions are caught before they reach Hex.

### 0.1.2

Patch release focused on **HexDocs** and README polish so published docs match what you see on GitHub.

### 0.1.1

Early **CI and release pipeline** stabilization so public automation and docs publishing behave predictably.

---

## accrue_admin

The admin package is the **LiveView dashboard** that mounts into your Phoenix router. It tracks `accrue` closely—install the same version family for both.

### 1.3.0

Matches **accrue 1.3.0**: Ships the `FunnelChart` LiveComponent, the recovery dashboard LiveView at `/admin/analytics/recovery`, and the `AccrueAdmin.Components.DunningBanner` component for embedding context-aware in-app dunning notices in operator and portal surfaces. Also includes the `@since 1.3.0` annotation cleanup — all dunning and funnel functions now render `(since 1.3.0)` badges correctly in ExDoc.

### 1.2.0

Matches **accrue 1.2.0**: Ships the full Recovered Revenue Analytics dashboard, campaign timelines, and drill-down views, along with global admin search and dunning campaign visibility.

### 1.1.2

Matches **accrue 1.1.2**: the admin package stays on the same linked three-package release line, with public release notes and CI checks updated so the published version story stays consistent across the core, admin, and portal packages.

### 1.1.1

Matches **accrue 1.1.1**: the admin package stays on the linked three-package release line and picks up the same release-truth and recovery-path cleanup as the core package.

### 1.1.0

Matches **accrue 1.1.0**: the admin UI now documents and exercises the same active-subscription-change story as the core library, while staying aligned with the linked three-package publish flow.

### 1.0.0

Matches **accrue 1.0.0**: the admin package shipped as part of the stable public baseline, with the mounted operator dashboard and docs treated as a first-class part of the release contract.

### 0.2.0

Matches **accrue 0.2.0**: same tax and billing surface assumptions, asset and docs drift fixes alongside the core release.

### 0.1.x

Initial public releases with the admin UI, asset pipeline, and docs wired for the same Stripe-backed flows as the core library.

---

## How we version

- **Patch** — safe fixes, docs, and internal quality.
- **Minor** (pre-1.0) — new capabilities you can adopt incrementally; read the changelog before upgrading production.

When in doubt, read **[Upgrade](upgrade.md)** and run your usual test and staging passes.
