# Update one partner relationship

`PATCH https://api.suger.cloud/org/{orgId}/prm/partner/{partnerId}`

Update the editable fields of one partner relationship: the assigned partner manager, the relationship status, the partner types, and the profile fields under `info` (company details, cloud account identifiers, CRM account link, champion contact, relationship and engagement type, tier, portal template, commission plan, Slack channel).

Every field is optional and merges independently — send only what changes; omitted fields keep their stored value. Set `partnerManager` to "__unassigned" to clear it. `partnerTier` must name a tier defined in this organization's partnership config, and `engagementType` must be a standard engagement type; either one being unknown fails the request.

Revenue, deal counts, recommendation scores and AI summaries are computed by Suger and cannot be set here. Use GetPrmPartnerDetail to read a partner's current values before updating.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgId` | path | string | yes | Organization ID |
| `partnerId` | path | string | yes | Partner ID |

## Request Body

Required.

Content-Type: `application/json` · Schema: `PrmPartnerUpdate`

**`PrmPartnerUpdate`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `info` | PrmPartnerUpdateInfo | no |  |
| `partnerManager` | string | no | PartnerManager is the assigned manager's identifier. Send "__unassigned" to clear it; omit to leave it unchanged. |
| `partnerTypes` | array<string> | no |  |
| `status` | partnership.Status | no |  |

**`PrmPartnerUpdateInfo`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `buyerIds` | array<string> | no | BuyerIDs / SellerIDs are the partner's cloud account identifiers, edited from the partner profile's Cloud Account IDs card. |
| `channels` | array<string> | no |  |
| `crmAccountInfo` | CrmAccountInfo | no |  |
| `customCommissionPlanId` | string | no | CustomCommissionPlanID assigns a custom commission plan to this partner. |
| `employees` | string | no |  |
| `engagementType` | EngagementType | no |  |
| `founded` | string | no |  |
| `location` | string | no |  |
| `name` | string | no |  |
| `partnerChampionContact` | PartnerChampionContact | no |  |
| `partnerTier` | string | no | PartnerTier must reference a tier defined in this org's partnership config. |
| `partnerViewTemplateId` | string | no | PartnerViewTemplateID assigns a partner-portal Overview template. |
| `relationshipType` | RelationshipType | no |  |
| `sellerIds` | object | no |  |
| `slackChannelId` | string | no |  |
| `slackChannelName` | string | no |  |
| `website` | string | no |  |

**`CrmAccountInfo`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `accountId` | string | no | AccountID is the CRM account/company record ID. |
| `accountName` | string | no | AccountName is the display name of the CRM account. |
| `provider` | string | no | Provider identifies which CRM the account belongs to ("SALESFORCE" or "HUBSPOT"). |

**`PartnerChampionContact`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `contactId` | string | no | ContactID is the CRM contact record ID. |
| `email` | string | no | Email is the contact's email address. |
| `name` | string | no | Name is the contact's full name. |
| `title` | string | no | Title is the contact's job title. |

## Responses

### 200 — OK

Content-Type: `application/json` · Schema: `orm.Partnership`

**`orm.Partnership`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `companyId` | string | no | The partner's company ID from identity.buyer.company_id, used to group buyers across channels |
| `createTime` | string | no | Creation timestamp |
| `domain` | string | no | Lowercased email domain of the partner (the OTHER side of the relationship). Used for dedup/lookup when provisioning partnerships from inbound flows where the partner has no Suger org and no engagement_id pairing exists. |
| `globalCompanyId` | string | no | FK to workload.global_company.id — links partnership to canonical company record for firmographic data |
| `id` | string | no | ID of the ent. Unique partnership identifier (UUID) |
| `info` | PartnershipInfo | no |  |
| `lastActivityTime` | string | no | Most recent activity timestamp (e.g., latest CPPO transaction), updated by sync job |
| `lastUpdateTime` | string | no | Last update timestamp |
| `organizationId` | string | no | The org that owns this partnership record (seller) |
| `partnerManager` | string | no | Suger user ID of the internal partner manager/owner (FK to identity.user, ON DELETE SET NULL) |
| `partnerOrgId` | string | no | The partner's own Suger org ID (nullable if partner is not a Suger org) |
| `partnerTypes` | array<string> | no | Types of partner: RESELLER, SI (System Integrator), ISV, OTHER |
| `partnershipSince` | string | no | When the partnership was established (e.g., first CPPO transaction date) |
| `status` | partnership.Status | no |  |

**`PartnershipInfo`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `aiOverview` | PartnershipAiOverview | no |  |
| `allowedRelationshipType` | RelationshipType | no |  |
| `buyerIds` | array<string> | no | BuyerIDs lists the Suger internal buyer IDs grouped under this partnership. Used by frontend to query CPPO offers via the existing offer API. |
| `channels` | array<string> | no | Channels lists the cloud marketplaces this partner operates on (e.g., ["AWS", "AZURE"]). |
| `crmAccountInfo` | CrmAccountInfo | no |  |
| `customCommissionPlanId` | string | no | CustomCommissionPlanID points at one of the org's custom commission plans (partnership_config.info.customCommissionSettings[].id). Empty/unset means "use Standard Defaults". The share-cosell flow uses this to prepopulate Revenue Share fields per commission type at deal-create time. |
| `description` | string | no | Description is a brief partner summary |
| `employees` | string | no | Employees is the partner's employee count as a string, derived from enriched company info. |
| `engagementType` | EngagementType | no |  |
| `founded` | string | no | Founded is the partner's founding year, derived from enriched company info. |
| `globalCompanyContactIds` | array<string> | no | GlobalCompanyContactIds holds IDs of global_company_contact records linked to this partnership. Contacts are read from global_company_contact table using these IDs. |
| `location` | string | no | Location is the partner's location (e.g., "Dover, Delaware"), derived from buyer company info. |
| `matchingAccounts` | array<MatchingCrmAccount> | no | MatchingAccounts lists the CRM accounts whose domain matches the partner's managed accounts. Only populated for partnerships with SUGGESTED status. |
| `name` | string | no | Name is the partner's display name, derived from the buyer with the most complete data. |
| `ourTier` | PartnerTier | no |  |
| `partnerBrand` | PartnerBrand | no |  |
| `partnerChampionContact` | PartnerChampionContact | no |  |
| `partnerTier` | string | no | PartnerTier is the ID of the tier this partner is assigned in the owning org's ISV-defined tier hierarchy (PE-10176). References a PartnerTier.ID in the org's PartnershipConfigInfo.Tiers. Set to the default tier when the partnership is created. Empty means "fall back to the org's default tier" at read time (e.g. a tier was deleted). |
| `partnerViewTemplateId` | string | no | PartnerViewTemplateID is the ID of the partner-portal Overview template (partnership_config.info.partnerViews.templates[].id) applied to THIS partner (design/partner-portal-customization). Empty/unset means "fall back to the org's Default Template" at render time. |
| `potentialRevenue` | number | no | PotentialRevenue is the total opportunity amount from matching CRM accounts. Only populated for partnerships with SUGGESTED status. |
| `recommendationReason` | string | no | RecommendationReason is an AI-generated human-readable explanation of why this partner is recommended. Only populated for partnerships with SUGGESTED status. |
| `recommendationScore` | number | no | RecommendationScore is a normalized score (0.0–1.0) indicating how good a match this partner is for the ISV. Only populated for partnerships with SUGGESTED status. |
| `relationshipType` | RelationshipType | no |  |
| `revenueByChannel` | object | no | RevenueByChannel is revenue broken down by cloud channel and YYYY-MM period. Example: {"AWS": {"2026-01": 50000}, "AZURE": {"2026-02": 30000}}. |
| `scoreBreakdown` | RecommendationScoreBreakdown | no |  |
| `sellerIds` | object | no | SellerIDs maps cloud partner to the partner's cloud-specific account ID. AWS -> AWS Account ID (12-digit), AZURE -> Azure MPO Seller ID. Used by frontend to pre-populate the reseller account field when creating CPPOs. |
| `slackChannelId` | string | no | SlackChannelID is the Slack channel this partner's broadcasts / co-sell activity post to. Empty/unset ⇒ no channel configured (PE-10527). |
| `slackChannelName` | string | no | SlackChannelName caches the channel's display name (e.g. "partner-cloudsync-suger"). |
| `sugerCosellMetrics` | PartnershipSugerCosellMetrics | no |  |
| `suggestedRelationshipType` | RelationshipType | no |  |
| `totalDeals` | integer | no | TotalDeals is the total count of CPPO-related offers for this partner. |
| `totalRevenue` | number | no | TotalRevenue is the sum of disbursed CPPO-attributed revenue for this partner. |
| `upcomingRevenue` | number | no | UpcomingRevenue is the total CommitAmount from active CPPO_OUT offers minus disbursed revenue. |
| `website` | string | no | Website is the partner's domain, derived from enriched company info. |

**`PartnershipAiOverview`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `cloudTier` | string | no | CloudTier is the partner's cloud marketplace tier level. |
| `description` | string | no | Description is a brief AI-generated summary of the partner company. |
| `employeeRange` | string | no | EmployeeRange is the approximate employee count range (e.g., "100-500"). |
| `error` | string | no | Error holds the error message if generation failed. |
| `foundedYear` | string | no | FoundedYear is the year the company was founded. |
| `headquarters` | string | no | Headquarters is the company's headquarters location (e.g., "San Francisco, CA, USA"). |
| `keyProducts` | array<string> | no | KeyProducts lists the partner's key products or services. |
| `knownCustomers` | array<string> | no | KnownCustomers lists notable customers of the partner. |
| `lastScraped` | string | no | LastScraped is the timestamp of the last AI overview generation (RFC3339). |
| `retryCount` | integer | no | RetryCount is the number of consecutive failed generation attempts for this partnership. The daily Sync Partnerships workflow caps retries at 3 and only retries after a 14-day backoff (see PE-9551). |
| `specializations` | array<string> | no | Specializations lists the partner's technical specializations. |
| `status` | string | no | Status indicates the generation result: empty for success, "failed" or "empty" on error. |
| `targetIndustries` | array<string> | no | TargetIndustries lists the industries the partner focuses on. |
| `website` | string | no | Website is the partner's website URL as reported by AI. |

**`CrmAccountInfo`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `accountId` | string | no | AccountID is the CRM account/company record ID. |
| `accountName` | string | no | AccountName is the display name of the CRM account. |
| `provider` | string | no | Provider identifies which CRM the account belongs to ("SALESFORCE" or "HUBSPOT"). |

**`MatchingCrmAccount`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `accountId` | string | no | AccountID is the CRM account record ID. |
| `accountName` | string | no | AccountName is the display name of the CRM account. |
| `domain` | string | no | Domain is the normalized domain of the CRM account's website. |
| `opportunityAmount` | number | no | OpportunityAmount is the total opportunity revenue from this account. |
| `opportunityCount` | integer | no | OpportunityCount is the number of opportunities on this account. |

**`PartnerTier`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `benefits` | string | no | Benefits is a freeform benefits line shown to partners. |
| `color` | string | no | Color is the badge color as a hex string, e.g. "#d4a017". |
| `description` | string | no | Description is shown to partners in the portal. |
| `id` | string | no | ID is a stable identifier referenced by PartnershipInfo.PartnerTier. Assignments survive tier renames/recolors because they key on ID. |
| `name` | string | no | Name is the display label, e.g. "Gold". |

**`PartnerBrand`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `bannerTagline` | string | no |  |
| `coverStyle` | string | no |  |
| `logoFileKey` | string | no |  |
| `logoSignedUrl` | string | no |  |
| `primaryColor` | string | no |  |
| `secondaryColor` | string | no |  |

**`PartnerChampionContact`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `contactId` | string | no | ContactID is the CRM contact record ID. |
| `email` | string | no | Email is the contact's email address. |
| `name` | string | no | Name is the contact's full name. |
| `title` | string | no | Title is the contact's job title. |

**`RecommendationScoreBreakdown`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `accountScores` | array<AccountMatchScore> | no | AccountScores holds per-matched-account scoring details. |
| `isSugerUser` | boolean | no | IsSugerUser is true if the partner is a Suger customer. |
| `matchCount` | integer | no | MatchCount is the number of CRM accounts that matched. |
| `rawScore` | number | no | RawScore is the unnormalized sum of account scores. |
| `sugerUserBonus` | number | no | SugerUserBonus is the additive bonus for being a Suger user. |
| `totalIsvAccounts` | integer | no | TotalISVAccounts is the total number of ISV CRM accounts (used for normalization). |

**`PartnershipSugerCosellMetrics`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `activeDeals` | integer | no |  |
| `avgDealSize` | number | no |  |
| `dealsOverTime` | array<PartnershipDealPeriod> | no | DealsOverTime holds quarterly deal counts for the Deals Over Time chart. |
| `lostDeals` | integer | no |  |
| `totalDealValue` | number | no |  |
| `totalDeals` | integer | no |  |
| `winRate` | number | no | Percentage (0-100) |
| `wonDeals` | integer | no |  |

**`AccountMatchScore`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `accountName` | string | no | AccountName is the CRM account name. |
| `baseConfidence` | number | no | BaseConfidence is the managed account's confidence mapped to a float (HIGH=0.9, MEDIUM=0.6, LOW=0.3). |
| `domain` | string | no | Domain is the matched domain. |
| `industryBonus` | number | no | IndustryBonus is +0.05 if the CRM account industry matches the managed account industry. |
| `locationBonus` | number | no | LocationBonus is +0.05 if the CRM account location overlaps with the managed account location. |
| `score` | number | no | Score is the total score for this account match (base + bonuses, max 1.0). |

**`PartnershipDealPeriod`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `count` | integer | no |  |
| `period` | string | no | e.g., "2025-Q1" |

### 400 — Bad request error

Content-Type: `application/json`

---

Interactive API reference: https://doc.suger.io/api/
