Contract Ingestion

View as Markdown

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, then upload the PDF with 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

SituationRecommended approach
Contract PDF is on a closed-won HubSpot dealLet HubSpot sync handle it
Contract PDF is on a closed Salesforce opportunityLet Salesforce sync handle it
Contract is not in your CRM (legacy, partner paper, one-offs)Upload via API
One deal has multiple PDFsCRM sync creates one contract per file — use the API for additional documents
Custom workflow outside CRMUpload 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 first. See 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

$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

$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}.

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 before invoices can be sent.