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

# Contract Ingestion

Contracts can enter Tabs through several channels. All inbound paths feed into the same contract processing pipeline.

#### CRM sync

HubSpot syncs PDFs from closed-won deals. Salesforce syncs contract documents from configured opportunities. CRM sync creates one Tabs contract per PDF file.

#### E-signature platforms

DocuSign and PandaDoc can automatically email signed PDFs to Tabs once a signature is complete. The PDF attachment is required — a link alone won't work.

#### Email ingest

Email finalized contracts to `contract-ingest@tabsplatform.com` from an authorized company domain. The message must include a PDF attachment.

#### API

Create a contract record via [POST /v3/contracts](api:POST/v3/contracts), then upload the PDF with [POST /v3/contracts/\{id}/file](api:POST/v3/contracts/\{id}/file). Best for legacy agreements, batch imports, or workflows outside your CRM.

Your ERP handles accounting downstream — it does not upload contracts into Tabs. After a contract is processed, billing terms, invoices, and revenue data sync to your ERP per your configuration.

## When to use the API vs. CRM sync

| Situation                                                     | Recommended approach                                                          |
| ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Contract PDF is on a closed-won HubSpot deal                  | Let HubSpot sync handle it                                                    |
| Contract PDF is on a closed Salesforce opportunity            | Let Salesforce sync handle it                                                 |
| Contract is not in your CRM (legacy, partner paper, one-offs) | Upload via API                                                                |
| One deal has multiple PDFs                                    | CRM sync creates one contract per file — use the API for additional documents |
| Custom workflow outside CRM                                   | Upload via API alongside your existing CRM sync                               |

Every contract requires a Tabs **customer ID**. Customers are often already in Tabs from CRM sync before the contract arrives. If not, create one via [POST /v3/customers](api:POST/v3/customers) first. See [Customers](/customers) for more on how customer records work.

## Email ingest requirements

To use email ingest reliably:

* Send from an official company email domain (or a configured subsidiary domain)
* Attach a PDF — links from DocuSign or PandaDoc without a PDF attachment will not work
* Configure e-signature platforms to attach a signed PDF copy automatically when a document is completed

Emails from third-party domains (consultants, lawyers, advisors) cannot be automatically associated with your Tabs instance and must be uploaded manually.

## API upload flow

Tabs uses a two-step upload: create the contract record, then attach the PDF.

**Step 1 — Create the contract**

```bash
curl -X POST https://integrators.prod.api.tabsplatform.com/v3/contracts \
  -H "Authorization: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme - 2026 Order Form",
    "customerId": "{customerId}",
    "closeDate": "2026-01-15"
  }'
```

Save the `id` from the response. The contract is created with status `NEW`; processing has not started yet.

**Step 2 — Upload the PDF**

```bash
curl -X POST "https://integrators.prod.api.tabsplatform.com/v3/contracts/{contractId}/file?shouldProcess=true" \
  -H "Authorization: YOUR_API_KEY" \
  -F "file=@contract.pdf"
```

With `shouldProcess=true` (the default), Tabs stores the file and begins contract processing. Check status with [GET /v3/contracts/\{id}](api:GET/v3/contracts/\{id}).

Avoiding duplicates: CRM sync skips files it has already ingested. API uploads without a CRM external ID are treated as separate contracts. If the same file could arrive through both channels, link them explicitly via external IDs.

## Processing flow

After a contract is uploaded, Tabs runs automated extraction followed by human review before billing terms become visible in the app.

1. **Upload** — the contract PDF is attached to a contract record (status `NEW`)
2. **Extract** — Tabs reads the document and extracts billing terms, dates, and pricing
3. **Review** — trained accountants review the extraction before it goes live
4. **Link** — extracted terms are linked to the customer and organized into billing term groups

For live merchants, most contracts are instantly processed agentically. During implementation, your implementation manager schedules calibration sessions — the live SLA does not apply until go-live.

If Tabs creates a new customer during processing and can't confidently match it to an existing record, you'll need to [confirm the customer](/customer-ingestion#confirm-customer) before invoices can be sent.