At Moov, we think of payouts as any instance where you need to distribute funds to a payee. For example, you could be sending money to gig workers, contractors, or employees. In this guide, we cover the flow for initiating payouts with Moov.
If you’re planning to use the API via our Node SDK to onboard users, you can skip this section.
If you’re looking to use Moov Drops or Moov.js to onboard your senders, start by installing Moov.js. There are two different ways you can install Moov.js. You can do a script based installation, or initialize the package via npm.
import{loadMoov}from'@moovio/moov-js';constmoovAccessToken=awaitfetch(...);// Use your server to get a Moov access token with appropriate scopes
constmoov=awaitloadMoov(moovAccessToken);
Create an access token, which you’ll later include as the Moov Drop onboarding.token when onboarding your senders and payees.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import{Moov,SCOPES}from'@moovio/node';constmoov=newMoov({accountID:"YOUR_MOOV_ACCOUNT_ID",publicKey:"PUBLIC_KEY",secretKey:"PRIVATE_KEY",domain:"YOUR_DOMAIN"});constscopes=[SCOPES.ACCOUNTS_CREATE];try{const{token}=awaitmoov.generateToken(scopes);// Do something with token
}catch(err){// Handle any errors
}
If you’re sending payouts yourself you can skip this section.
Create accounts for the business users of your platform that will be sending payouts. Your senders will be subject to KYC verification. You have three different options for doing this:
Option 1: Onboarding Moov Drop
Collect the necessary information from your senders via a pre-built UI component.
Option 2: Moov.js with your own UI
Collect the necessary information from your senders using Moov.js
Option 3: API via Node SDK
When using our server-side Node SDK to onboard a sender, you can use the same code as you would when using Moov.js because the method names are the same.
// Onboarding Moov Drop
constonboarding=document.querySelector('moov-onboarding');// After generating a token, set it on the onboarding element
onboarding.token='some-generated-token';// Include your own accountID which can be found in the Moov Dashboard
onboarding.facilitatorAccountID='your-account-id';// Transfers and collect-funds capabilities are needed for this flow.
onboarding.capabilities=['transfers','collect-funds'];// Funding will occur with a bank account
onboarding.paymentMethodTypes=['bankAccount'];// Verify bank account with microdeposits
onboarding.microDeposits=true;// Follow the Onboarding Moov Drops and Plaid guides if linking bank accounts using Plaid.
// Open the onboarding flow when ready
onboarding.open=true;
// create Moov instance with generated token
constmoov=Moov('some-generated-token');// create Moov account, likely on form submit
moov.accounts.create({accountType:'business',profile:{business:{}},capabilities:['transfers','send-funds']}).then((account)=>{console.log(account);}).catch((err)=>{console.error(err);});// Generate a new token server-side with the accountID and update the token within your frontend app. You can chain methods together
moov.setToken('new-token');// add a representative to account
moov.accounts.representatives.create({accountID:'newly-created-accountID',representative:{}});// link a bank account
moov.accounts.bankAccounts.link({accountID:'newly-created-accountID',bankAccount:{holderName:'Name',holderType:'business',accountNumber:'0004321567000',routingNumber:'123456789',bankAccountType:'checking'}}).then((bankAccount)=>{// kick off micro-deposit verification
moov.accounts.bankAccounts.startMicroDepositVerification({accountID,bankAccountID});});// Later, verify micro-deposits
moov.accounts.bankAccounts.completeMicroDepositVerification({accountID,bankAccountID,[12,45]});// Asychronously, the ach-debit-fund payment method will be created from this verified bank account. If you want to move funds out of the Moov wallet, this bank account can be the destination of a wallet-to-bank transfer.
// create Moov instance with generated token
constmoov=Moov('some-generated-token');// create Moov account, likely on form submit
moov.accounts.create({accountType:'business',profile:{business:{}},capabilities:['transfers','send-funds']}).then((account)=>{console.log(account);}).catch((err)=>{console.error(err);});// Generate a new token server-side with the accountID and update the token within your frontend app. You can chain methods together
moov.setToken('new-token');// add a representative to account
moov.accounts.representatives.create({accountID:'newly-created-accountID',representative:{}});// link a bank account
moov.accounts.bankAccounts.link({accountID:'newly-created-accountID',bankAccount:{holderName:'Name',holderType:'business',accountNumber:'0004321567000',routingNumber:'123456789',bankAccountType:'checking'}}).then((bankAccount)=>{// kick off micro-deposit verification
moov.accounts.bankAccounts.startMicroDepositVerification({accountID,bankAccountID});});// Later, verify micro-deposits
moov.accounts.bankAccounts.completeMicroDepositVerification({accountID,bankAccountID,[12,45]});// Asychronously, the ach-debit-fund payment method will be created from this verified bank account. If you want to move funds out of the Moov wallet, this bank account can be the destination of a wallet-to-bank transfer.
You’ll need to create an account for each recipient and link their bank account. For the purposes of receiving the payouts, bank account verification via micro-deposits for the payees not required. Similar to how you would onboard your senders, you have three different options for onboarding payees:
Option 1: Onboarding Moov Drop
Collect the necessary information from the payees via a pre-built UI component.
Option 2: Moov.js with your own UI
Collect the necessary information from the payees using Moov.js
Option 3: API via Node SDK
When using our server-side Node SDK to onboard a payee, you can use the same code as you would when using Moov.js because the method names are the same.
// Onboarding Moov Drop
constonboarding=document.querySelector('moov-onboarding');// After generating a token, set it on the onboarding element
onboarding.token='some-generated-token';// Include your own accountID which can be found in the Moov Dashboard
onboarding.facilitatorAccountID='your-account-id';// Transfers and collect-funds capabilities are needed for this flow.
onboarding.capabilities=['transfers','collect-funds'];// Funding will occur with a bank account
onboarding.paymentMethodTypes=['bankAccount'];// Verify bank account with microdeposits
onboarding.microDeposits=true;// Follow the Onboarding Moov Drops and Plaid guides if linking bank accounts using Plaid.
// Open the onboarding flow when ready
onboarding.open=true;
// create Moov instance with generated token
constmoov=Moov('some-generated-token');// create Moov account, likely on form submit
moov.accounts.create({accountType:'business',profile:{business:{}},capabilities:['transfers','send-funds']}).then((account)=>{console.log(account);}).catch((err)=>{console.error(err);});// Generate a new token server-side with the accountID and update the token within your frontend app. You can chain methods together
moov.setToken('new-token');// add a representative to account
moov.accounts.representatives.create({accountID:'newly-created-accountID',representative:{}});// link a bank account
moov.accounts.bankAccounts.link({accountID:'newly-created-accountID',bankAccount:{holderName:'Name',holderType:'business',accountNumber:'0004321567000',routingNumber:'123456789',bankAccountType:'checking'}}).then((bankAccount)=>{// kick off micro-deposit verification
moov.accounts.bankAccounts.startMicroDepositVerification({accountID,bankAccountID});});// Later, verify micro-deposits
moov.accounts.bankAccounts.completeMicroDepositVerification({accountID,bankAccountID,[12,45]});// Asychronously, the ach-debit-fund payment method will be created from this verified bank account. If you want to move funds out of the Moov wallet, this bank account can be the destination of a wallet-to-bank transfer.
// create Moov instance with generated token
constmoov=Moov('some-generated-token');// create Moov account, likely on form submit
moov.accounts.create({accountType:'business',profile:{business:{}},capabilities:['transfers','send-funds']}).then((account)=>{console.log(account);}).catch((err)=>{console.error(err);});// Generate a new token server-side with the accountID and update the token within your frontend app. You can chain methods together
moov.setToken('new-token');// add a representative to account
moov.accounts.representatives.create({accountID:'newly-created-accountID',representative:{}});// link a bank account
moov.accounts.bankAccounts.link({accountID:'newly-created-accountID',bankAccount:{holderName:'Name',holderType:'business',accountNumber:'0004321567000',routingNumber:'123456789',bankAccountType:'checking'}}).then((bankAccount)=>{// kick off micro-deposit verification
moov.accounts.bankAccounts.startMicroDepositVerification({accountID,bankAccountID});});// Later, verify micro-deposits
moov.accounts.bankAccounts.completeMicroDepositVerification({accountID,bankAccountID,[12,45]});// Asychronously, the ach-debit-fund payment method will be created from this verified bank account. If you want to move funds out of the Moov wallet, this bank account can be the destination of a wallet-to-bank transfer.
The sender’s bank account will be the source of funds, so we’ll need the ach-debit-fund payment method that was created after they linked their bank account and completed KYC.
The payee’s bank account will be the destination for funds. We’ll use the ach-credit-sameday payment method that was created after their bank account was linked.
This is optional, but if you want to know the status of the transfer, you can subscribe to the transfer.updated webhook event in the Moov Dashboard. This will keep you informed on what stage the transfer is at (read more for a granular list of transfer statuses).
For a sense of the ACH same-day transfer timing, see the diagram below. The payment is processed the same day, then funds will be made available later to account for possible returns or processing issues.