Payroll Status

Stages in the lifecycle of a Payroll

Once a payroll is approved, Check will automatically collect funds from the employer's bank account, make sure wages are transferred into employees' bank accounts on payday, and remit tax payments on time. We handle all of this behind the scenes, but you will still want to keep tabs on your payroll as it moves through each phase of its lifecycle.

Check surfaces status information on the payroll objects returned by our API through the status field. A payroll can have one of four statuses: draft, pending, processing, and paid. Below is an overview of these statuses, what they mean, and how payrolls transition between them.


Payroll status webhooks

When a payroll makes status transitions from pending to processing and from processing to paid, you can receive webhook notifications from our platform. See the webhook documentation for more details about how to set this up.

Payroll Status Lifecycle



When a payroll is first created, it will be in the draft status. You can modify a draft payroll in any way you see fit. Payments to employees can be added and removed, earnings and hours worked can be modified on individual payroll items, etc. You can only delete a payroll while it's in draft.

Certain fields like net_pay, taxes, and benefits are null on a draft payroll because they haven’t been calculated yet. In order to see what these fields would be set to based on the current configuration of the payroll, you can preview the payroll using the /payrolls/<payroll_id>/preview endpoint. This causes our API to perform and surface the same calculations that will be performed when the payroll is approved, but does not change the status of the payroll.

Note that only draft payrolls can be previewed, and they can be previewed any number of times.


Historical Payroll Items

Payroll Items related to historical Payroll objects will retain a status of draftin scenarios where their related Payroll may be inPaidbecause they are not being pushed through the lifecycle outlined above.


When a payroll is approved (via the /payrolls/<payroll_id>/approve endpoint), its status changes to pending. Once pending, the payroll can no longer be modified or previewed. This is because the taxes, net pay, and benefits have been calculated and saved for the payroll.

If you determine that an error exists in the payroll, you can still reopen the payroll (via the /payrolls/<payroll_id>/reopen endpoint), which will move it back into the draft status. Once reopened, a draft payroll can again be modified, previewed, and even deleted. Ultimately, if and when it is approved again, the payroll will move back into the pending status.


Sandbox Behavior

In our sandbox environment, we automatically transition payrolls from pending to processing to paid every five minutes. We do this to simulate the behavior of a payroll in production on a shorter time scale.


At the end of each business day at 5pm PT, our system collects all pending payrolls that have an approval_deadline on that day and begins the multi-step process of moving money through the banking system to pay them out. The first step in this process is to submit an ACH transaction to debit the cash requirement for a payroll from the employer’s bank account. When a payroll’s debit transaction has been sent to the ACH network, it moves into a new status: processing.

Once a payroll is processing, it can no longer be reopened. If you require a change to a processing payroll, reach out to us directly.


Due to the nature of the ACH network, the employer debit transaction will take 3 business days to complete. For example, if you approve a payroll with a Friday payday on Monday, we should have the employer’s funds in our bank account by Thursday morning. Once Check has the employer’s cash requirement, we submit ACH transactions to send net pay to each employee who is set up for direct deposit. When these transactions complete, the payroll enters its final status: paid. Once here, the employees' payments for your payroll have been sent out . The employees are happy, and employers can focus on their business!


Unfortunately, there will be times when an ACH payment to an employee or a contractor is returned. This can happen for a number of reasons, but the most common is an invalid account/routing number or frozen bank account. In cases like these, it is important that you have insight into the exact state of the payments. To handle this, Check will mark the returned payroll item or contractor payment as failed, and mark the parent payroll as partially_paid. This status means that we have attempted to send out employee or contractor payments and one or more of these payments failed. If you need to resolve a failure, please reach out to us directly. After the employee or contractor payment failure has been handled you will see the payroll's status flip back to paid.


Just as we will unfortunately see times that an employee's payment will fail, there will also be times when the ACH transaction to debit the cash requirement for an employer's payroll will be returned. One common reason this occurs is because there are insufficient funds for the transaction in an employer's bank account at the time of request. When this happens, Check sets the payroll's status to be failed and, if possible, pauses in-flight employee and contractor payments for that payroll. Our team then works with you to quickly wire the cash requirement for the failed payroll before unpausing and delivering the payroll's employee and contractor payments.


Testing sandbox failure behavior

For more information on how to reach failed and partially_paidstatus in Sandbox, see our Payments Guide.