# 01 — Target Salesforce Data Model

**Owner:** Dico Angelo · **Scope:** Partner Ops SSOT post-cutover · **ERD:** `../diagrams/ERD-salesforce-data-model.png`

## Design principle

The data model is not the answer. **The governance gate is.** Every object below exists to serve one gate: *every dollar of partner pipeline must pass through Deal_Registration__c with an Origin_Flag before it counts.*

## Object inventory

### `Partner_Account__c` (custom)
Replaces the HubSpot "Partner Company" record. One-to-one with an `Account` of type=Partner.

| Field | Type | Purpose |
|---|---|---|
| `Name` | Text | Legal entity |
| `Tier__c` | Picklist (Registered/Select/Premier/Elite) | Program tier; automation-driven |
| `Partner_Type__c` | Picklist (Reseller/MSP/ISV/Hyperscaler_Alliance) | Conflict routing |
| `Geo__c` | Picklist (AMER/EMEA/APAC) | Territory routing |
| `SF_Account__c` | Lookup(Account) | Join to standard Account |
| `Hubspot_Legacy_Id__c` | Text (ext. id, unique) | Cutover reconciliation key |
| `Tier_Pipeline_TTM__c` | Roll-up summary | Drives tier-up automation |

### `Deal_Registration__c` (custom — **the gate**)
The attribution governance object. One *approved* deal-reg per opportunity is the credit-of-record.

| Field | Type | Purpose |
|---|---|---|
| `Opportunity__c` | Master-Detail(Opportunity) | Scope |
| `Partner_Account__c` | Lookup(Partner_Account__c) | Credited partner |
| `Origin_Flag__c` | Picklist (ACE_Sourced/Nebius_Sourced/Partner_Initiated) | **Channel-conflict resolver** — freezes who gets credit before Clari reads it |
| `Status__c` | Picklist (Submitted/Approved/Expired/Rejected) | Workflow state |
| `Submit_Date__c` / `Approval_Date__c` | Date | Protection window anchors |
| `Protection_Days__c` | Number (default 90) | Contractual shield |
| `Source_System__c` | Picklist (hubspot/salesforce) | Cutover tracking |
| `Locked__c` | Checkbox | Set true at Stage=Propose to prevent retroactive re-attribution |

Validation rule: at `Opportunity.Stage = Qualify`, if `Partner_Role__c = sourced` and no Approved `Deal_Registration__c` exists, block stage advance.

### `Attribution_Split__c` (custom)
Many-to-one on Opportunity. Enables multi-partner credit (sourcing partner + influence partner on same deal). `SUM(Credit_Pct) = 100` enforced via trigger.

### `Partner_Touchpoint__c` (custom)
Evidence trail for influenced-pipeline claims. Type ∈ {Meeting, Email, POC, MDF_Event, Co_Sell}. Without at least one touchpoint, `Partner_Role__c=influenced` is blocked on save (closes the ghost-attribution finding below).

### Standard object modifications

**Opportunity** adds: `Partner_Role__c` (sourced/influenced/none), `Primary_Partner__c` (lookup), `GPU_SKU__c`, `GPU_Quantity__c`, `Commit_Type__c` (reserved/on-demand), `Source_System__c` (cutover flag).

**Account** adds: `Partner_Account_Flag__c`, `Hubspot_Legacy_Id__c` (external ID for dual-write validator).

## Why Origin_Flag is the most important field in this model

At Nebius, the same hyperscaler can be a customer (NVIDIA buys GPUs), a partner (NVIDIA resells), and a compete (NVIDIA DGX Cloud). `Origin_Flag__c` is the single field that tells Clari, Finance, and the rep whose number the deal lands on. Without it, every co-sell deal triggers a ticket. With it, the rule runs in metadata.

## Relationships (see ERD)

Account 1—* Partner_Account__c · Account 1—* Opportunity · Partner_Account__c 1—* Opportunity (primary) · Opportunity 1—* Deal_Registration__c (one Approved active) · Opportunity 1—* Attribution_Split__c · Opportunity 1—* Partner_Touchpoint__c · Partner_Account__c 1—* {Deal_Registration, Attribution_Split, Touchpoint}.
