The dates to file and pay
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 wordsreturn is a jobtaxpayer is a subjectreview is a taskpreparer is a member
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:
grep -A6 "clocks: {" services/annual-return.ts 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 keeps it after a plan ends |
Each date comes from your code, on the brand's calendar, rolling past weekends and holidays.
JURISDICTIONS in lib/tax.ts holds each one's rule:
grep -A6 "export const JURISDICTIONS" lib/tax.tsexport 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. Every rule is illustrative.
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:
→ 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"}← job_4Tx2 · waiting · on party · $1,800.00 held · consent · ask_7Hq2 (consent)→ GET /clocks?job=job_4Tx2 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 lateThree 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:
→ POST /test_clocks/default/advance {"to":"2027-04-14T00:00:00Z"} 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 movedEach date moved on its own receipt; the date to pay closed on the deposit's:
→ GET /clocks?job=job_4Tx2 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 · satisfiedThe return credits the deposit on a workpaper line of its own, so July's return owes $0:
→ GET /returns/job_4Tx2← 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 runs it to the filing. Clocks covers every key, and A date the world sets builds one.