# Tern Client Services

A linked company/contact/deal/activity pipeline with stage probabilities and a contact-import profile.

All entities and transactions are fictional. Snapshot: 2026-09-08.

## Start with the linked model

1. Open operations.xlsx and review the Summary sheet. Source tables contain stable primary keys and declared references.
2. Change source values in the workbook to explore the calculated totals and editable chart.
3. Compare output values with expected-results.json. The JSON Schema checks types; primary-key uniqueness and joins also require the listed semantic checks.
4. Use invalid-records.json only in a local validation harness. Its three cases exercise duplicate keys, wrong types and an orphan reference.

## Included tables

| Table | Records | Primary key |
| --- | ---: | --- |
| companies | 4 | company_id |
| contacts | 8 | contact_id |
| deals | 12 | deal_id |
| activities | 24 | activity_id |
| leads | 8 | lead_id |
| quotes | 12 | quote_id |
| projects | 3 | project_id |
| timesheets | 24 | time_id |
| invoices | 3 | invoice_id |

## Expected totals

- Total deal value: 34,500.00 USD. Sum deals.amount over the included records.
- Weighted deal value: 15,825.00 USD. Sum deals.weighted_amount over the included records.
- Recorded activity time: 720.00 minutes. Sum activities.minutes over the included records.

## Platform mapping

primary-records.csv is a generic example table. It is not a native platform export. Where this kit includes a named profile, use that profile’s separate CSV and schema and review its compatibility level before uploading.

The HubSpot CSV contains eight contacts with unique synthetic email addresses. It does not create associated deals or import marketing consent.

## Scope and assumptions

