Supplier Lifecycle

States

        register
            │
            ▼
      ┌──────────┐   underwriting     ┌────────────────────┐
      │ Pending  │──────approves─────▶│ PendingActivation  │
      └──────────┘                    └────────────────────┘
            │                                   │
            │  underwriting                     │  activation completes
            │  rejects                          │  (contract signed)
            ▼                                   ▼
      (application                        ┌──────────┐
       closed)                            │  Active  │
                                          └──────────┘
                                            │      ▲
                       policy violation,    │      │  reinstatement
                       lost API access,     │      │
                       failed payments      ▼      │
                                          ┌───────────┐
                                          │ Suspended │
                                          └───────────┘
                                                │
                                cancellation confirmed
                                                ▼
                        cancelationStatus = Canceled (+ Suspended)

supplierStatus values come from SupplierStatusType in @payability/pyb-ng2-api. Cancellation is not a fifth status — it is the combination cancelationStatus === Canceled and supplierStatus === Suspended, which is exactly what selectIsSupplierCancelled checks.

What each state unlocks

State Gains Loses / never had

Pending

Onboarding routes. With the Expedited schema: ADVANCE_LINE_PENDING_ACTIVATION and VIEW_ADVANCE_LINE_WIDGET. TRANSFER_INFORMATION once pmtCfgProvided.

TRANSFER_FUNDS. VIEW_NOTIFICATIONS when pending and expedited.

PendingActivation

Same as Pending — both are covered by isUserPending().

Same as Pending.

Active

TRANSFER_FUNDS, TRANSFER_INFORMATION, REFERRAL. With payment history: REPORTS, DAILY_SUMMARY, SELLER_CARD.

—

Suspended

Keeps TRANSFER_FUNDS — money already owed remains accessible.

WITHDRAW_ADVANCE_LINE is explicitly denied while suspended.

Cancelled

A read-only view plus the reactivation path.

Product actions.

Transition triggers in the client

The client never sets supplierStatus — it re-reads it. Every action that could change eligibility ends with:

this.store.dispatch(userStatusUpdateRequested());

which runs getSupplierStatus(id) → userStatusUpdated → userPermissionsRequested → recalculation. Call sites include:

  • completing any DocuSign flow,

  • completing an Advance Line withdrawal,

  • accepting an Instant Advance,

  • finishing onboarding activation,

  • UpdateUserStatusTask inside any composed flow.

The dashboard status axis

dashboardStatus.status is orthogonal to supplierStatus and decides which shell the supplier sees.

Value Meaning

onboarding

Still in the onboarding funnel. Suppresses REPORTS, DAILY_SUMMARY, SELLER_CARD and REFERRAL regardless of other flags.

welcome

Onboarding finished; the welcome experience has not been dismissed.

inactive_dashboard

Account exists but the full dashboard is not available.

active

The normal dashboard.

OnboardingComponent reads this value to route the supplier to the correct step, and DashboardStatusGuard uses it to push onboarding users back to /dashboard.

Cancellation and reactivation

cancelationStatus moves null → Pending → Canceled. The client surfaces this through CancellationBannerInitializerService and the cancellation survey. See Cancellation & Reactivation.

Suspension

suspensionReason carries a sh.susp:* code that maps to specific copy and, in several cases, a specific remediation CTA. See Suspension.

Onboarding schema, an orthogonal axis

Schema Value Effect on the lifecycle

Base

3.0

Standard path.

WithPlaid

3.0_plaid

Standard path plus mandatory Plaid bank linking.

Expedited

exp_onb

Advance Line products available while Pending / PendingActivation.

AmazonExpedited

amzn_exp_onb

Amazon-specific expedited variant.

Next

NEXT

Next-generation onboarding.

PermissionsService.isUserPendingAndExpedited() compares against OnboardingSchemaEnum.Expedited only. AmazonExpedited suppliers do not receive early Advance Line permissions from that predicate, despite the name.

Impersonation

Staff entering through /auth/auth (LoginAsSupplierComponent) see exactly the state described above — the client computes permissions from the impersonated supplier’s real User object, with no bypass.