Resolve Funding Failures

An employer that fails to fund payroll will be blocked from running additional payrolls until all its funding failures are resolved. When a payroll debit fails, a funding failure requirement is created in Check's system to track the funding recovery process. An employer with outstanding funding failure requirements will be unable to run payroll until these funds are recovered.

The Requirements API provides the ability to identify these individual blockers on running payroll and track updates to the status of the funding recovery process for a given company, such as when an ACH redebit attempt is issued, the debit is retried via wire, or the funds have been successfully recovered.

curl -X GET \
  https://sandbox.checkhq.com/requirements?requirement=resolve_funding_failure \
  -H 'Authorization: Bearer YOUR_API_KEY'

To view all funding failures for a particular company, you can optionally pass in the company ID as a query parameter to the endpoint. Until these all of requirements are resolved, the company will be unable to run additional payrolls.

curl -X GET \
  https://sandbox.checkhq.com/requirements?company=com_yvgimu7i60cwfod0jhaft&requirement=resolve_funding_failure \
  -H 'Authorization: Bearer YOUR_API_KEY'
{
    "next": null,
    "previous": null,
    "results": [
        {
            "id": "req_hftmhftmhftmhftmhftm",
            "company": "com_yvgimu7i60cwfod0jhaft",
            "employee": null,
            "responsible_entity": "company",
            "requirement": "resolve_funding_failure",
            "categories": [
                "failed_payroll_debit"
            ],
            "status": "open",
            "errors": [],
            "guidance": {
                "document_options": null,
                "funding_detail": {
                    "payment": "pyt_2UjTShT7NqrfwLXF2WSG",
                    "payroll": "pay_vfywjO2tf6XnvVlDWHzw",
                    "funding_status": "ach_redebit_inflight",
                    "funding_message": "An ACH redebit attempt has been issued for this employer."
                }
            }
        },
        {
            "id": "req_rtxmhftmhftmhftmhftx",
            "company": "com_yvgimu7i60cwfod0jhaft",
            "employee": null,
            "responsible_entity": "company",
            "requirement": "resolve_funding_failure",
            "categories": [
                "failed_payroll_debit"
            ],
            "status": "open",
            "errors": [],
            "guidance": {
                "document_options": null,
                "funding_detail": {
                    "payment": "pyt_9ZjTShT7NqrfwLXF2WSF",
                    "payroll": "pay_XmLwjO2tf6XnvVlDWHzw",
                    "funding_status": "expecting_wire",
                    "funding_message": "Check is waiting for the failed debit attempt to be retried via wire."
                }
            }
        }
    ]
}

Example flow for a funding failure recovery via ACH

Step 1: Employer fails to fund payroll

A failed funding Requirement will be issued any time an employer fails to fund payroll. This can also be proactively retrieved by calling the List requirements endpoint.

The funding detail object contains the ID of the failed debit payment, as well as the associated payroll ID. These items can be queried via Check's Payments and Payrolls API to obtain more detailed information. This object also provides information about the funding state. In this case, it is clear that the employer has failed to fund payroll.

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"failed",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"failed",
         "funding_message":"The employer has failed to fund payroll."
      }
   }
}

Step 2: An ACH debit retry is issued

When a failed payroll debit is retried, the funding failure Requirement will update to an open status, reflecting a re-debit attempt and inform the consumer that an ACH re-debit is in-flight. Notice the change in funding_status and funding_message.

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"open",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"ach_redebit_inflight",
         "funding_message":"An ACH redebit attempt has been issued for this employer."
      }
   }
}

Step 3: The ACH debit retry completes and is awaiting the three-day ACH return window

When the re-debit attempt is sent to the employer's bank, the funding failure Requirement transitions to a pending status and the funding detail object contains relevant information including the date on which the re-debit is expected to clear the ACH return window. Note that ACH payments clear the return window on the third banking day following completion (i.e. completed on Monday, cleared on Wednesday).

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"pending",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"ach_redebit_awaiting_return_window",
         "funding_message":"An ACH redebit attempt has successfully completed for this employer, and is waiting for the three day ACH return window to clear on 2022-10-28."
      }
   }
}

Step 4: The ACH debit retry clears the three-day ACH return window

Finally, when the redebit attempt clears the return window, the funding failure Requirement will transition to a resolved status. At this point, the company may be unblocked from running payrolls if are no other unresolved failed funding requirements and the company is otherwise in good standing with Check.

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"resolved",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"resolved",
         "funding_message":"The payroll has been successfully funded and the funding failure has been resolved."
      }
   }
}

Example flow for a funding failure recovery via wire

Step 1: Employer fails to fund payroll

As in the example above, a funding failure Requirement is issued when an employer fails to fund payroll. This requirement will initially have a failed status and contain funding details about the affected payment and payroll.

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"failed",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"failed",
         "funding_message":"The employer has failed to fund payroll."
      }
   }
}

Step 2: A wire debit retry is issued

When a failed payroll debit is retried via wire, the funding failure Requirement updates to an open status. The funding detail field in the Requirement object reflects the expectation that the employer will initiate a wire transfer to fund the payroll.

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"open",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"expecting_wire",
         "funding_message":"Check is waiting for a wire to clear the failed debit attempt."
      }
   }
}

Step 3: Employer wires the funds

As in the example above, once the employer recovers from the funding failures (in this case, by sending a wire), the funding failure Requirement will transition to a resolved status and the company will be allowed to run other payrolls if are no other unresolved failed funding requirements and the company is otherwise in good standing with Check.

{
   "id":"req_hftmhftmhftmhftmhftm",
   "company":"com_yvgimu7i60cwfod0jhaft",
   "employee":null,
   "responsible_entity":"company",
   "requirement":"resolve_funding_failure",
   "categories":[
      "failed_payroll_debit"
   ],
   "status":"resolved",
   "errors":[],
   "guidance":{
      "document_options":null,
      "funding_detail":{
         "payment":"pyt_2UjTShT7NqrfwLXF2WSG",
         "payroll":"pay_vfywjO2tf6XnvVlDWHzw",
         "funding_status":"resolved",
         "funding_message":"The payroll has been successfully funded and the funding failure has been resolved."
      }
   }
}

What else keeps a company out of good standing

Resolving every funding failure does not always return a company to good standing. A company is in good standing when Check has no standing conditions on it, and Check puts a company out of good standing for one of five reasons. This is the complete set:

  • Failed debit. A failed payroll debit creates a resolve_funding_failure requirement, puts the company out of good standing, and records a funding strike. A failed collection or tax debit creates the requirement too, and it also puts the company out of good standing for partners on Check's standard risk policy, which is the default. Check places some partners on a low-risk funding policy instead, where a failed collection or tax debit creates the requirement without changing the company's standing. Common ACH return codes behind a failed debit are R01 (insufficient funds), R02 (account closed), R03 (no account or unable to locate account), R04 (invalid account number), R08 (payment stopped), R16 (account frozen), and R29 (corporate customer advises not authorized). Those codes come from the employer's bank and are not returned by the Check API; the payment object carries Check's own failure_code instead, described in Handling Failed Payments.
  • Late wire. A wire-funded payroll that passes its funding deadline while still unfunded puts the company out of good standing. This is a separate reason from a failed debit, and it clears when the wire arrives or the payroll is fully voided rather than through a funding failure requirement.
  • Fraud risk, compliance risk, and credit risk. Check applies these and clears them itself. They are not visible through the Requirements API.

A failed debit is the only one of the five that the Requirements API surfaces. The company object reports in_good_standing and nothing more, so it does not tell you which reason applies. That is what "otherwise in good standing with Check" covers in the flows above: a company can have no unresolved funding failure requirements left and still be blocked for one of the other four reasons.

Funding strikes

Each time an employer fails to fund a payroll, Check records a funding strike against the company. Strikes represent funding failure offenses, and a company's active strikes factor into Check's processing period demotion and termination decisions — a company that accumulates repeated funding failures may have its processing period lengthened, or in severe cases be removed from the platform.

You can retrieve a company's active funding strikes using the List active funding strikes endpoint:

curl -X GET \
  https://sandbox.checkhq.com/companies/com_yvgimu7i60cwfod0jhaft/funding_strikes \
  -H 'Authorization: Bearer YOUR_API_KEY'

This is useful for proactively monitoring a company's funding health and understanding why a company's processing period may have changed.

Webhooks

Similar to other Requirements objects, created and updated webhooks will be sent to indicate the creation of, or update to a funding failure Requirement.


Did this page help you?