The Application Flow

The application is where a financing offer becomes a signed agreement. It is fully hosted by Slate and embedded in your platform — the customer never leaves your product, and your platform never collects or forwards any of the application data. You open it either through the pre-approval banner (which launches it on click) or by embedding slate-application-form directly.

The application is created the moment the customer opens it — that's when you receive the application.created webhook.

There are two variants of the flow:

  • Standard — the customer applies for the pre-approved offer as-is, and Slate decides the final terms.
  • Adjust terms — the customer configures their own loan (amount, term, payment frequency) within the limits of their offer.

Both are covered below.

The components are authenticated with a session token you mint server-side for the logged-in customer (POST /user-session-token) — see Capital, Step 4. Webhooks are delivered and signed, see Webhooks.


Embed options

Two attributes on the embed change how the flow behaves:

Attribute What it does
skip-intro Skips the welcome screen, dropping the customer straight into the first form screen. Use it when your own UI already introduced the offer.
adjust-terms Switches the application to adjust terms mode: the customer picks their own amount, term and payment frequency instead of taking the offer as-is. See The adjust terms flow.
<slate-application-form
  env="live"
  user-token="<session-token>"
  skip-intro
  adjust-terms
></slate-application-form>

Both attributes also exist on slate-pre-approval-banner-v2 and slate-capital, and apply to the application they open.

What the customer is asked

The screens depend on the customer type:

Screen Business customer Person customer
Welcome ✓ (unless skip-intro) ✓ (unless skip-intro)
Business details (legal name, DBA, website…)
Personal details (name, email, phone, birthdate)
Address
Adjust terms only in adjust terms mode only in adjust terms mode
Bank connection

Any information you already provided is not asked again. If you sent the customer's details when creating them (POST /customers) or via an update, the corresponding screens are simply not shown — the customer only fills in what's missing. The more complete the data you send upfront, the shorter their application.

The bank connection screen connects the customer's bank account through Flinks. This is the account Slate disburses the funds to and debits the repayments from.


The standard flow

Customer opens the application ──► DRAFT
        │   confirms details, connects their bank (Flinks)

Submitted ──► PROCESSING ──► webhook: application.submitted
        │   Slate underwrites and decides

        ├──► Rejected ──► webhook: application.rejected — the flow ends

Approved with terms ──► REQUIRES_ACTION ──► webhook: application.ready-to-accept
        │   1. the customer verifies their identity (IDV)
        │   2. the customer reviews the approved terms and accepts

APPROVED ──► webhooks: application.approved · preapproval.consumed
             financing-agreement.created

1. The customer completes the form

The customer confirms their details and address, then connects their bank. Once the bank is connected, the application is submitted automatically — status moves to PROCESSING and you receive application.submitted (and application.bank.verified for the bank account).

2. Slate underwrites and decides

Slate reviews the application and makes a decision:

  • Rejected — you receive application.rejected and the flow ends there.
  • Approved with terms — Slate approves the application with a specific set of financing terms.

3. Two pending actions before the agreement

After approval, the application status becomes REQUIRES_ACTION and you receive application.ready-to-accept. The customer has two things left to do, in order:

  1. Identity verification (IDV) — a camera-based verification of the customer's ID document.
  2. Review and accept the terms — the customer sees the approved agreement terms: amount, factor rate, payment amount and schedule. Before accepting, they can reduce the amount — but never request more than what was approved.

4. Acceptance

When the customer accepts, the terms are final and executed: you receive application.approved, preapproval.consumed, and financing-agreement.created. From here the flow continues with the financing agreement — see Capital, Step 7.


The adjust terms flow

With adjust-terms enabled, the customer doesn't apply for the offer as-is — they configure their own loan. An extra screen appears after the details and address:

  • Amount — anything up to the offer's maximum.
  • Term — how many months to repay over.
  • Payment frequency — weekly or monthly.

As the customer adjusts these, Slate recalculates the resulting payment amount, fee and full payment schedule live, so they see exactly what they'd be committing to before continuing.

Customer opens the application ──► DRAFT
        │   confirms details, selects their terms, connects their bank
        │   verifies their identity (IDV)

Submitted ──► PROCESSING ──► webhook: application.submitted
        │   Slate underwrites the requested terms

        ├──► Terms accepted ──► agreement created, confirmation emails sent
        │                       webhooks: application.approved · preapproval.consumed
        │                                 financing-agreement.created

        ├──► Counter-proposal ──► REQUIRES_ACTION: "Confirm adjusted terms"
        │           │   the customer reviews Slate's proposed terms and confirms
        │           ▼
        │    agreement created with the confirmed terms

        └──► Rejected ──► webhook: application.rejected

How it differs from the standard flow:

  • The customer selects the terms first. After choosing them and connecting their bank, they complete identity verification (IDV) as part of the same flow — before submission, not after approval.
  • Underwriting evaluates the customer's requested terms. Three outcomes:
    • Accepted — the agreement is created directly with the terms the customer selected, and the confirmation emails are sent. No extra acceptance step.
    • Not accepted, but Slate has a counter-proposal — the customer gets a "Confirm adjusted terms" required action: they review Slate's proposed terms and must confirm them before the agreement is created.
    • Rejectedapplication.rejected, the flow ends.

Adjust terms mode applies to pre-approval offers only — it is not available for applications opened from a finance request (the Early Wage Access flow).


Application states

Status Meaning
DRAFT The customer opened the application and is filling it in
PROCESSING Submitted; Slate is underwriting
REQUIRES_ACTION The customer has a pending action — IDV, accepting terms, or confirming adjusted terms
APPROVED Final state: terms accepted, the financing agreement exists
REJECTED Final state: Slate declined the application
CANCELLED Final state: the application was cancelled

Check the current state any time with GET /v2/applications/{id}.

Webhooks

Event When it fires What you should do
application.created The customer opened the application Track engagement
application.submitted The form was completed and submitted Show an "under review" state
application.bank.verified The bank account was connected and verified Nothing — informational
application.ready-to-accept Slate approved with terms; the customer has pending actions (IDV, accept) Show an "action needed" state
application.approved The customer accepted; the application reached its final state Show an "approved" state
application.rejected Slate declined the application Show a "declined" state

data.id in every application.* webhook is the application id. As always, webhooks carry only the id — fetch the current state from GET /v2/applications/{id}.