Reactivation

Overview

A user in PAUSED status can return to ACTIVE through one of two flows:

Flow Endpoint Description

MX Reactivation

POST /users/{user_id}/reactivate

Admin-initiated. Sets user to active and unblocks Auth0. No payment collection.

Collect-on-Reactivation

POST /{user_id}/user/collect

User-initiated. Collects any outstanding float balance and reactivates the subscription before setting user to active.

MX Reactivation

Used by MX operations to reactivate a user without collecting payment. Typically used after resolving an investigation or manually clearing a situation.

Flow

POST /users/{user_id}/reactivate
     │
     ▼
User must exist and have status PAUSED ──No──► 400 Bad Request
     │ Yes
     ▼
Get current membership (or create base membership)
     │
     ▼
Write new membership record
  status: (empty — good standing)
  event_type: REACTIVATE
  reactivation_date: now
     │
     ▼
Update user status → ACTIVE
     │
     ▼
Unblock Auth0 account
     │
     ▼
Return 200 OK

Notes

  • Does not collect outstanding floats or reactivate a subscription.

  • Used exclusively via the admin API — not accessible to end users.

  • event_type is set to REACTIVATE (vs MANUAL_REACTIVATION for user-initiated) to distinguish source in the Kinesis stream and avoid triggering automated subscription cancellation logic downstream.

Collect-on-Reactivation

The primary user-facing reactivation flow. Collects any outstanding float balance, reactivates the subscription, updates the membership, and marks the user as active.

Request

{
  "tier": "base"
}

tier is optional and defaults to "base" if not provided or if the request body is empty. The tier is resolved to its current version from Growthbook before use.

Cooldown Period

A user cannot reactivate again within ReactivationLimitDays of their last reactivation date. Attempts within the cooldown window return 403 Forbidden.

Flow

POST /{user_id}/user/collect
     │
     ▼
Decode request body (default tier: "base")
     │
     ▼
Fetch tier config from Growthbook
Resolve tier version
     │
     ▼
User in INVESTIGATE status? ──Yes──► 405 Method Not Allowed
     │ No
     ▼
Get current membership
Check reactivation cooldown ──Within cooldown──► 405 Method Not Allowed
     │ Outside cooldown
     ▼
Repay outstanding float balance (Float Service)
  ├── Not found (no float): continue
  ├── Partial repayment (402): continue with partial
  └── Error: 500
     │
     ▼
Reactivate subscription (Subscription Service)
  ├── Already active (200): continue
  ├── Created (201): success
  └── Other error: 500
     │
     ▼
Write new membership record
  status: (empty — good standing)
  event_type: MANUAL_REACTIVATION
  reactivation_date: now
     │
     ▼
Update user status → ACTIVE
     │
     ▼
Persist active Plaid item records (remove TTLs)
  └── Failure: logged but non-fatal (user already charged)
     │
     ▼
Recalculate underwriting (Underwriting Service)
  └── Failure: logged but non-fatal
     │
     ▼
Send AppsFlyer acquisition event
     │
     ▼
Send reactivation receipt via Segment
     │
     ▼
Full float repayment?
  ├── Yes → 201 Created
  └── No  → 206 Partial Content

Response

Both 201 Created and 206 Partial Content indicate a successful reactivation. The difference is whether the outstanding float was fully collected.

Field Description

full_success

true if float was fully repaid (or no float existed); false if a remaining balance exists

amount_collected

Total amount collected (float + subscription), in dollars

amount_remaining

Outstanding float balance remaining after collection, in dollars

Partial Success (206)

A 206 Partial Content response means the user is fully reactivated but their float balance was not fully collected. The remaining balance will be retried on the next billing cycle. The user should be shown a message indicating the partial payment and remaining balance.

Reactivation Receipt

On success, a user-reactivation-receipt event is sent to Segment with the following fields:

Field Description

frequency

Billing frequency (e.g. "Monthly")

amount

Total amount collected (float + subscription)

float_amount

Amount collected toward the float

sub_amount

Subscription amount charged

reactivation_date

RFC3339 timestamp of reactivation

payment_type

Always "DEBIT"

mask

Last 4 digits of the debit card used

membership_tier

The tier the user reactivated to (uppercased)