ENROLLMENT widget type walks a user through account setup immediately after they authorize your application. It has the same shape as the other widget types — the user is redirected straight into a task after authorizing — with one difference: you choose which setup steps the user sees.
Unlike the payout and pay-in types, this widget moves no money. There is no amount to confirm and no transaction to approve.
Prerequisites
- A widget application with OAuth settings in place. See Configure App Widget. Any application type can run this widget, including a permissions-only
OAuth Integrationapp. - The user must have granted your application’s scopes. Scopes are checked for the application as a whole, not per step. If any are missing, the widget sends the user through the OAuth consent screen before the first step, the same as the other widget types. No step is skipped or failed because of a scope.
- An OAuth user and an access token, same as the other widget types.
Choosing the steps
Pass an orderedsteps array in the pre-approved transaction token alongside transactionType: "ENROLLMENT":
amount is not required for this widget type. Everything else about the token is unchanged — see Set Up Your Server.
To link the user and run no setup steps, pass an empty array: steps: []. The widget ends at consent, so you get the grant and nothing else. This is the flow behind registerUser consent mode when you list no steps.
Supported steps
This widget runs personal identity verification only. Business verification (KYB) is not one of its steps — use the dedicated KYB widget type for that. See Business Registration.
Order
Steps run in the order you list them. Fluz does not reorder them, and there are no invalid combinations — none of the three steps is a prerequisite for another, so["PIN", "FUNDING_SOURCE", "KYC"] is as valid as ["KYC", "FUNDING_SOURCE", "PIN"].
List the steps in the order that makes sense for your product.
Skip behavior
A step the user has already satisfied is skipped silently — they never see its screen.
The funding-source step is never skipped, because a user who already has one source may want to add another. It always renders, and the user decides when to move on.
If every step you requested is already satisfied, or you passed
steps: [], the widget completes immediately after consent without rendering a step screen.
Because
FUNDING_SOURCE never auto-skips, a steps list that includes it always shows at least one screen. If you want the “nothing to do, complete immediately” outcome to be reachable, request only KYC and PIN.The funding source step
This step is deliberately open-ended. The user can add as many funding sources as they like in one visit — the screen lists what they have added so far and carries an explicit Continue control, so advancing is their decision rather than something that happens automatically after the first successful link. A user who does not want to add anything can move on without adding a source. Funding-source changes do not emit a webhook yet. A dedicated event is in progress. Until it ships, read the user’s funding sources with thegetWallet query after the flow completes. See Funding sources.
Opening a specific funding source
Staging only
targetFundingSource is currently supported only in the staging environment. Production widgets do not honor it yet; this page will be updated when it is rolled out.targetFundingSource to the token alongside steps:
This happens once, the first time the user reaches the step. After they link the source, they land on the usual funding source screen, which lists what they have added, lets them add another source of any type, and carries the Continue control. If they back out instead, they land on the type picker, where they can choose a different type or go back to the usual screen.
targetFundingSource changes only where the step starts. It does not restrict the user to that type, and it does not make adding a source required.
The claim is optional. Leave it out and the step opens on the usual screen. It is staging only for now — not yet supported in production.
Completion
When the last step resolves, the widget shows a completion screen. If you supplied acallbackUrl, it carries a button back to your application; otherwise it offers a Done control that closes the widget.
An enrollment that includes KYC only completes once identity verification passes. When a check fails, onError fires with US-0005 and onSuccess does not fire for that attempt. What happens next depends on where it failed: a check that ends with no further step to offer leaves the user on the form, where a retry that passes still completes the enrollment and fires onSuccess once; an account that goes into review is shown the review screen instead, and that session cannot complete. Either way, treat US-0005 as “not verified yet” rather than a final answer, and confirm the outcome from the KYC_STATUS_UPDATE webhook — which reaches you only if your application and the user’s grant both hold the VERIFY_KYC scope. See Outcome callbacks.
Rejected tokens
Thesteps and targetFundingSource claims are validated when the session opens. These all reject the session rather than degrading to a partial flow:
The user sees a generic “invalid widget link” screen — the specific reason is not shown to them, since a malformed token is an integration problem rather than something they can act on. Check your token generator, and see the error detail delivered to your
onError callback.
Next steps
Set up your server
Generate the pre-approved transaction token in your language.
Embed the widget
Script tag, init call, callbacks.
Verify by widget
What the user experiences during the KYC step.
Funding sources
What you can do with a source once it is linked.