---
title: "Creates an Invoice Schedule"
method: POST
path: "/schedules"
tags: ["Schedule"]
---

# Creates an Invoice Schedule

`POST /schedules`

Required permission: Recurring Invoices - New

Accepts every settable field on a schedule, so a schedule can be fully configured in one
call. Add its line items afterwards with `POST /schedules/{id}/line_items`, or seed them
from an existing invoice by passing `invoice_id`.

`id`, `account_id`, `created_at`, `updated_at` and `last_run` are read-only. So are
`subscription_status` and `recurring_type_id`, which are maintained for you: the first is
recomputed from the linked contract and the unpaid invoice count on every run, and the second
is what selects the billing engine for the whole schedule.

Every id in the request is checked against your account before anything is written, so a
rejected request changes nothing. Errors come back as
`{"error": ["Location can't be found", ...]}` with status 422.

## Request body

- object
  - `customer_id` integer, required — Customer the schedule bills. Required on create.
  - `name` string, required — Name of the schedule itself. Required.
  - `frequency` 'Daily' | 'Monthly' | 'Weekly' | 'Biweekly' | 'Quarterly' | 'Semi-Annually' | 'Annually' | 'Biennially' | 'Triennially', required — How often the schedule runs. Required.
  - `next_run` string, date, required — Date of the next run, `YYYY-MM-DD`. Required. Any other format is rejected with 422 `{"error": "Sorry, unable to read the date, use this format: Y-m-d"}`.
  - `contract_id` integer — Contract this schedule is billed under. Must belong to the same customer as the schedule.
  - `location_id` integer — Location the generated invoices belong to.
  - `user_id` integer — Employee credited with the generated invoices, for commission.
  - `invoice_term_id` integer — Billing terms applied to the generated invoices.
  - `template_id` integer — Invoice template used to render the generated invoices. Must be an invoice template. Defaults to the account's.
  - `source_id` integer — The schedule this one was copied from. Recorded for reference only — it does not copy anything. Use `invoice_id` on create to seed line items.
  - `invoice_id` integer — Create only, and not stored on the schedule: the schedule's line items are seeded from this invoice's line items. Must be an invoice on your account.
  - `period_mode_id` 0 | 1 | 2 | 3 — Which billing period the generated invoice covers. `0` in arrears (period ends on the invoice date), `3` in arrears exclusive (ends the day before), `1` in advance (starts the day after), `2` in advance inclusive (starts on the invoice date).
  - `last_day_of_month` boolean — Move each run to the last day of its month.
  - `paused` boolean — A paused schedule generates nothing until it is resumed.
  - `generated_invoice_name` string — Name given to each invoice this schedule generates.
  - `memo` string — Memo copied onto the generated invoices.
  - `keep_pricing_current` boolean — Re-price every line from the current product price on each run, instead of holding the price captured when the line was added.
  - `allow_blank_invoices` boolean — Generate an invoice even when the run produces no lines.
  - `email_customer` boolean — Email the generated invoice to the customer.
  - `snail_mail` boolean — Post the generated invoice to the customer.
  - `email_receipt` boolean — Email the customer a receipt after a successful charge.
  - `charge_mop` boolean — Auto-charge the stored payment method. Without a `payment_id` the schedule still generates invoices but charges nothing and records a failed payment on each run.
  - `payment_id` integer — Stored payment method to auto-charge. Must be a payment profile belonging to this schedule's customer.
  - `charge_on_due_date` boolean — Charge on the invoice due date rather than on the run date. Only meaningful together with `invoice_term_id`.
  - `apply_credit` boolean — Spend any available customer credit against the generated invoice.
  - `reset_prepay_hours` boolean — Reset the customer's prepaid hours on each run.
  - `invoice_unbilled_ticket_charges` boolean — Pull the customer's unbilled ticket charges onto the generated invoice.
  - `invoice_unbilled_ticket_statuses` string — Restrict the unbilled ticket charges to tickets in these statuses. Send either a comma-separated string or a JSON array of strings; both are stored comma-separated. Every status must exist on your account. Blank means all statuses.
  - `unbilled_ticket_charge_order` 'ticket_number' | 'ticket_resolved' | 'ticket_created' | 'timer_started' | 'timer_ended' — Order the unbilled ticket charges are added in.
  - `create_ticket_on_failed_billing` boolean — Open a ticket when a run fails to bill.
  - `create_ticket_one_month_prior_to_end` boolean — Open a ticket a month before the linked contract ends.
  - `schedule_retry_card_on_failed_billing` boolean — Retry the stored card later when a charge fails.

## Response `200`

Fully configured in a single call

## Other responses

- `422` — Invalid request

## Changes

- **2026-09-02** `e3aca54060e1` — 4 breaking, 22 info
  - the request property `customer_id` became required
  - the request property `frequency` became required
  - the request property `name` became required
  - the request property `next_run` became required
  - …22 more
- **2026-08-29** `dfc1c332d2c2` — 1 info
  - added the new optional request property `contract_id`

[Change history](https://skmtc.dev/syncromsp/apis/syncro/changes/schedules/post.md)

---

[API](https://skmtc.dev/syncromsp/apis/syncro.md) · [All operations](https://skmtc.dev/syncromsp/apis/syncro/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/syncromsp/syncro/revisions/e3aca54060e1/schema)
