> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comforthub.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Load the year's payroll calendar

> Turn ADP's schedule PDF into the pay periods everything else reads

export const Touches = ({systems}) => <p>
    <strong>Systems involved:</strong>{" "}
    {systems.split(",").map((s, i) => <span key={s}>
        {i > 0 ? " · " : ""}
        <a href={"/systems/" + s.trim()}>{s.trim().replace(/-/g, " ")}</a>
      </span>)}
  </p>;

<Touches systems="zoho-crm, supabase-backend" />

## Before you start

* The ADP payroll schedule PDF for the year.
* Zoho, with rights to edit the **Payroll** module.

## Steps

<Steps>
  <Step title="Create or open the Payroll record for the year">
    One record per year. The engine renames it "Payroll Schedule" plus the year once the read has run.
  </Step>

  <Step title="Attach the PDF">
    Upload it to the **ADP Schedule** field and save. The upload is what starts the read; there is no separate button. Uploading a corrected PDF later runs it again, and the newest upload wins.
  </Step>

  <Step title="Wait a few seconds and reload">
    The record fills in on its own.
  </Step>
</Steps>

## How you know it worked

* **Processing Status** reads Completed and **Processing Summary** says how many periods and holidays were read and that every check passed.
* The **Schedule** table lists the year's pay periods with period end, submit-by, processing and pay dates; the **Holidays** table lists the year's holidays, each marked statutory yes or no.
* The engine holds every pay period and every holiday marked statutory. A holiday marked statutory No is a worked holiday: it stays in Zoho, and the app treats that day as an ordinary work day.

## If it did not work

* **Processing Status** reads Needs Review: the PDF was read, but a check did not pass, and the summary names it. Nothing reaches the engine until a clean read. Fix the PDF and upload again.
* **Processing Status** reads Failed: the summary says why. "No PDF found on the ADP Schedule field" means the upload did not stick; "Could not read the PDF" means the file is not the ADP schedule the engine knows. Fix and upload again.
* The status never changes: the read failed and left a dead letter, and the monitor has opened a condition in Sentry. See [Act on a Sentry email](/handbook/running/act-on-a-sentry-email), then [Redrive a dead letter](/handbook/running/redrive-a-dead-letter) once the record is fixed.

## Related

* [How timesheets work](/handbook/hours/how-timesheets-work)
* [Know when the pay calendar runs out](/handbook/hours/know-when-the-pay-calendar-runs-out)
* [Zoho CRM](/systems/zoho-crm)
* [Glossary](/reference/glossary)
