# create_instalment_plan_templates

Create one or more instalment plan templates in a workspace. Supports FULL_PAYMENT, CALENDAR_MONTHLY, and CUSTOM plan
types with optional advanced payments. Set `to` to null on a CUSTOM plan's last instalment to extend it to the booking
check-out date. Optional `tags` are applied after the template is created; if tagging fails the result still reports the
new template ID. Each template in the batch is created independently — partial failures are reported per-item. Use
`assign_instalment_plan_templates` afterwards to attach new templates to product groups.

<!-- INPUT_BLOCK_START -->

## Input

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `instalmentPlanTemplates` | `CreateInstalmentPlanTemplateInput[]` | Yes | Array of instalment plan templates to create - [CreateInstalmentPlanTemplateInput](#createinstalmentplantemplateinput) |

### CreateInstalmentPlanTemplateInput

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | No | Optional ID for the new template. Must be a UUID; if omitted, one is generated server-side. |
| `workspaceId` | `string` | Yes | The ID of the workspace that owns the template |
| `name` | `string` | Yes | Human-readable name for the template (max 255 characters) |
| `guarantorRequired` | `boolean` | Yes | Whether a guarantor is required when using this template |
| `academicYear` | `AcademicYear` | No | Academic year this template applies to. Omit for a year-agnostic template. - [AcademicYear](#academicyear) |
| `type` | `PlanType` | Yes | [PlanType](#plantype) |
| `tags` | `string[]` | No | Tag keys to set on the template, replacing any existing tags. Pass an empty array to clear all tags. Use list_tags with entity INSTALMENT_PLAN_TEMPLATE to discover existing keys. |

### PlanType

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | `PlanTypeKind` | Yes | Plan type discriminator. One of `FULL_PAYMENT`, `CALENDAR_MONTHLY`, or `CUSTOM`. FULL_PAYMENT = one payment; CALENDAR_MONTHLY = monthly instalments; CUSTOM = bespoke schedule requiring `startDate` and `instalments`. - [PlanTypeKind](#plantypekind) |
| `currency` | `string` | No | ISO-4217 currency code the plan is denominated in (e.g. GBP, EUR) |
| `startDate` | `string` | No | Start date of the plan (ISO date). Required when kind is CUSTOM. |
| `instalments` | `CustomInstalment[]` | No | Ordered list of instalments. Required when kind is CUSTOM; percentages must sum to 100. Only the last instalment may have a null `to`. - [CustomInstalment](#custominstalment) |
| `advancedPayments` | `AdvancedPayment[]` | No | Optional advanced payments collected before the regular instalment schedule begins - [AdvancedPayment](#advancedpayment) |

### CustomInstalment

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `to` | `string \| null` | Yes | End date of the instalment period (ISO date, e.g. 2025-12-31). Pass null on the last instalment only to make it open-ended ("Extend to booking check-out date"); it then runs to the booking's billing end date. |
| `percentage` | `string` | Yes | Percentage of the total due in this instalment, as a decimal string (e.g. "70.25") |

### AdvancedPayment

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `on` | `AdvancedPaymentOn` | Yes | [AdvancedPaymentOn](#advancedpaymenton) |
| `amount` | `AdvancedPaymentAmount` | Yes | [AdvancedPaymentAmount](#advancedpaymentamount) |

### AdvancedPaymentOn

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | `AdvancedPaymentOnKind` | Yes | Advanced payment trigger kind. One of `IMMEDIATE` or `DAYS_BEFORE_CONTRACT_START`. IMMEDIATE is due on booking; DAYS_BEFORE_CONTRACT_START is due N days before the contract start date. - [AdvancedPaymentOnKind](#advancedpaymentonkind) |
| `days` | `number` | No | Number of days before contract start. Required when kind is DAYS_BEFORE_CONTRACT_START. |

### AdvancedPaymentAmount

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | `AdvancedPaymentAmountKind` | Yes | Advanced payment amount kind. One of `PERCENTAGE`, `FIXED`, or `MONTHS`. Determines which of `percentage`, `fixedAmount`, or `months` must be populated. - [AdvancedPaymentAmountKind](#advancedpaymentamountkind) |
| `percentage` | `string` | No | Percentage value as a decimal string (e.g. "25.5"). Required when kind is PERCENTAGE. |
| `fixedAmount` | `AdvancedPaymentFixedAmount` | No | Fixed monetary amount. Required when kind is FIXED. - [AdvancedPaymentFixedAmount](#advancedpaymentfixedamount) |
| `months` | `string` | No | Number of months as a decimal string (e.g. "2.5"). Required when kind is MONTHS. |

### AdvancedPaymentFixedAmount

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `amount` | `number` | Yes | Monetary value in the smallest currency unit (e.g. cents/pence) |
| `currency` | `string` | Yes | ISO-4217 currency code (e.g. EUR, GBP, USD) |

### AcademicYear

| Value | Description |
| --- | --- |
| `YEAR_2025_2026` | 2025/26 academic year |
| `YEAR_2026_2027` | 2026/27 academic year |
| `YEAR_2027_2028` | 2027/28 academic year |
| `YEAR_2028_2029` | 2028/29 academic year |
| `YEAR_2029_2030` | 2029/30 academic year |

### PlanTypeKind

| Value | Description |
| --- | --- |
| `FULL_PAYMENT` | A single up-front payment for the full balance |
| `CALENDAR_MONTHLY` | Equal monthly instalments aligned to calendar months |
| `CUSTOM` | Bespoke instalment schedule defined by `startDate` and `instalments` |

### AdvancedPaymentOnKind

| Value | Description |
| --- | --- |
| `IMMEDIATE` | Due immediately on booking |
| `DAYS_BEFORE_CONTRACT_START` | Due N days before the contract start date |

### AdvancedPaymentAmountKind

| Value | Description |
| --- | --- |
| `PERCENTAGE` | Percentage of the total balance |
| `FIXED` | Fixed monetary amount in a specific currency |
| `MONTHS` | Number of months of contract value |

<!-- INPUT_BLOCK_END -->

<!-- OUTPUT_BLOCK_START -->

## Output

| Field | Type | Description |
| --- | --- | --- |
| `content` | `ContentItem[]` | Array of content items returned by the tool - [ContentItem](#contentitem) |
| `isError` | `boolean` | Whether the tool execution resulted in an error |

### ContentItem

| Field | Type | Description |
| --- | --- | --- |
| `type` | `'text'` | Content type (currently only 'text' is supported) |
| `text` | `string` | The text content to display |

<!-- OUTPUT_BLOCK_END -->
