> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.solvimon.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.solvimon.com/_mcp/server.

# import_order_form

**Live server:** on `mcp.solvimon.com` only the draft actions are available, see [Access modes](/mcp-server/developing-for-solvimon#access-modes).

Turns a signed order form or contract into a DRAFT quote that matches it, and reconciles the quote line by line against the contract. The agent reads the PDF and passes what it says as `order_form`; the server maps it onto your plan, checks every line and writes. All checks of `create_quote` apply too.

Run `mode: validate` (default) first. It writes nothing and returns the reconciliation. `mode: apply` builds the quote, and is refused while any line that doesn't match is not listed in `accept_differences`.

| Parameter                                              | Required  | Description                                                                                                                   |
| ------------------------------------------------------ | --------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `customer_id`                                          | Yes       | The customer. Create it first with `write_customer` if it doesn't exist                                                       |
| `pricing_plan_version_id` or `quote_template_id`       | Yes (one) | Never picked for you                                                                                                          |
| `document.document_id`                                 | Yes       | The signed PDF (`docu_...`), uploaded with `write_documents` or in Desk                                                       |
| `order_form`                                           | Yes       | The contract's content: parties, term, billing period, currency, price lines, services, limits, clauses, signature and totals |
| `owner_user_id` or `owner_email`, `name`, `contact_id` | No        | As in `create_quote`                                                                                                          |
| `quote_id`                                             | No        | Import into an existing DRAFT quote that has no schedule yet                                                                  |
| `custom_field_references`                              | No        | Quote custom fields to store the signing envelope id and the PDF's SHA-256 in                                                 |
| `accept_differences`                                   | No        | Row ids of differences you accept                                                                                             |
| `mode`                                                 | No        | `validate` (default) or `apply`                                                                                               |

What it does with the contract:

1. **Currency and billing period** must be offered by the plan version, or the call is refused naming what the version offers.
2. **Price lines** are matched to what the quote bills, by config id or by product item name. A line becomes a price override only when it differs from the plan price; a contract discount on a list price becomes a discount.
3. **Services** that only an add-on grants enable that add-on. **Limits** that differ from the plan become entitlement overrides.
4. **Payment term** in days becomes the quote's payment term.
5. **Customer details.** A DRAFT customer gets the contract's legal name, registration number, tax id, address and invoice email. A customer in another status is only compared.
6. **Clauses** become the quote version's text, in the contract's own numbering and words, without Desk's automatic blocks.
7. **The signed PDF** is attached to the version. The version is marked as not needing a signature, because it is already signed.

Every check is a row `{id, item, contract, solvimon, status, note}` with status `match`, `mismatch`, `set` (filled in), `not_storable` (such as a notice period Solvimon has no field for) or `on_apply` (the first invoice and the total contract value, checked once the quote exists). If the first invoice or TCV doesn't match the contract on apply and you didn't accept it, everything is rolled back.

**`Validate an order form`**

```json Validate an order form
{
  "customer_id": "cust_AbD3DqausjOYiMNDZY11F",
  "pricing_plan_version_id": "ppve_Zt6yUw2QmK9nXr4VcHb37",
  "document": {"document_id": "docu_Pq4nTx8WmK2vRb6YcLd31"},
  "order_form": {
    "parties": {"customer": {"legal_name": "Example Customer B.V."}, "supplier": {"legal_name": "Acme B.V."}},
    "term": {"start_at": "2026-12-01", "initial_term": {"type": "MONTH", "value": 12}, "payment_term_days": 30},
    "billing_period": {"type": "YEAR", "value": 1},
    "currency": "EUR",
    "price_lines": [
      {"description": "Platform fee", "amount": "35000.00", "period": "YEAR"},
      {"description": "Transaction fee", "percentage": "0.30", "included_volume": "10000000.00", "period": "YEAR", "billed": "ARREARS"}
    ],
    "services": [{"name": "usage metering"}],
    "limits": [{"name": "billing entities", "value": "1"}]
  },
  "mode": "validate"
}
```

Not done by this tool: creating the customer, ramp quotes, and sending the quote for signature.