---
id: JNY-MBR-MEM-004
title: "An administrator runs the renewal season"
feature: FEAT-MBR-MEM-05
product_area: membership
module: memberships
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes:
  - "inventory:MBR-ACC-0400"
  - "inventory:MBR-ACC-0404"
  - "inventory:MBR-ACC-0405"
  - "inventory:MBR-ACC-0414"
  - "inventory:MBR-ACC-0418"
  - "inventory:MBR-ACC-0419"
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
actor: ACT-MBR-006
goal: "See which memberships are expiring, bill every renewing member once, remind them, and drop those who lapsed."
capabilities:
  - CAP-MBR-MEM-014
  - CAP-MBR-MEM-013
  - CAP-MBR-MEM-003
  - CAP-MBR-MEM-009
screens: []
steps:
  - 'n': 1
    surface: "membership_attention_sweep"
    action: "The morning sweep runs."
    capability: CAP-MBR-MEM-014
    expected: "Alerts open for memberships ending within the horizon without a renewal."
    provenance: test
    source: "services-membership:modules/memberships/tests/integration/services/expiring-memberships.integration.spec.ts#publishes an open item for a membership whose term ends inside the horizon"
  - 'n': 2
    surface: "createBillingTemplate"
    action: "Record a renewal template with a notice, a reminder and a drop reason."
    capability: CAP-MBR-MEM-013
    expected: "The template is saved."
    provenance: test
    source: "services-membership:tests/e2e/billing-api.e2e.spec.ts#creates a template"
  - 'n': 3
    surface: "createBillingRun"
    action: "Create a run from the template over the terms ending this season."
    capability: CAP-MBR-MEM-013
    expected: "A draft run with the template's documents."
    provenance: test
    source: "services-membership:tests/e2e/billing-api.e2e.spec.ts#creates a run from the template"
  - 'n': 4
    surface: "planBillingRun"
    action: "Plan the run on today's date."
    capability: CAP-MBR-MEM-013
    expected: "Renewing and lapsed candidates with their orders, notices, reminders and drops, and the statistics."
    provenance: test
    source: "services-membership:modules/billing/tests/integration/billing-runs.integration.spec.ts#plans the candidates and their actions on the run’s date"
  - 'n': 5
    surface: "listBillingRunActions"
    action: "Review the planned actions."
    capability: CAP-MBR-MEM-013
    expected: "Each candidate's notice and reminder is listed."
    provenance: test
    source: "services-membership:tests/e2e/billing-api.e2e.spec.ts#plans it, and lists its notice and reminder"
  - 'n': 6
    surface: "executeBillingRun"
    action: "Execute the run."
    capability: CAP-MBR-MEM-013
    expected: "One order per renewing member, the notices and reminders submitted, and the lapsed terms dropped with the reason."
    provenance: test
    source: "services-membership:modules/billing/tests/integration/billing-runs.integration.spec.ts#executes on the jobs engine: one order per renewing candidate (Jo’s with both dues chapters), a notice and reminder each, one drop per lapsed term"
  - 'n': 7
    surface: "createTerm"
    action: "A member's renewal is committed."
    capability: CAP-MBR-MEM-014
    expected: "Their expiring alert is resolved as renewed."
    provenance: test
    source: "services-membership:modules/memberships/tests/integration/services/expiring-memberships.integration.spec.ts#resolves the item renewed in the staff renewal’s transaction"
alternates:
  - from_step: 3
    condition: "The administrator sets the template to run on a schedule instead."
    path: "A recurring run creates and plans one run per occurrence in the association's time zone."
    outcome: "The season runs itself, once per occurrence."
    provenance: test
    source: "services-membership:modules/billing/tests/integration/billing-runs.integration.spec.ts#creates and plans one run per occurrence of a recurring run, a redelivered occurrence finding it"
  - from_step: 6
    condition: "A member's term is corrected after the run was planned."
    path: "That member's action is settled as stale."
    outcome: "Nothing is billed on the old facts."
    provenance: test
    source: "services-membership:modules/billing/tests/integration/billing-runs.integration.spec.ts#refuses as stale an action whose term changed after planning"
failures:
  - from_step: 6
    condition: "The execution job fails part way."
    path: "The run returns to planned with its settled actions kept."
    outcome: "The administrator executes it again."
    provenance: unknown
    source: "FND-MBR-MEM-048"
  - from_step: 6
    condition: "Notices are submitted before Platform knows their purposes."
    path: "Platform stores the requests and sends nothing."
    outcome: "Members receive no notice."
    provenance: unknown
    source: "FND-MBR-MEM-046"
rules_in_play:
  - BR-CAP-MBR-MEM-014-01
  - BR-CAP-MBR-MEM-013-03
  - BR-CAP-MBR-MEM-013-05
  - BR-CAP-MBR-MEM-013-07
  - BR-CAP-MBR-MEM-013-08
  - BR-CAP-MBR-MEM-013-09
  - BR-CAP-MBR-MEM-014-07
assertions:
  - id: AS-JNY-MBR-MEM-004-01
    statement: "A second execution of the same run does nothing."
    provenance: test
    source: "services-membership:modules/billing/tests/integration/billing-runs.integration.spec.ts#does nothing on a second execution"
  - id: AS-JNY-MBR-MEM-004-02
    statement: "Each renewing member receives one order, with every chapter's dues on it."
    provenance: test
    source: "services-membership:modules/billing/tests/integration/billing-runs.integration.spec.ts#executes on the jobs engine: one order per renewing candidate (Jo’s with both dues chapters), a notice and reminder each, one drop per lapsed term"
  - id: AS-JNY-MBR-MEM-004-03
    statement: "Each lapsed member is dropped with the run's reason and keeps their term's dates."
    provenance: test
    source: "services-membership:tests/acceptance/billing/MBR-ACC-0400.acceptance.ts#MBR-ACC-0400"
e2e_policy: optional
e2e_reason: "Membership has no console screens yet; the journey is proved through the API and the jobs engine in process. A browser test becomes required when the billing screens are built."
evidence:
  - "services-membership at 5994c270e8a37a30f848e99ba5b5ee6b87c08893: the cited end-to-end, integration and acceptance specs and the capabilities they exercise."
  - "react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: acceptance/membership/journeys (the absorbed journeys and their recorded execution)."
---

# An administrator runs the renewal season

## Story

As the renewal season opens, the renewals team sees alerts for memberships about to expire. The administrator creates a run from the association's renewal template, plans it, and reviews who will be billed, reminded or dropped. Executing the run places one order per renewing member, sends the notices and reminders, and drops the members who lapsed. As members renew, their alerts close.
