# Private Offers

View, share, and manage your private offers across AWS, Azure, and GCP from the Offers page in Fours Console.

---

## Overview

The [**Offers**](https://console.suger.io/offer) page in Fours Console is your central place for tracking and managing every private offer you send. From here you can monitor pipeline health, find specific deals, take actions on an offer (cancel, clone, extend, share, notify contacts, download EULA, export its terms as a PDF), [link many offers to Salesforce records or HubSpot deals at once](#bulk-link-offers-to-salesforce-or-hubspot), and track offer statuses across all three cloud marketplaces.

In Fours, you don't edit a private offer in place once it is sent. Instead, you manage it through the actions on this page: cancel it, clone it into a corrected version, extend its expiry date, notify additional contacts, download the EULA, or export its terms as a PDF. To manage any offer, open the **Offers** section in the Fours Console and select the offer you want to work with. Most actions live in the **More actions** menu on the offer detail page. Each of these actions is also available from the Salesforce App — see [Manage Offers in the Salesforce App](/salesforce-app/salesforce-app-offer/).

:::info
Which actions you can take depends on the offer's current status. See [Track offer statuses](#track-offer-statuses) below for details on each state.
:::

## Quick pipeline view

At the top of the Offers page, a set of summary cards shows the current state of your deal pipeline. These cards update automatically based on the latest status from AWS, Azure, and GCP, giving you a quick snapshot of both pipeline health and revenue performance in one place.

![Quick pipeline view in the Offers page](images/aws-offers-in-suger-1.webp)

- **Newly accepted offers** — offers recently accepted by the buyer. Use this to confirm which deals have just closed and are ready for handoff to implementation or customer success.
- **Total revenue** — the total revenue value from your deals in the system (in USD). For deeper breakdowns like invoiced, collectible, or disbursed amounts, use the **Revenue** or **Home** dashboards.
- **Pending acceptance** — offers that have been sent but are still waiting for buyer action. Use this to quickly identify deals that may need follow-up before they expire.
- **Recently expired** — offers that were not accepted before their expiration date. Use this to spot stalled deals that may need to be reissued or extended.

## Sections of the Offers page

The Offers page lists its sections in a rail on the left: **Offer**, **Offer Set**, **Resale**, **Logs**, and **Settings**. **Offer** and **Offer Set** are two ways to view your pipeline, depending on how your deals are structured. **Resale** holds your resale authorizations. **Logs** shows the background operations behind your offers. **Settings** holds your private offer settings; it appears only for seller, reseller, and partner organizations, set apart at the bottom of the rail.

- **Collapse the rail:** click the chevron at the top of the rail to shrink it to icons, and click it again to expand it. The console remembers your choice for this page.
- **In a narrow window:** the rail stays on screen, as it does in a wide one; collapse it to icons to give the page more room.

### Offer section

This is your main view for managing offers. It shows **each individual private offer** across AWS, Azure, and GCP.

From here, you can:

- Track standard, single-offer deals
- Check offer status and progress
- Search or filter across all cloud providers

### Offer Set section (AWS only)

This view groups multiple AWS offers into a single bundle (up to 10 offers). It's used only for AWS Marketplace deals that involve multiple products being sold together.

Use this view when:

- You are selling a multi-product solution in AWS
- You want to bundle multiple offers into one buyer flow
- You need to manage AWS offer sets instead of individual offers

See [Create an AWS Marketplace offer set](#create-an-aws-marketplace-offer-set) below.

### Resale section

**Resale** lists resale authorizations, which let a channel partner resell a seller's product. It used to be the **Resale** page in the console's main navigation; links to that page now open this section.

A **Sent** / **Received** picker sits after the search box:

- **Sent** — the resale authorizations you've created for your channel partners. Click **New Resale Authorization** to create one.
- **Received** — the resale authorizations other sellers have sent your organization, for products you resell. It's available only when your organization has **Enable Reseller** turned on; otherwise the picker shows it greyed out and marked *Reseller off*.

For the steps on each marketplace, see [AWS Marketplace CPPO](/aws-marketplace/cppo/), [Azure Marketplace CPPO](/azure-marketplace/cppo/), and [Google Cloud Marketplace CPPO](/gcp-marketplace/cppo/).

### Logs section

The **Logs** section lists the operations Fours runs in the background on your offers. These include creating, canceling, and extending offers, syncing them, creating offer sets, and [bulk linking](#bulk-link-offers-to-salesforce-or-hubspot).

- **Row contents:** each row shows the operation's **ID**, **Status**, **Workflow Type**, offer **Type**, **Provider**, and **Timestamp**.
- **Narrow the list:** use the **Provider**, **Workflow Type**, **Status**, and **Offer Type** filters or the search box.
- **Download:** click **Export CSV** to download the rows you see.

### Settings section

Seller, reseller, and partner organizations also have a **Settings** section, last in the rail and set apart from the others. It holds the private offer settings that used to be under **Settings** › **Private Offer**; an old link to that location now opens this section. The settings are split into three tabs:

- **CRM** — the Salesforce, HubSpot, and Dynamics 365 settings that fill in offers created from your CRM.
- **Products** — the list products filter, product and dimension tagging, and dimension sync.
- **Defaults** — the default values for new offers.

For what each setting does, see [Private Offer Field Mapping](/settings/private-offer-mapping/).

## Find the right offer

When you have a large number of offers, use search and filters to quickly locate specific deals without scrolling through the full list.

### Search

Use the search bar to quickly find a specific offer by **name, buyer, or Offer ID**. This is the fastest way to jump directly to a single deal when you already know what you're looking for.

![Search in the Offers page](images/aws-offers-in-suger-4.webp)

### Filters

Use filters when you want to narrow down your pipeline instead of finding one specific deal. For example, view all offers in `Pending_Acceptance`, or filter by AWS vs. Azure vs. GCP.

![Filters in the Offers page](images/aws-offers-in-suger-5.webp)

### Columns

Customize the table columns to control what information you see in the Offers list, so you can tailor the view to what matters most without cluttering the table.

![Columns in the Offers page](images/aws-offers-in-suger-6.webp)

Click the **Columns** button to add fields you want to see or remove fields you don't need. Your changes affect only your view, not other users.

## Cancel an offer

Canceling an offer withdraws it before the buyer accepts it. Use this when an offer has incorrect details or is no longer needed. A sent offer isn't edited in place in Fours, so canceling lets you remove the incorrect offer and start fresh.

:::warning

- You can't cancel an accepted offer. Once accepted, you'll need to cancel the entitlement or process a refund instead. See [Amend or cancel an Entitlement](/billing/amend-cancel-entitlement/).
- Reseller Private Offers (CPPO offers) can only be canceled by the reseller, from their own Fours Console or marketplace portal: **Cancel** doesn't appear on one in your console, and the Fours API refuses to cancel it.
  :::

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the offer you want to cancel, then click **Cancel** in the top-right corner.
   ![Cancel an offer in the Fours Console](images/aws-manage-offers-1.webp)

3. Confirm the action.

Once cancelled, the buyer can no longer see the offer in their AWS portal. The status moves to `Pending_Cancel` while Fours processes the request, then becomes `Canceled` once AWS confirms it. No charges or entitlements are activated.

### When to cancel

- The buyer requested changes after the offer was sent.
- The offer contains incorrect information (for example, wrong AWS Account ID, pricing, or term).
- The offer was misconfigured (for example, wrong pricing or the wrong product was selected).

After canceling, you can **clone** the canceled offer to quickly recreate a corrected version using the same structure.

## Clone an offer

Cloning copies an existing offer into a new draft so you don't have to rebuild it from scratch. This works for both active and canceled offers.

:::info
Not all offer types support cloning. You can't clone an Upsell/Renewal offer or a Reseller Private Offer.

- For upsells and renewals, the new offer must start from the active entitlement instead.
- For Reseller Private Offers, you don't need to take action unless your Resale Authorization has expired — in that case, issue a new one so the reseller can cancel the incorrect offer and create a replacement.
  :::

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the offer you want to clone.
3. Click **More actions**, then select **Clone Offer**.
   ![Clone an offer in the Fours Console](images/aws-manage-offers-2.webp)

4. Make your updates to the pre-filled offer draft. Fields marked with an asterisk (*) are required.
5. Click **Create offer** to submit the new offer.

**Create offer** stays greyed out while a required field is empty or a value isn't valid. To see what's left, hover over the button, or press Tab until it has focus. Its tooltip, headed *Please complete:*, lists each step that still needs work and the fields in it — for example, *Step 2 Offer terms — Expiry Date* — with the reason beside any value that isn't valid.

### When to clone

- You're sending a similar offer to a different buyer.
- You canceled an offer and want to reuse its structure.
- You need to make small adjustments, such as pricing or term changes.

### What gets copied

- Product
- SKUs and pricing
- Term dates
- EULA, except a file Fours can't reuse (see below)
- Internal notes

A clone reuses only EULA files stored in Fours. When the original offer's custom EULA is a document Fours read from the marketplace rather than a file uploaded in Fours — as on an offer synced from AWS or Azure Marketplace — the clone keeps the custom EULA choice but leaves out the file, and the form shows *The EULA file from the original offer can't be reused. Upload it again.* Upload the file before you create the offer. Cloning a resale authorization works the same way for its reseller agreement: *The reseller agreement file from the original offer can't be reused. Upload it again.*

### What to update before resubmitting

- Buyer ID(s)
- Offer name
- Any updated pricing or expiration dates

## Extend the expiry date of an offer

Extending an offer pushes back the expiration date so the buyer has more time to review and accept it. This saves you from recreating the offer if the deadline passes before the buyer responds.

You can extend offers in the `Pending_Acceptance`, `Expired`, and `Update_Failed` statuses. Extending an expired offer reactivates it so the buyer can access and accept it again. `Update_Failed` is included so that a failed extend can be retried — if an extend request fails, the offer is left in `Update_Failed` and the **Extend Expiry Date** action reappears so you can try again.

You can't extend a CPPO offer — the private offer a channel partner created on AWS from your resale authorization. The channel partner owns it, so only they can extend it: **Extend Expiry Date** doesn't appear on it in your console, and the Fours API refuses the request.

When the marketplace rejects an update such as an extension, the offer page shows an **Update Offer Failed** alert with the marketplace's reason. Azure offers don't show this alert.

For AWS offers, **More actions → History** shows a **Why AWS rejected this** panel under the failed entry, with AWS's error code and message and the latest attempts (up to three) with their change set IDs. The same panel appears in the **Logs** section of the **Offers** page.


1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the offer you want to extend.
3. Click **More actions**, then select **Extend Expiry Date**.
   ![Extend Expiry Date action in the Fours Console](images/aws-manage-offers-3.png)

4. Enter the **New Expiry Date**, then **Save** your changes. The new date must be in the future **and** later than the offer's current expiry date — the same date or an earlier one isn't an extension.
   ![Set a new expiry date](images/aws-manage-offers-4.png)

   Two more limits can apply, and the date picker offers only the days that meet all of them:

   - **The offer has a start date.** The new expiry date must also be earlier than the offer's start date. Google Cloud requires a scheduled start date to be later than the offer's acceptance deadline ([Set up your offer's pricing](https://docs.cloud.google.com/marketplace/docs/partners/offers/set-up-pricing-model)), and AWS rejects an agreement start date that isn't after the offer's availability end date (`INVALID_AGREEMENT_START_DATE` in [Work with private offers using the AWS Marketplace APIs](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-validity-terms)).
   - **Google Cloud offers.** The new expiry date can be at most three months from today, because Google requires an extended deadline to fall within three months ([Modify a published offer](https://docs.cloud.google.com/marketplace/docs/partners/offers/modify-offer)). The latest date allowed is shown under the date picker.

   If the start date leaves no such day, the dialog says the offer can't be extended, names its current expiry date and its start date, and suggests [cloning the offer](#clone-an-offer) with a new start date instead. **Save** stays disabled.

:::info
A new expiry date that isn't later than the current one is rejected **immediately** when you save, with an error naming the offer's current expiry date, so you can correct the date and resubmit right away. Earlier, the request appeared to succeed and then failed quietly in the background minutes later, leaving the offer in `Update_Failed` with no obvious explanation.
:::

### When to extend

- The buyer hasn't accepted the offer and the expiry date is approaching.
- You're in ongoing negotiations but need more time.

## Share the offer with your buyer

Once your offer is ready, you have two ways to get it to your buyer: **copy the link** yourself or **trigger an email** directly from Fours. Use whichever fits your workflow.

### Share the offer URL

Manually copy the offer link and send it to your buyer through your own email or messaging tool.

:::info
Wait a few minutes before sharing. After you create an offer, the marketplace needs 3 to 5 minutes to finish processing it. The offer URL isn't available until the status updates to `Pending Acceptance`.
:::

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the offer and wait for the status to show `Pending Acceptance`.
3. Click **Copy Offer URL** in the top-right corner.
   ![Copy Offer URL button in the Fours Console](images/aws-manage-offers-5.png)

4. Send the link to your buyer.

### Notify contacts

The **Notify Contacts** feature sends an email with the offer link and current status directly to people linked to the offer. Use this to keep buyers and internal stakeholders informed without sending emails manually outside of Fours.

:::info
Fours sends this email only when **Enable Email Notification** is on and the **Notify offer contacts** row (`NOTIFY_CONTACTS.OFFER`) is saved switched on in your [email configuration](/settings/email-notification/). The console can show that row switched on before it has been saved.

- The row's **Offer Notification Contacts** rule resolves to the contacts you pick here.
- Anyone else in the row's recipients is included too.
- Contacts you notify together receive one shared email.
:::

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the relevant offer.
3. Click **More actions**, then select **Notify Contacts**.
   ![Notify Contacts action in the Fours Console](images/aws-manage-offers-6.webp)

4. If the person you need to notify isn't listed yet, add them first using **Add Existing Contacts** or **Create New Contact**.
   ![Add a contact to notify](images/aws-manage-offers-7.png)

5. Click **Notify** next to a specific contact, or click **Notify All Contacts** to send to everyone on the list at once.
   ![Notify a contact or all contacts](images/aws-manage-offers-8.png)

6. Check the **Notification Events** section at the bottom.
   ![Notification Events section](images/aws-manage-offers-9.png)

   - It lists every Notify Contacts request and the contacts it was addressed to, including requests your email settings then stopped from sending.
   - Contacts notified together share one email, so an open shows against the first contact listed.
   - Emails Fours sends automatically, such as the ready-to-accept email, aren't listed here.

#### When to use Notify Contacts

- To remind a buyer that a private offer is pending acceptance.
- To alert internal stakeholders that an offer has been created, extended, or canceled.
- To follow up during negotiations or renewal discussions.

## Download EULA

The **EULA** action downloads a PDF copy of the End User License Agreement (EULA) attached to a private offer. Depending on the offer setup, Fours downloads either the custom EULA (the exact file uploaded for that offer) or the standard marketplace contract (the default agreement provided by the marketplace).

The **EULA** action appears only when Fours has a EULA recorded for the offer. An offer with none shows no **EULA** action — for example, a Google Cloud Professional Services offer that carries only a statement of work.

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the relevant offer.
3. Click **More actions**, then select **EULA**. This opens the EULA in a new browser tab.
   ![EULA action in the More actions menu of an offer in the Fours Console](images/aws-manage-offers-10.png)

4. Click the **Download** icon on the page.

Fours looks up the document each time you click **EULA**. If it no longer has a working copy of an AWS offer's document, it tries to recover one first — from AWS Marketplace or, for a CPPO, from the resale authorization the CPPO is linked to.

- If your browser blocks the new tab, the console shows *Allow popups, then try downloading the EULA again.* Allow pop-ups for the Fours Console and click **EULA** again.
- If the document can't be retrieved, the new tab closes and the console shows the reason Fours returned, or *Unable to download EULA. Please try again.* when there is no reason to show.

**Google Cloud offers.** This applies when the GCP integration's **Enable PrivateOffer API** setting is on, so that Fours syncs offers through Google's API — including offers created in Producer Portal.

- **What Fours records:** the documents attached to the offer there — its EULA (the standard one or a custom PDF) and, for a Professional Services offer, its statement of work.
- **Recorded once:** a document you later replace in Producer Portal isn't picked up.
- **Older offers:** the regular sync reads only offers Google changed in the last 7 days, so an older offer gets its documents on the next full import — see [About Enable PrivateOffer API](/gcp-marketplace/integration/#about-enable-privateoffer-api).
- **After that:** **EULA** downloads the document, and an offer you clone or amend in Fours carries the documents over.

### When you might need it

- To review the terms included in the offer.
- To share the EULA with the buyer outside of AWS.
- To keep a copy for internal record-keeping or legal review.

## Export the offer's terms as a PDF

**Export PDF** turns an offer's current terms into a PDF you can pass to the people who review the deal on the buyer's side but have no marketplace account, such as a procurement or legal team. It is offered only while the offer is `PENDING_ACCEPTANCE`, the stage when the buyer still has to review it.

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the offer.
3. Click **More actions**, then select **Export PDF**. The PDF opens in a new browser tab.

The PDF summarizes the offer as Fours holds it when you click:

- A header with your organization's name, the offer's name and status, its marketplace, offer type and product, and its Offer ID.
- **Buyer**, **Terms**, and **Payment terms**.
- **{Marketplace} details**: the settings particular to that marketplace, such as an AWS offer's channel partner, net payment term, and renewal settings.
- **Commits**, **Usage pricing**, **Billable metrics**, and **Payment schedule**, where the offer has them.

A footer gives the time it was generated and says the summary is not the agreement itself. The PDF leaves out the EULA — download that with [**EULA**](#download-eula) — the refund policy, your seller notes, and the offer's contacts. A Google Cloud offer's public note, which the buyer sees anyway, is included. The **Buyer** section shows the buyer details the offer carries, so read it before you send the file on.

- The new tab opens a link that stops working after an hour, so share the downloaded file rather than the link. Exporting an unchanged offer again within a few minutes returns the same PDF; after you change the offer, the next export reflects the change.
- If your browser blocks the new tab, the console shows *Allow popups, then try exporting the PDF again.* Allow pop-ups for the Fours Console and click **Export PDF** again.
- If the PDF can't be created, the new tab closes and the console asks you to try again in a minute, and to contact support if it keeps failing.

## Review an offer's history

The **Offer History** panel lists the events Fours has recorded about an offer, newest first — up to the latest 1,000.

1. Go to the [**Offers**](https://console.suger.io/offer) page in Fours Console.
2. Open the offer.
3. Click **More actions**, then select **History**.

Each entry shows when it happened and what happened, followed — where Fours recorded them — by:

- **By:** — who made the change. It is left off an offer acceptance, because the buyer who accepted isn't a member of your organization.
- **Source:** — where the change came from: **User**, **Salesforce**, **HubSpot**, **API client**, **Fours AI**, or **Fours backend**. See what each one means under [Products → History](/console/products/#history). Entries recorded before Fours began tracking the source have no **Source:** line.

When you submit, cancel, or extend an AWS, Azure, Oracle, or Snowflake offer from the console, the status changes Fours records while it carries that out — starting with `Pending_Create` for a new offer — name you on the **By:** line, with **Source: User**. Google Cloud offers work the same way when the GCP integration's **Enable PrivateOffer API** setting is on: creating, cancelling or extending an offer through that API names you on the entries Fours records. Offers that take the browser-driven path instead — reseller authorizations included — still record these changes without a name, and entries recorded before Fours began naming the user are not backfilled. Entries nobody on your team caused, such as the offer expiring, show **Source: Fours backend** and no **By:** line. For an AWS example, see [See who made each change](/aws-marketplace/create-private-offer/#see-who-made-each-change).

A failed AWS change also carries the **Why AWS rejected this** panel described under [Extend the expiry date of an offer](#extend-the-expiry-date-of-an-offer).

<a id="bulk-link-offers-to-salesforce-records"></a>

## Bulk link offers to Salesforce or HubSpot

**Bulk link** connects many private offers to records in your CRM in one pass: Salesforce records, or HubSpot deals. Pick a record for each offer in the dialog, or upload a CSV that gives one per offer. It is a one-time import, separate from the [Custom Backfill Line](/settings/private-offer-mapping/#step-4-link-offers-back-to-the-record-they-came-from-salesforce-optional) setting, which links offers created in the Salesforce app to the record they came from.

| CRM | Each row links an offer to | Where the link is written |
| --- | --- | --- |
| Salesforce | A record of the object that a lookup on the Salesforce Offer object (`Suger__Offer__c`) points at, such as an Opportunity. You pick the lookup. | Into that lookup on the offer's Salesforce Offer record, right away or on the scheduled sync. |
| HubSpot | A deal. | On the offer in Fours. Nothing is written to HubSpot; the offer appears in the **Offers** tab of the Fours app card on that deal. |

```d2
shape: sequence_diagram
you: You
fours: Fours
sf: Salesforce
crm: "The CRM you chose\n(Salesforce or HubSpot)"
you -> fours: "Open Bulk link, choose Salesforce or HubSpot"
fours -> sf: "Salesforce only: find the Offer records whose lookup is empty"
fours -> you: "The offers not linked yet, to pick for or to download as a CSV" { style.stroke-dash: 4 }
you -> fours: "A record for each offer, then Preview changes"
preview: "Preview" {
  fours -> crm: "Check every record or deal ID"
}
fours -> you: "An outcome for every row, nothing written yet" { style.stroke-dash: 4 }
you -> fours: "Click Link N offers"
fours -> fours: "Check the rows again, store the links on the offers"
sync: "Salesforce only" {
  fours -> sf: "Write each link to its Offer record, right away or on the scheduled sync"
}
```

### Before you start

- **A verified CRM integration.** **Bulk link** appears in the **More actions** menu of the **Offer** section only when your organization's Salesforce or HubSpot integration is connected and verified. With both verified, the dialog opens on Salesforce. See [Salesforce](/integrations/salesforce/) and [HubSpot](/integrations/hubspot/).
- **The `offer.edit` permission.** The Admin and Editor roles include it, and a custom role can grant it — see [Account](/get-started/account/). The menu item shows whatever your role. Without the permission, **Preview changes** is refused with *You don't have the required permission to call this API*.
- **Salesforce: check what reacts to Offer record changes.** Linking changes each offer's Salesforce Offer record. That can trigger Salesforce flows or Fours workflows that react to it, such as email notifications, so confirm none depend on it before you run it.

### Step 1: Open Bulk link and choose the CRM

1. On the **Offers** page, stay in the **Offer** section and click **More actions**, at the right of the section's title (it shrinks to a **⋯** button when the row runs out of room), then **Bulk link**. The dialog opens on its first step, **Choose**, and its title names the CRM: **Bulk link offers to Salesforce** or **Bulk link offers to HubSpot**.
2. If both CRMs are verified, pick **Salesforce** or **HubSpot** in the switch at the top of the dialog. Everything below the switch belongs to that CRM, so switching starts the dialog over. The switch is locked once you preview; go back to **Choose** to change it.
3. **Salesforce only:** under **Backfill into lookup**, pick the lookup on `Suger__Offer__c` that the record IDs belong in. That one choice decides which offers are listed, which Salesforce object every ID is checked against, and where each link is written.
   - `Suger__Opportunity__c` is selected by default.
   - Only lookup fields are listed.
   - `Suger__Buyer__c` and `Suger__Product__c` can't be picked, because they point at Fours records rather than CRM records.
   - `Suger__Created_By__c` can't be picked, because it is rewritten on every sync.
   - You also can't pick a lookup that the Salesforce user Fours connects as isn't allowed to edit.
   - `Suger__Account__c` can be picked, but the Fours Salesforce app derives it from the Opportunity and may overwrite what you write.
   - Just created a lookup in Salesforce? Click **Refresh schema** to reload the list.

:::info
Linking `Suger__Opportunity__c` does two more things. It sets each offer's Account in Salesforce to that Opportunity's Account: an account linked directly is replaced, and the Account is cleared when the Opportunity has none. It also carries the Opportunity to the offer's entitlements. A different lookup that points at Opportunity does neither.
:::

### Step 2: Pick a record for each offer, or upload a CSV

Two tabs set how you say which record each offer links to: **Pick offers**, where the dialog opens, and **Upload CSV**. The picker and the downloaded template list the offers that aren't linked yet:

- **Salesforce:** offers whose chosen lookup is still empty in Salesforce.
- **HubSpot:** private offers not linked to a HubSpot deal yet.

An uploaded CSV can also name offers that are already linked. A row that points at the record the offer is already linked to changes nothing; a row that points at a different record is skipped unless you turn on **Overwrite existing linkage** in the preview.

Public and free-trial offers are never listed, because they belong to no one customer. To narrow the offers, use the filter row under the tabs: the same **Cloud Partner**, **Type**, **Status**, and **Filters** controls as the **Offer** section.

#### Pick offers in the dialog

1. Set **Load** to how many offers to list at a time: 50, 100, or 200. The list loads again whenever you change the CRM, the lookup, the filter, or **Load**, and the reload button beside the counts reads it again on demand. When more unlinked offers remain than the list shows, the counts say so: raise **Load**, narrow the filter, or upload a CSV instead.
2. Click **Pick CRM record** on an offer's row. In **Pick a record for** *offer name*, type a name or paste a record ID:
   - **HubSpot:** a deal name, or a deal ID.
   - **Salesforce:** the name of a record of the object the lookup points at, or a 15- or 18-character record ID.

   The search runs a second after you stop typing, or when you click **Search**. Click a match to pick it.
3. Repeat for each offer you want to link. **Change** replaces a pick, and **×** clears it.

Your picks survive a trip to the preview and back. Changing the CRM, the lookup, the filter, or **Load**, or reloading the list, clears them.

#### Upload a CSV

1. Click **Download template**. Fours downloads a CSV of every unlinked offer; for Salesforce, it reads Salesforce to find them. If more than 10,000 offers are unlinked, the template holds the first 10,000 — import those, then download it again.
2. Fill in `crmRecordId` for each offer you want to link and save the file as CSV, keeping the `sugerOfferId` and `crmRecordId` columns. A file can hold up to 10,000 rows — split a larger one.
3. Drop the file on the dialog, or click **Choose file…**.

The template has five columns. You fill in only `crmRecordId`:

| Column | Filled by | What it holds |
| --- | --- | --- |
| `offerName` | Template | The offer's name, to help you find it. For reference only; the upload ignores it. |
| `marketplaceOfferId` | Template | The offer's ID in the cloud marketplace. For reference only; the upload ignores it. |
| `marketplace` | Template | The cloud marketplace the offer is on, such as AWS. For reference only; the upload ignores it. |
| `sugerOfferId` | Template | The Fours offer ID — the column that decides which offer a row links. Don't edit it. |
| `crmRecordId` | You | **Salesforce:** the record ID to link, 15 or 18 characters, from the object the lookup points at. **HubSpot:** the deal ID, the number in the deal's URL. Leave it blank to skip the offer. |

A file made with the earlier template, which also had a `crmType` column, still uploads; a row whose `crmType` names the other CRM is reported as an error.

#### Preview the links

1. **Salesforce only:** under **Options**, decide on **Backfill to CRM right away**. It is on by default: each linked offer is written to its Salesforce Offer record as soon as the import finishes. Turn it off to save the links in Fours only; they then wait for the scheduled sync, which carries only recently created offers.
2. Click **Preview changes**. The preview checks every row against Fours and your CRM and writes nothing.

### Step 3: Review the preview

The preview gives each row one of six outcomes. The table lists rows that will write first, then errors, then rows that change nothing. It shows the first 200 rows; the tiles and the error report cover every row. Each row names the record it points at — the Salesforce record's name or the HubSpot deal name, linked to the record in your CRM — above the ID from your picks or your file.

| Outcome | What it means |
| --- | --- |
| **Will link** | The row will link the offer to the record. |
| **Will overwrite** | The offer is linked to a different record, and **Overwrite existing linkage** is on. The row replaces that link. |
| **Already linked** | The offer is already linked to this record — for Salesforce, the lookup already holds it. The row is skipped. |
| **Skipped · has a different link** | The offer is already linked to a different record. It keeps that link. |
| **Skipped · blank** | The row has no record ID. |
| **Error** | The row can't be linked. The **Detail** column says why and how to fix it. |

Four tiles above the table count the rows:

- **Will link** and **Will overwrite** count the rows with those outcomes.
- **Skipped** counts the Already linked, Skipped · has a different link, and Skipped · blank rows together.
- **Errors** counts the rows that can't be linked.

Below the tiles:

- **Overwrite existing linkage** appears when some rows are skipped for having a different link. Turn it on to re-link those offers to the records you chose, and the preview runs again.
- **Download error report** saves a CSV with one line per error row: the row number, `sugerOfferId`, `crmRecordId`, the error, and how to fix it.
- **Salesforce:** record IDs are checked against Salesforce and stored in the 18-character form, so a 15-character ID copied from a spreadsheet matches the 18-character form of the same ID.
- **HubSpot:** each deal ID is checked against HubSpot and matched exactly. Nothing is written to HubSpot.

An **Error** row has one of these reasons:

| Reason | How to fix it |
| --- | --- |
| The `sugerOfferId` column is empty. | Use the `sugerOfferId` values from the template. |
| The offer appears on another row too. | Keep one row per offer. |
| Salesforce: the value isn't a Salesforce record ID. | Use the 15- or 18-character ID, not the record name or number. |
| Salesforce: the ID belongs to a record of a different object than the lookup points at. | Copy the ID from a record of the right object. |
| HubSpot: the value isn't a HubSpot deal ID. | Use the number in the deal's URL in HubSpot, not the deal name. |
| HubSpot: the spreadsheet saved the deal ID in scientific notation, such as `6.37288E+11`. | Format the `crmRecordId` column as Text, paste the deal IDs again, and save the CSV. |
| The row's `crmType` names the other CRM. | Change it to the CRM you chose, or upload the file with that CRM selected. |
| No offer with that ID exists in your organization. | Use the `sugerOfferId` values from the template, unedited. |
| The offer is a public offer. | Remove the row. Only private offers can be linked to one customer's record. |
| The record isn't found in Salesforce, or the deal isn't found in HubSpot. | Confirm the ID in your CRM. Deleted or merged records can't be linked. |

Rows with errors are left out when you link. Fix them and upload the file again, or link the valid rows now.

### Step 4: Link the offers

1. Click **Link N offers**, where N counts the **Will link** and **Will overwrite** rows. The button is disabled when no row would write.
2. Fours checks every row against your CRM again and starts the job. The dialog moves to **Commit** and shows **Linked**, **Skipped**, and **Failed** tiles, plus a result for each row being linked. A Salesforce job with **Backfill to CRM right away** on adds a **Salesforce sync queued** tile. A HubSpot link takes effect when the job finishes: the offer then appears in the **Offers** tab of the Fours app card on its deal — see [Manage an offer after it is created](/hubspot-app/hubspot-app-offer/#manage-an-offer-after-it-is-created).
3. Click **Done**. The job carries on if you close the dialog.

- **One job at a time.** Your organization can run one bulk link job at a time. Starting another while one is running is refused until the first finishes.
- **A job that stops part-way.** The dialog says how many rows weren't processed. Run the import again to finish them.

### Follow the job in Logs

Each bulk link job appears in the [**Logs** section](#logs-section). Set **Workflow Type** to **Bulk link** and leave **Provider** at **All**. A bulk link job isn't tied to one cloud, so it doesn't show under a single provider.

## Create an AWS Marketplace offer set

An **offer set** groups multiple AWS private offers (up to 10) into a single bundle that the buyer accepts in one checkout flow. Use it when you're selling a multi-product solution in AWS Marketplace.

### Prerequisites

Make sure the following are in place before creating an offer set.

**AWS Marketplace**

- **Active AWS Marketplace seller account** with a published seller profile. See [Register and create your seller profile](https://docs.aws.amazon.com/marketplace/latest/userguide/create-public-profile.html).
- **At least one active public listing.** You must have a published product before you can create private offers to include in an offer set.

**Fours**

- **Admin** access to the Fours Console. If you don't have access yet, ask your company admin to invite you to the organization. See [Manage Users and Roles](/get-started/account/).

**Offer alignment**

AWS enforces the following rules across all offers in a set. Mismatches block you from publishing. Before you start building, confirm that every offer you plan to include will share:

- The same currency
- The same buyer AWS account ID
- The same expiration date

### Supported offer types

Only the following offer types can be included in an offer set:

| Offer type                             | Supported in offer sets? | Description                                                                          |
| -------------------------------------- | :----------------------: | ----------------------------------------------------------------------------------- |
| Marketplace Private Offer (MPPO)       |          ✅ Yes          | Direct private offers created by the product owner (ISV) for the buyer              |
| Channel Partner Private Offer (CPPO)   |          ✅ Yes          | Private offers extended by an authorized channel partner using a resale authorization |
| Standard Private Offer features        |          ✅ Yes          | Includes flexible payment schedules and local currency support                       |
| Public & Trial offers                  |          ❌ No           | Standard public listings and promotional free trials can't be bundled                |
| Replacement offers (amendments)        |          ❌ No           | Agreement-based offers meant to renew or upsell an existing active entitlement       |

### Step 1: Set up offer set details (container)

Start by filling out the container details in order:

1. Go to the Fours Console, then **Offer**.
2. Select **Offer Set** in the section rail on the left, then click **+ New Offer Set**.
3. Enter the **Offer set name**. Use something that helps you and the buyer identify the deal easily.
4. Add a **Customer note** — context for the buyer or internal team.
5. Select or enter the **Buyer(s)** AWS account ID.
6. Set the **Expiry Date** for when the buyer can accept the offer set. Every individual offer you add later must share this exact same expiration date.
7. (Optional) Use the **Solution associate** field if you already have a related AWS solution listing and want to connect them. A solution is a Marketplace page that explains how multiple products work together; linking it gives buyers additional context and documentation during the purchase flow.

### Step 2: Add private offers to the offer set

Attach the actual private offers inside the offer set container. You must add at least **2 offers** and up to **10 offers** per offer set.

:::warning
AWS's own documentation still sets an offer set at 2 to 7 offers: its Catalog API answers `TOO_MANY_OFFERS` (*Associate up to 7 offers to the offer set*) for more, and AWS has not published a higher limit ([Work with offer sets](https://docs.aws.amazon.com/marketplace/latest/developerguide/work-with-offer-sets.html)). Fours lets you add up to 10. Confirm with your AWS contact before you release a set of more than 7.
:::

1. Click **+ Create private offer** to add your first offer.
2. Choose the **Product** you want to include. Each offer in the set must target a different product ID — you can't include the same product twice in one offer set.
3. Fill in the **Basic information** section.
4. Set up the **Offer terms**.
5. Add the **Pricing information**.
6. Attach the **End User License Agreement (EULA)** for this product.
7. Once everything is correct, click **Add**.

To drop the offer you're building instead, click **Cancel** at the bottom of the form, and confirm if the console asks. You return to the offer set: the offer you were building is discarded, and the set's details and the offers you've already added are kept.

Fields marked with an asterisk (*) are required. **Add** stays greyed out until every required field is filled in and every value is valid. It has no tooltip listing what's missing, so check the steps beside the form: a finished step shows a green check mark, and an unfinished one still shows its number.

Repeat until you have added all required offers. Once the set holds 10 offers, **+ Create private offer** is disabled and the page shows *Maximum 10 offers allowed per offer set*.

### Step 3: Review and publish the offer set

1. Check everything you configured. Make sure:
   - All offers are included correctly.
   - Every offer targets the same buyer AWS account.
   - All offers use the same currency.
   - All offers share the same expiration date.
   - Each offer has a different product ID.
   - Pricing, terms, and EULAs are correct.
2. Click **Create offer set** to publish.

### Step 4: What happens after you publish

- **Buyer notification (automatic).** After you click **Create offer set**, AWS Marketplace automatically sends the buyer a single email — this replaces individual private offer emails. The email includes the Offer Set ID, expiry date, the list of included products, and one link to review and accept the full offer set.
- **Separate agreements (after acceptance).** Once the buyer accepts the offer set, each product becomes its own separate agreement, so you can manage renewals, changes, or cancellations per product independently.
- **Invoicing and payments.** Even though the buyer completes one checkout flow, billing is split per product. The buyer receives separate invoices for each product based on its own terms and agreement.

## Track offer statuses

Status labels in Fours may differ slightly from what you see in the native AWS, Azure, or GCP consoles. Where this applies, the difference is called out below.

### Fours Console / CRM status reference

Use the table below to interpret the offer statuses shown in the Fours Console or your CRM.

| Status | Meaning |
| --- | --- |
| `Pending_Create` | The offer is being submitted to AWS. |
| `Create_Success` | AWS has accepted the offer, but it hasn't been made visible to the buyer yet. |
| `Pending_Acceptance` | The offer has been successfully pushed to AWS and is waiting for the buyer to accept it. |
| `Accepted` | The buyer has accepted the offer. An entitlement is created automatically. |
| `Pending_Cancel` | The offer cancellation request has been submitted but not yet confirmed by AWS. |
| `Canceled` | The offer has been successfully canceled. It is no longer visible to the buyer. |
| `Expired` | The buyer did not accept the offer before the expiry date. The offer is no longer valid. |
| `Active` | The offer originated from a public purchase via the Marketplace. |

Three statuses mean the offer never reached the marketplace, and all three stay editable — open the offer,
correct it, and resubmit rather than starting again:

| Status | Meaning |
| --- | --- |
| `Draft` | Saved in Fours and never submitted. |
| `Create_Failed` | Fours couldn't create the offer — for example, the marketplace refused it, or, for a Google Cloud offer, Fours' own pre-flight checks refused it before anything was sent. |
| `Invalid` | Fours' own pre-flight checks refused it, so nothing was sent to the marketplace. Fours no longer sets this status, so you'll only see it on older offers; a Google Cloud offer that the pre-flight checks refuse now lands in `Create_Failed`. |

The offer page explains the failure in a **Create Offer Failed** alert. It shows the latest reason — in plain language where Fours can rewrite the marketplace's error, word for word otherwise — and, when the offer has failed before, a **Show *n* earlier attempts** link that lists the previous reasons.

### AWS Marketplace offer statuses

AWS private offers follow a straightforward lifecycle: `Draft` → `Active` → `Accepted`. If the buyer doesn't act in time, the offer moves to `Expired` instead.

| Status           | What it means                                                                                                              | What to do                                                                                                                              |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `Draft`          | The offer is incomplete.                                                                                                   | Finish filling in all required fields, then publish to send it to the buyer.                                                           |
| `Active`         | The offer has been published and is available to the buyer.                                                               | Share the offer link with the buyer if you haven't already. See [Share the offer with your buyer](#share-the-offer-with-your-buyer).   |
| `Accepted`       | The buyer subscribed and an agreement (entitlement) has been created.                                                     | Go to the [Entitlement](https://console.suger.io/entitlement) menu in the Fours Console to track the deal going forward.               |
| `Expired`        | The offer reached its deadline before the buyer accepted.                                                                 | [Extend the expiration date](#extend-the-expiry-date-of-an-offer) or [create a new offer](/aws-marketplace/create-private-offer/).     |
| `Pending Cancel` | The buyer requested to cancel their subscription. This status applies to public offers and usually lasts about one hour. | No immediate action needed. Wait for the status to move to `Cancelled`.                                                                |
| `Cancelled`      | The agreement was cancelled, either by the buyer or the seller.                                                           | If the cancellation was unintended, contact AWS support. To continue the deal, [create a new private offer](/aws-marketplace/create-private-offer/). |

_Source:_ [_AWS Marketplace Seller Guide – Creating and managing private offers_](https://docs.aws.amazon.com/marketplace/latest/userguide/creating-private-offer.html)

**Key things to know about AWS offers**

- **Private offers renew automatically only if they carry renewal terms.** A Contract, Professional Services, or Container offer with committed pricing can include [pre-authorized auto-renewal](/aws-marketplace/pre-authorized-auto-renewal/) terms, which the buyer accepts along with the offer; resale (CPPO) and agreement-based offers can't. Without renewal terms, create a new private offer to renew when the contract ends.
- `Pending Cancel` **and** `Cancelled` **are Fours-specific events.** You won't see these labels in the AWS console. In AWS, a seller-initiated cancellation changes the offer's expiration date so it appears as `Expired`.
- **Buyers receive both a** `PENDING_CANCEL` **and a** `CANCEL` **webhook event** when they unsubscribe, typically about one hour apart. This is normal behavior.

### Azure Marketplace offer statuses

Azure requires two separate actions from the buyer: **accepting the offer terms** and then **completing the purchase**. This means a deal can show as `Accepted` while the subscription is still pending.

:::warning
Once a buyer accepts an Azure offer, you can no longer withdraw or edit it. If changes are needed, you'll need to cancel the offer and create a new one.
:::

| Status               | What it means                                                        | What to do                                                                                                                          |
| -------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `Draft`              | You have started creating the offer but haven't submitted it yet.   | Complete all required fields and submit.                                                                                          |
| `In Progress`        | The offer is being published. This typically takes up to 15 minutes. | Wait for the status to update before contacting the buyer.                                                                        |
| `Pending Acceptance` | The offer is live and waiting for the buyer to accept.              | Make sure you have shared the offer link with the buyer. See [Share the offer with your buyer](#share-the-offer-with-your-buyer). |
| `Accepted`           | The buyer accepted the offer terms.                                 | Check the sub-status (below) to see if the purchase step is still pending.                                                        |
| `Expired`            | The offer deadline passed before the buyer accepted.                | Withdraw the offer, make any needed edits, and resubmit.                                                                          |
| `Ended`              | The offer passed its end date.                                      | Create a new offer if you need to continue the deal.                                                                             |
| `Withdrawn`          | You recalled the offer before the buyer accepted it.                | Edit and resubmit when ready.                                                                                                     |

_Source:_ [_Microsoft Learn – Manage ISV-to-customer private offers_](https://learn.microsoft.com/en-us/partner-center/marketplace-offers/manage-isv-customer-private-offers)

**Purchase sub-statuses (after acceptance)**

After the buyer accepts, these sub-statuses track whether they have completed the purchase step.

| Status                   | What it means                                                                    | What to do                                                                                                          |
| ------------------------ | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| `Pending Purchase`       | The buyer accepted the terms but hasn't completed the purchase yet.              | It can take 15–60 minutes for the Purchase button to become available. Let the buyer know to check back.           |
| `Subscribed`             | The buyer subscribed and you activated the SaaS subscription.                    | No action needed. The deal is active.                                                                              |
| `Purchased`              | For VM software reservations, the buyer completed the purchase.                  | No action needed.                                                                                                  |
| `Cancelled`              | The subscription was cancelled due to a buyer request or non-payment.           | Reach out to the buyer to resolve, or create a new offer if needed.                                                |
| `Expired` (subscription) | The subscription has expired.                                                    | Create a new offer to renew.                                                                                       |

**For multiparty (channel partner) offers**

| Status                   | What it means                                                             | What to do                                                                                    |
| ------------------------ | ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| `Pending Partner Action` | The offer is ready for the channel partner to review and send to the buyer. | Follow up with the channel partner to confirm they have received and reviewed the offer.     |

_Source:_ [_Microsoft Learn – Multiparty private offers for ISVs_](https://learn.microsoft.com/en-us/partner-center/marketplace-offers/multiparty-private-offers-for-isvs)

### GCP Marketplace offer statuses

GCP has the most granular status lifecycle of the three marketplaces. After a buyer accepts an offer, you (the seller) may need to manually approve it before it activates. GCP also distinguishes between an offer expiring before the buyer acts and an order expiring after the contract ends.

**Offer statuses (Producer Portal)**

| Status                     | What it means                                                                      | What to do                                                                                                                                     |
| -------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `Draft`                    | The offer is created but not finalized.                                            | Continue editing, then submit.                                                                                                               |
| `Pending Google Approval`  | Google is reviewing the offer before it can be sent to the buyer.                  | Wait for approval. This is a Google-controlled step.                                                                                        |
| `Created`                  | The offer URL is ready.                                                            | Send the offer link to the buyer. See [Share the offer with your buyer](#share-the-offer-with-your-buyer).                                   |
| `Pending Acceptance`       | The offer has been sent but the buyer hasn't accepted yet.                         | Follow up with the buyer if needed.                                                                                                          |
| `Account Pending Approval` | The buyer's account needs to be approved before the offer can proceed.            | Review and approve the account in your GCP settings.                                                                                        |
| `Account Rejected`         | The buyer's account was rejected.                                                  | Contact the buyer if the rejection was unintended.                                                                                          |
| `Needs Your Approval`      | The buyer accepted and is waiting for you to confirm.                              | Go to the [GCP Producer Portal](https://console.cloud.google.com/producer-portal/private-offers) and [approve the offer](https://docs.cloud.google.com/marketplace/docs/partners/offers/manage-entitlements). |
| `Approving`                | Your approval is being processed. This takes a few minutes.                       | Wait for the status to update.                                                                                                              |
| `Approval Failed`          | An error occurred during approval.                                                 | Wait for the status to reset, then re-approve.                                                                                              |
| `Activating`               | The offer is nearly ready. It will activate at its scheduled start time.          | No action needed.                                                                                                                           |
| `Scheduled`                | A replacement offer was approved and will activate on the contract start date.    | No action needed until the start date.                                                                                                      |
| `Active`                   | The buyer is actively using the offer.                                             | No action needed.                                                                                                                           |
| `Offer Expired`            | The buyer did not accept before the deadline.                                      | Create a new offer if you want to continue the deal.                                                                                        |
| `Order Expired`            | The contract end date has passed.                                                  | Create a renewal offer if needed.                                                                                                           |
| `Cancelled`                | You withdrew the offer before the buyer accepted.                                  | Create a new offer if the deal should continue.                                                                                            |
| `Rejected`                 | You declined an offer the buyer had already accepted.                              | Contact the buyer and create a new offer if the deal should proceed.                                                                        |
| `Unavailable`              | This is a legacy offer that is no longer supported.                                | Migrate to a current offer type if needed.                                                                                                  |

**Reseller offer statuses (Partner Sales Console)**

If an offer is managed through a GCP reseller, you'll see this simplified set of statuses instead.

| Status      | What it means                                                       | What to do                                                          |
| ----------- | ------------------------------------------------------------------- | ------------------------------------------------------------------ |
| `Published` | The reseller published the offer; the buyer hasn't accepted yet.    | Follow up with the buyer or reseller if there is no response.       |
| `Accepted`  | The buyer accepted but the contract hasn't started yet.             | Wait for the contract start date.                                   |
| `Active`    | The contract is in effect.                                          | No action needed.                                                   |
| `Ended`     | The contract passed its end date.                                   | Create a renewal offer if needed.                                   |
| `Expired`   | The buyer didn't accept before the deadline.                        | Work with the reseller to reissue the offer.                        |
| `Canceled`  | The reseller withdrew the offer.                                    | Coordinate with the reseller to reissue if needed.                  |

**Key things to know about GCP offers**

- **SaaS offers require manual approval by default** unless you have [enabled automatic offer approval](https://docs.cloud.google.com/marketplace/docs/partners/offers/automatic-approval). Check your GCP settings to avoid deal delays.
- **Replacement offers** (for renewals or upsells) follow the same status lifecycle but can't change the product, plan, or pricing model of the original offer.
- **As of April 2025,** GCP supports multiple active flat-fee offers for the same buyer.

### Cross-cloud status comparison

Use this table to quickly compare where a deal stands across all three marketplaces.

| Lifecycle stage         | AWS                       | Azure                     | GCP                             |
| ----------------------- | ------------------------- | ------------------------- | ------------------------------- |
| Being created           | `Draft`                   | `Draft`                   | `Draft`                         |
| Publishing              | — (immediate)             | `In Progress`             | `Pending Google Approval`       |
| Awaiting buyer          | `Active`                  | `Pending Acceptance`      | `Created` / `Pending Acceptance` |
| Buyer agreed            | `Accepted`                | `Accepted`                | `Needs Your Approval`           |
| Fully active            | `Agreement active`        | `Subscribed` / `Purchased` | `Active`                        |
| Not accepted in time    | `Expired`                 | `Expired`                 | `Offer Expired`                 |
| Contract ended          | `Agreement ended`         | `Ended`                   | `Order Expired`                 |
| Seller withdrew         | `Cancelled` (pre-accept)  | `Withdrawn`               | `Cancelled`                     |
