payout_account and keeps it in step through webhooks.
Account creation
The onboarding job runs every minute. It picks up sellers that are open or pending approval and were created or updated since its last run. For each seller without a payout account it:- Creates an Express account in Stripe, with
manualPayoutsapplied when you set it. - Saves it as the seller’s
payout_account, with statuspending. - Creates an onboarding link and saves it on the account’s
onboardingrecord.
onboarding.enabled: false on the plugin to stop the job from creating accounts. Sellers then create theirs from the vendor Stripe page.
With onboarding.prefill: true on the payout module, new accounts start with the seller’s country, business type and business profile, so the seller types less in Stripe’s form.
Onboarding links
Stripe’s onboarding links expire after a few minutes and can be opened once. Mercur never shows a seller a stale one:- The vendor Payouts page shows the account’s status and a Continue onboarding action, which always asks for a fresh link.
- When a seller opens an expired link, Stripe sends them to
<refreshBaseUrl>/payout/onboarding/refresh?token=.... Mercur checks the account’s onboarding token, creates a new link and redirects the seller to it. - When onboarding is done, Stripe sends the seller to
onboarding.returnUrl, usually the vendor Stripe page.
Account status
Everyaccount.updated webhook re-reads the account from Stripe and recomputes its status:
The KYC status is derived from Stripe’s requirements on the same read:
When an account becomes
active, the seller’s orders that were waiting for an account are queued, and the next payout run pays them.
What sellers see
The vendor Stripe page, under Integrations, shows:- The Stripe account id and whether card payments are enabled
- What Stripe still needs, grouped as Currently due, Past due and Pending verification. Each item is Stripe’s requirement name, such as
individual.verification.document - The seller’s settlements, with the period, the net amount and the bank payout that paid it
What operators see
Open a payout account in the admin, from Payouts or from the store page’s Payout account section. The Stripe section in the sidebar shows the Stripe account id, Stripe’s disabled reason in plain words, and the currently due and past due requirements. Its menu has:- Open in Stripe: the connected account in your Stripe Dashboard
- Ignore store / Stop ignoring: see Ignoring a store
Map an existing account
If a seller already has a connected account on your platform, for example from an earlier setup, attach it instead of creating a new one. In Settings → Stripe, choose Map existing account, pick the store and enter theacct_... id. Mercur creates the payout account, syncs it from Stripe and opens it.
A store that already has a payout account can’t be mapped again.
Ignoring a store
Ignoring a store keeps its payout account and its onboarding, but the payout job skips its orders. Use it while you investigate a seller, or for a store you settle outside Stripe. Stop ignoring the store and the next payout run picks up the orders that waited. Ignoring setspayout_ignored on the seller’s metadata.
KYC monitoring
Webhooks keep accounts current, but a missed webhook leaves an account stale until its next change. SetkycMonitor.enabled: true on the plugin to re-read every account from Stripe every six hours. When any account’s KYC status isn’t approved, the technical contact gets one email listing those accounts with their KYC status and disabled reason.