---
title: "The dates to file and pay"
url: https://services.dev/docs/examples/tax/deadline
captured: [tax-deadline.txt]
---
# The dates to file and pay

URL: https://services.dev/docs/examples/tax/deadline

> The annual return's dates as clocks, each state on its own rule. The date to file belongs to the signer of record, and three days out its rung deposits the tentative tax and files each extension that state needs. The date to file moves as far as each rule says; the date to pay never does. Three more dates outlive the return on the taxpayer.

*tax's words: return is a job, taxpayer is a subject, review is a task, preparer is a member (examples/tax/brand.ts).*

The date to file can be extended; the date to pay can't. So the annual return names a clock for each, and three more that outlive it:

```bash
grep -A6 "clocks: {" services/annual-return.ts
```

```txt title="magic values: none"
  clocks: {
    file: { due: fileDue, each: { of: 'jurisdictions' }, owner: 'of_record', rungs: ['notice 90d', 'notice 30d', 'run tentative 3d', 'ack daily 5d'], moves: { extend: extendedDue }, exposure: lateFiling, guarantee: { covers: ['penalties', 'interest on them'], up_to: 5_000, after: 'notice-response', excludes: 'held' } },
    pay: { due: payDue, owner: 'buyer', hard: true, rungs: ['notice 14d', 'escalate 3d'], satisfied_by: ['pay', 'file'], exposure: lateCost },
    assessment: { due: assessmentCloses, owner: 'brand', lives_on: 'subject', rungs: ['notice 30d'] },
    refund: { due: refundCloses, owner: 'of_record', lives_on: 'subject', hard: { bars: [{ step: 'amended-return.file', when: claimsRefund }] } },
    expiring: { due: earliestExpiry, owner: 'brand', lives_on: 'subject', rungs: ['notice 180d'] },
  },
```

| Clock | Due | Owner | Rungs | Satisfied, or moved |
|---|---|---|---|---|
| `file` | `fileDue`, one for each jurisdiction, by its own rule below, or a later date the client's own extension set | `of_record`, the signer of record | A notice 90 and 30 days out; `run tentative` 3 days out; an acknowledgement on each of the last 5 days | When that jurisdiction's filing commits. `extend` moves it to `extendedDue`, each state on its own receipt. `exposure` prices a month late; `guarantee` pays a penalty for a date the brand missed, up to $5,000 |
| `pay` | `payDue`, the federal date | `buyer`, the business | A notice 14 days out, an escalation 3 days out, each with what a month late costs | When `pay` or `file` commits, by `satisfied_by`. `hard: true`: nothing moves it |
| `assessment` | `assessmentCloses`: 3 years after filing, from the date it was due when filed early; 6 when a quarter of gross income was left out; or the date a signed Form 872 sets | the brand | A notice 30 days out | Lives on the taxpayer. The signer's seat of record, the cover's tail and the custodian end on it. A payment never moves it |
| `refund` | `refundCloses`: the same 3 years, or 2 years after the tax was last paid if later, and 6 months past a Form 872's date | `of_record` | none | `hard: { bars: [{ step: 'amended-return.file', when: claimsRefund }] }`: past it, an amendment for the year that claims money back is refused `date_passed` |
| `expiring` | `earliestExpiry`, the first carryforward to expire | the brand | A notice 180 days out | Lives on the taxpayer; [Carryforward watch](https://services.dev/docs/examples/tax/carryforward-watch.md) keeps it after a plan ends |

Each date comes from your code, on the brand's calendar, rolling past weekends and holidays.

## Each state keeps its own

`JURISDICTIONS` in `lib/tax.ts` holds each one's rule:

```bash
grep -A6 "export const JURISDICTIONS" lib/tax.ts
```

```txt title="magic values: none"
export const JURISDICTIONS: Readonly<Record<string, Rule>> = {
  US: { due: { 'C corp': 4, '*': 3 }, extend: { form: 'Form 7004', months: 6 } },
  'US-CA': { due: { 'C corp': 4, '*': 3 }, extend: { automatic: true, months: 7, voucher: 'FTB 3539' } },
  'US-NY': { due: { 'C corp': 4, '*': 3 }, extend: { form: 'CT-5', months: 6, carries: 'first installment' } },
  'US-NJ': { due: { 'C corp': 5, '*': 4 }, extend: { form: 'CBT-200-T', months: 6, paid: 0.9 } },
  'US-TX': { due: '05-15', extend: { form: '05-164', months: 6 } },
}
```

| Jurisdiction | A C corp's return is due | Its extension | Runs | Paid with it |
|---|---|---|---|---|
| Federal | the 15th of the fourth month, the third for others | Form 7004 | 6 months | the tax expected, deposited |
| California | the 15th of the fourth month, the third for others | automatic: nothing is filed | 7 months | by voucher, FTB 3539 |
| New York | the 15th of the fourth month, the third for others | CT-5 | 6 months | the tax expected, and next year's mandatory first installment, a quarter of this year's tax |
| New Jersey | a month after the federal date | CBT-200-T, valid only with 90% of the tax paid | 6 months | the tax expected |
| Texas | 15 May | its own extension | 6 months | |

A C corp's 30 June year begun before 2026 keeps the third month and a seven-month extension: [Beta Labs](https://services.dev/docs/examples/tax/clients.md#a-second-client-on-its-own-year). Every rule is illustrative.

## Ordered, the books not in

Ada leaves the organizer open. The date to file belongs to the signer of record, and there's none yet; its rungs fire all the same:

```txt
→ POST /returns {"service":"annual-return","business":{"name":"Acme Robotics","email":"books@acme.example"},"owner":{"name":"Ada Lovelace","email":"ada@example.com"},"ein":"12-3456789","tax_year":"2026","entity":"C corp","jurisdictions":["US","US-CA","US-NY","US-NJ"],"books":"https://books.example/acme","max_usd":1800,"key":"acme-extension"}
```

```txt title="magic values: none"
← job_4Tx2 · waiting · on party · $1,800.00 held · consent · ask_7Hq2 (consent)
```

```txt
→ GET /clocks?job=job_4Tx2
```

```txt title="magic values: none"
  clk_7Hq2#US     file  due 2027-04-15 · no owner: no member of record yet
  clk_7Hq2#US-CA  file  due 2027-04-15 · no owner: no member of record yet
  clk_7Hq2#US-NY  file  due 2027-04-15 · no owner: no member of record yet
  clk_7Hq2#US-NJ  file  due 2027-05-17, rolled from 2027-05-15 · no owner: no member of record yet
  clk_7Hq3        pay   due 2027-04-15 · owner buyer · open · about $324 a month if it's late
```

## The rung that deposits and extends

Three days out with nothing filed, the rung runs the tentative step: the year's tax as the ledger stands, less the estimates paid, deposited in each jurisdiction, then each extension its rule needs:

```txt
→ POST /test_clocks/default/advance {"to":"2027-04-14T00:00:00Z"}
```

```txt title="magic values: none"
  2027-03-16  clock file · rung notice 30d · due 2027-04-15 · US, US-CA, US-NY
  2027-04-01  clock pay · rung notice 14d · due 2027-04-15 · owner buyer · about $324 a month if it's late
  2027-04-10  clock file · rung ack daily 5d · no member of record to acknowledge: at risk on the owner console
  2027-04-11  clock file · rung ack daily 5d · no member of record to acknowledge: at risk on the owner console
  2027-04-12  clock file · rung run tentative 3d → tentative proposed · committed
  2027-04-12  tentative · the year as the ledger stands · US $73,710 · US-CA $6,205 · US-NY $7,605, and 2027's first installment $1,901 · US-NJ $6,318
  2027-04-12  clock pay · rung escalate 3d · due 2027-04-15 · owner buyer
  2027-04-12  pay · Treasury and states · 4 accepted, US first · rcp_7Hq2 · $95,739.00 deposited
  2027-04-12  clock pay · satisfied · pay committed
  2027-04-12  extend · US Form 7004 accepted → US-CA automatic, no filing; paid by voucher · US-NY CT-5 accepted · US-NJ CBT-200-T accepted, 100% paid
  2027-04-12  clock file · moved 2027-04-15 → 2027-10-15 · US, US-NY · US-NJ 2027-05-17 → 2027-11-15 · US-CA → 2027-11-15, automatic · each by its own rule · clock pay unmoved, still 2027-04-15
  2027-04-13  clock file · rung ack daily 5d · superseded: the date moved
```

Each date moved on its own receipt; the date to pay closed on the deposit's:

```txt
→ GET /clocks?job=job_4Tx2
```

```txt title="magic values: none"
  clk_7Hq2#US     file  due 2027-10-15 · moved from 2027-04-15 by extend, Form 7004 · next rung notice 90d on 2027-07-17
  clk_7Hq2#US-CA  file  due 2027-11-15 · moved from 2027-04-15 by extend, automatic: nothing filed
  clk_7Hq2#US-NY  file  due 2027-10-15 · moved from 2027-04-15 by extend, CT-5
  clk_7Hq2#US-NJ  file  due 2027-11-15 · moved from 2027-05-17 by extend, CBT-200-T, valid with 100% of the tax paid
  clk_7Hq3        pay   due 2027-04-15 · owner buyer · satisfied
```

The return credits the deposit on a workpaper line of its own, so July's return owes $0:

```txt
→ GET /returns/job_4Tx2
```

```txt title="magic values: none"
← job_4Tx2 · waiting · on party · $1,800.00 held · organizer
  rcp_7Hq2  US    pay     accepted · $73,710.00 · the Form 7004 deposit · paid 2027-04-12
  rcp_7Hq3  US    extend  accepted · filed 2027-04-12 · US Form 7004 2026 accepted
  rcp_7Hq4  US-CA extend  accepted · after rcp_7Hq3 · US-CA automatic, no filing; paid by voucher · $6,205.00 by FTB 3539
  rcp_7Hq5  US-NY extend  accepted · after rcp_7Hq3 · US-NY CT-5 2026 accepted · $9,506.00 with it, $1,901.00 toward 2027
  rcp_7Hq6  US-NJ extend  accepted · after rcp_7Hq3 · US-NJ CBT-200-T 2026 accepted · $6,318.00 with it

  record  consent · owner · §7216 | file clock · run tentative 3d · goto tentative | tentative · code | pay · Treasury and states · 4 accepted · rcp_7Hq2 | extend · IRS and states · 3 filed, US-CA automatic | file clock · moved, each by its own rule
  kept    at acceptance: paid 2026 US $73,710 · US-CA $6,205 · US-NY $7,605 · US-NJ $6,318, which the return's compute credits on a workpaper line of its own, "Tax deposited with Form 7004 $73710"
```

The return still waits on its books: [A year, and the next](https://services.dev/docs/examples/tax/years.md) runs it to the filing. [Clocks](https://services.dev/docs/service/clocks.md) covers every key, and [A date the world sets](https://services.dev/docs/grow/clock.md) builds one.

---

- Up: [The tax example](https://services.dev/docs/examples/tax.md)
- Previous: [Two clients, over the years](https://services.dev/docs/examples/tax/clients.md)
- Next: [Tax Plan](https://services.dev/docs/examples/tax/tax-plan.md)
