> ## Documentation Index
> Fetch the complete documentation index at: https://help.lobyco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create or update offers in bulk

> Create many offers at once, or change existing ones, by importing a file on the Offers import screen, and download a list of your offers there.

Admin users who have access to offers can create many offers at once, or change existing ones, from one file instead of one offer form at a time. You do it on the **Offers import** screen of Lobyco Nexus, under **Toolbox** in the menu.

> [!WARNING]
>
> An import changes your offers as soon as it runs, live offers included, and Nexus has no undo. A row whose `OfferId` already exists replaces that offer.

## Prepare the file

Save your offers as a CSV file, with one row for each offer and the column names in the first row. New offers and offers you want to change can go in the same file.

* Separate the values with commas, and use a dot for decimals.
* Write dates as yyyy-mm-dd, such as `2026-11-02`.
* Write `true` or `false` for a setting that is on or off.
* To put more than one ID in a cell, such as several stores, separate them with `;`.

The import reads each date as midnight UTC. So an offer starts at the beginning of its start date and stops at the beginning of its end date. To let an offer run all of 8 November, write `2026-11-09` as its end date. Nexus shows these times in your own time zone, so midnight UTC can show as 01:00 or 02:00.

Each column sets a field of the offer form. **[Create an offer](/business-documentation/activities/offers/create-an-offer)** explains what each field does. To find the IDs, type names and settings of offers you already have, [download a list of your offers](#download-a-list-of-your-offers). The import dialog also lists every column it takes, under **See expected columns in file**.

### Details

| Column | Required | What it sets |
| - | - | - |
| `OfferId` | Yes | The offer's ID. A new ID creates an offer. The ID of an existing offer replaces that offer. You can't reuse the ID of an offer that was deleted. An offer shows its ID as **id** at the top of its **Details** section. |
| `OfferName` | Yes | **Name**. |
| `OfferType` | Yes | **Type**, written the way the system names it. [Offer type values](#offer-type-values) lists them. An exported file shows it in the `CampaignType` column. |
| `StartDate` and `EndDate` | Yes | **Start date** and **End date**. The end date can't be before the start date. |
| `Published` | Yes | Whether the offer is published. `true` publishes it. `false` keeps it as a draft. For a live offer, `false` stops it and puts it back to draft. |
| `UnifiedCampaignId` | No | The campaign the offer goes in. When you leave it empty, an existing offer stays in its campaign. |
| `Preactivated` | No | **Pre-activated**. |
| `DisplayPriority` | No | **Display priority**. A new offer gets 5 if you leave it empty. |
| `FundedBy` | No | **Sponsor**. |
| `PreviewVisibleFrom` | No | **Visibility before offer start date**. |
| `IgnoreOnPos` | No | **Ignore offer on POS**. |
| `AudienceId` | No | The audience in **Segmentation**, for types that have one. It has to be a published audience. |

Fill in `UnifiedCampaignId` for every new offer, so you know where it goes. A campaign shows its **ID** at the top of its page. If you don't see it there, select the arrow beside the campaign's name. The import doesn't check the ID, so copy it exactly. An offer with a mistyped ID goes into no campaign.

Without `UnifiedCampaignId`, a new offer goes into a default campaign that Lobyco sets up for your organisation. Some offer types go into no campaign at all. You find an offer that's in no campaign only on the **Overview** tab of the import screen.

### Offer type values

The import takes the offer types Lobyco has switched on for your organisation. They're the types in the **Type** list of the offer form. Write the value as in the first column below. Capital letters don't matter. **[Offer types](/business-documentation/activities/offers/offer-types)** describes each type.

| `OfferType` value | **Type** in Nexus |
| - | - |
| `appCoupon` | App Coupon |
| `segmentedAppCoupon` | Segmented App Offer |
| `memberOffer` | Member Offer |
| `personalOffer` | Personal Offer |
| `globalPersonalOffer` | Personal Offer |
| `preferredStore` | Preferred Store |
| `mixMatch` | Mix\&Match |
| `challenge` | Challenge |
| `game` | Game |
| `gift` | Gift |
| `stickersCampaign` | Stickers Offer |
| `stampCard` | Stamp Card |
| `baseBonus` | Base Bonus |
| `voucher` | Voucher - Standard |
| `triggeredVoucher` | Voucher - Triggered |
| `fuel` | Fuel - Standard |
| `triggeredFuel` | Fuel - Triggered |

`personalOffer` and `globalPersonalOffer` both show as Personal Offer. To see which one your organisation uses, look at the `CampaignType` column of a [downloaded list of your offers](#download-a-list-of-your-offers).

Stamp Card is being phased out, so use `challenge` instead. The types that give a bonus instead of a discount are `baseBonus`, `voucher` and `triggeredVoucher`. Their rows use `BonusPercent` or `BonusAmount` in `Rule1Type`. In `DiscountType`, a bonus row can use `SimpleLine`, `SimpleTotal`, `SimpleQuantity`, `MixAndMatch` or `MixAndMatchTotal`. The import rejects a bonus row with `QuantityStep`, `RewardTotal` or `TotalStep`. The offer form only offers `SimpleLine` and `SimpleTotal` for a bonus. In `ImpactLevel`, a bonus row uses `Total` with `SimpleTotal` and `MixAndMatchTotal`, and `Line` with the other three, the same as a discount row.

### Where the offer is valid

| Column | Required | What it sets |
| - | - | - |
| `ChainIds` | To publish, this or `StoreIds` | **Chain(s)**. |
| `StoreIds` | To publish, this or `ChainIds` | **Store(s)**. Fill in `ChainIds` or `StoreIds`, not both. |
| `CheckoutTypes` | No | **Checkout types**, such as `pos` for POS and `selfcheckout` for Self checkout. Leave it empty for every checkout type. |

Every chain and store ID has to exist in Lobyco, or the row doesn't go in.

### Discount and limits

| Column | Required | What it sets |
| - | - | - |
| `DiscountType` | No | **Discount**. `SimpleLine` is Product Discount, `SimpleTotal` is Basket Discount, `MixAndMatch` is Mix & Match, `MixAndMatchTotal` is Mix & Match Total Value, `SimpleQuantity` is Threshold Discount, `QuantityStep` is Quantity Tier and `TotalStep` is Basket Tier. |
| `ImpactLevel` | Yes | What the discount comes off. `Line` is the products, and `Total` is the basket total. It goes with the discount type. Use `Line` for `SimpleLine`, `MixAndMatch`, `SimpleQuantity` and `QuantityStep`. Use `Total` for `SimpleTotal`, `MixAndMatchTotal` and `TotalStep`. The offer form sets it the same way. A row whose `DiscountType` and `ImpactLevel` don't match doesn't go in. |
| `MaxNumberApplyPerReceipt` | Yes | **Maximum quantity per receipt (UoM)**. |
| `RedemptionLimit` | Yes | **Redemption limit**. `0` means no limit. |
| `MaxDiscountAmount` | No | **Discount amount limit**. `0` means no limit. |
| `TotalCoupons` | No | The most coupons the offer can give out. For a new offer, leave it empty for no limit. |
| `Priority` | No | **Stacking Priority**. A lower number applies first. |
| `AllowOtherDiscountsOnTop` | No | **Allow other offers on top**. |
| `ItemsApplicationType` | No | **Apply on items**. `AllItems`, `NonDiscountedItems` or `DiscountedItems`. |

> [!WARNING]
>
> Put `Priority`, `AllowOtherDiscountsOnTop`, `ItemsApplicationType` and `MaxDiscountAmount` in your file, with a value in every row. An empty cell in any of them stops other rows from going in too, as [Fix the rows that were left out](#fix-the-rows-that-were-left-out) explains.

The import doesn't use the offer form's defaults for these four columns. If you leave a column out, `Priority` becomes 0, which comes before any priority the form lets you pick. `AllowOtherDiscountsOnTop` becomes `false`, so other offers can't apply on top of the offer. `ItemsApplicationType` becomes `AllItems`, and `MaxDiscountAmount` becomes `0`.

When you have no preference, use the values the offer form starts with. **Stacking Priority** is 5. **Allow other offers on top** is on, so write `true`. Write `AllItems` for `ItemsApplicationType`. For `MaxDiscountAmount`, `0` means no limit.

In the offer form, **Stacking Priority** goes from 1 to 10. So the form shows a **Stacking Priority** of 0 as 5, and saving the offer in the form changes it to 5.

### Discount rules

A rule is what the customer buys and what they get, as in the **Buy** and **Get** parts of the **Discount** section. Its columns start with `Rule1`. Discount types with more than one rule or tier, such as Mix & Match, carry on with `Rule2Type`, `Rule2Value`, `Rule2ThresholdType`, `Rule2ThresholdValue` and so on, then `Rule3Type` and the rest of the `Rule3` columns. Number them without gaps, because the import ignores the rules after a missing number.

An offer needs at least one rule before it can be published.

| Column | Required | What it sets |
| - | - | - |
| `Rule1Type` | To publish | **Offer type** under **Get**. `Amount` is Amount off, `Percentage` is Percentage off and `FixedPrice` is Fixed price. `BonusPercent` and `BonusAmount` are for the offer types that give a bonus. |
| `Rule1Value` | To publish | **Offer value**. Write a percentage as a decimal, such as `0.2` for 20%. For `BonusPercent`, write it the same way, such as `0.1` for a 10% bonus. For `BonusAmount`, write the bonus amount itself. |
| `Rule1ThresholdType` | To publish | **Purchase type**. `Quantity` or `Amount`. |
| `Rule1ThresholdValue` | To publish | **Purchase value**. Some discount types call it **Threshold value** or **Quantity**. |
| `Rule1IncludedProducts` | No | **Product IDs**. |
| `Rule1ExcludedProducts` | No | **Excluded Product IDs**. |
| `Rule1IncludedCategories` | No | **Category IDs**. |
| `Rule1ExcludedCategories` | No | **Excluded Category IDs**. |

### Prices and content

| Column | Required | What it sets |
| - | - | - |
| `NormalPrice` and `NormalPricePerUnit` | No | **Prices**, the product's normal price and its normal price per unit. |
| `Currency` | To publish an offer with a price | The currency of the prices, as a three-letter code such as `EUR`. |
| `Title` | No | **Offer title**. |
| `Description` | No | **Description**. |
| `Brand` | No | **Product brand**. |
| `ImageUrl` | No | **Image URL**. |
| `DiscountLabel` | No | **Discount label**. |
| `NormalPriceLabel` | No | **Normal price label**. |
| `ConditionLabel` | No | **Condition label**. |
| `PricePerUnitLabelEnabled` | No | **Enable price per unit label**. |
| `UnitOfMeasure` | No | **Unit of measure**. |
| `ReceiptDisplayText` | No | **Receipt display text**. |

### When you update an offer

An update replaces the offer's settings with what's in its row. So give each row all the offer's settings, not only the ones you're changing. A column you leave out of the file, or a cell you leave empty, works like this:

| In your file | What happens to the offer |
| - | - |
| A required column left out, or empty | The row doesn't go in. |
| A text column left out | The offer keeps that text. |
| An empty cell in a text column | The offer's text is cleared. |
| `ChainIds` and `StoreIds` both left out, or both empty | The offer loses its chains and stores. A live offer has to keep them, so its row doesn't go in. |
| `CheckoutTypes` left out, or empty | The offer applies at every checkout type again. |
| `Priority`, `AllowOtherDiscountsOnTop`, `ItemsApplicationType` or `MaxDiscountAmount` left out | They go back to 0, off, `AllItems` and 0, whatever they were before. |
| Rule columns filled in | They replace all the offer's rules. |
| No rule columns, or empty ones | The offer keeps its rules. |
| Any other column left out, or empty | The offer keeps that setting. |

The text columns are `Title`, `Description`, `Brand`, `ImageUrl`, `DiscountLabel`, `NormalPriceLabel`, `ConditionLabel`, `UnitOfMeasure`, `ReceiptDisplayText`, `Currency` and `FundedBy`.

A [downloaded list of your offers](#download-a-list-of-your-offers) holds most settings, but not these four. To look them up, select the **Overview** tab, open the offer from the list, and read its form.

| Column | Where to find it |
| - | - |
| `ImpactLevel` | The offer form has no field for it. It follows the **Discount** type, as [Discount and limits](#discount-and-limits) explains. The export's `DiscountType` column shows that type. |
| `MaxNumberApplyPerReceipt` | **Maximum quantity per receipt (UoM)**, in the **Discount** section of the form. |
| `Priority` | **Stacking Priority**, in the **Stacking** section of the form. The form shows 5 for an offer whose priority is 0. |
| `AllowOtherDiscountsOnTop` | **Allow other offers on top**, in the **Stacking** section of the form. |

### An example file

The first row creates an offer and publishes it. The second creates an offer and keeps it as a draft. Both go into the same campaign, and both run all of week 45, from 2 to 8 November.

```csv theme={"system"}
OfferId,OfferName,OfferType,StartDate,EndDate,Published,UnifiedCampaignId,StoreIds,DiscountType,ImpactLevel,MaxNumberApplyPerReceipt,RedemptionLimit,Priority,AllowOtherDiscountsOnTop,ItemsApplicationType,MaxDiscountAmount,Rule1Type,Rule1Value,Rule1ThresholdType,Rule1ThresholdValue,Rule1IncludedProducts,Title
2026-w45-coffee,Coffee 20% off week 45,appCoupon,2026-11-02,2026-11-09,true,2026-q4-7c1e9a52-3b8d-4f60-a2e4-9d5b1c8f0a37,101;102,SimpleLine,Line,1,1,5,true,AllItems,0,Percentage,0.2,Quantity,1,5701234000011,20% off coffee
2026-w45-tea,Tea 1.00 off week 45,appCoupon,2026-11-02,2026-11-09,false,2026-q4-7c1e9a52-3b8d-4f60-a2e4-9d5b1c8f0a37,101;102,SimpleLine,Line,1,1,5,true,AllItems,0,Amount,1,Quantity,1,5701234000028,1.00 off tea
```

If you choose **JSONL** when you import, save a .jsonl file instead. Each line is one offer as a JSON object, with the column names as keys. Numbers and `true` or `false` have no quotes. Dates, IDs and a list joined with `;` are text in quotes. The rules stay as flat keys such as `Rule1Type`. This line is the first offer of the example:

```json theme={"system"}
{"OfferId":"2026-w45-coffee","OfferName":"Coffee 20% off week 45","OfferType":"appCoupon","StartDate":"2026-11-02","EndDate":"2026-11-09","Published":true,"UnifiedCampaignId":"2026-q4-7c1e9a52-3b8d-4f60-a2e4-9d5b1c8f0a37","StoreIds":"101;102","DiscountType":"SimpleLine","ImpactLevel":"Line","MaxNumberApplyPerReceipt":1,"RedemptionLimit":1,"Priority":5,"AllowOtherDiscountsOnTop":true,"ItemsApplicationType":"AllItems","MaxDiscountAmount":0,"Rule1Type":"Percentage","Rule1Value":0.2,"Rule1ThresholdType":"Quantity","Rule1ThresholdValue":1,"Rule1IncludedProducts":"5701234000011","Title":"20% off coffee"}
```

## Open the import screen

1. In the menu, open **Toolbox**, then **Offers import**. The **Export/import** screen opens on the **Overview** tab, with a list of your offers.
2. Select the **Import** tab.

You see the **Import Log**, a list of every offer file imported so far. Each row shows the **File name**, **Date**, **File type**, **Status** and who imported it, with a **View** link at the end. Use the filters above the list to find a file, and **Refresh** to reload it. To get a copy of a file, select the download icon beside its name.

![The Import tab of the Offers import screen, headed Export/import, with the Overview and Import tabs and Import new info at the top right. The Import Log panel has Refresh and the filters File name, Date, File type, Status and Imported by. Five rows show files with the file type OffersV2. Four have their file names blurred in this image: two read Verification needed, (0/1) and (1/2), and two read Successful (1/1). The fifth, Personal\_Offer\_Import\_Template…, reads Successful (4/4). Each row shows its date, the initials of who imported it and a View link. Items per page 5 and 1 – 5 of 88 are below the list.](https://mintcdn.com/lobyco-4c9fb3ad/rG971_5ZfS49bcjM/images/administer-60-offers-import-log.png?fit=max\&auto=format\&n=rG971_5ZfS49bcjM\&q=85\&s=1e90c78b3ca074093ba304f329432169)

*The Import Log for offers*

## Import the file

1. Select **Import new info**. The **Import new info** dialog opens.
2. Under **Select which data to import**, choose **OffersV2**. It's the only choice.
3. Under **Select file format**, keep **CSV**, or choose **JSONL**.
4. Under **Add file**, drop your file on the area, or choose **select file** and pick it.
5. Select **Import file**. The **Import and add to existing data** dialog asks you to confirm, and names your file.
6. Select **Import file** again.

**Import file** stays disabled until you have chosen the data, the format and a file. Once you have chosen **OffersV2**, select the arrow beside **See expected columns in file** to list every column the import takes. If you select **Cancel**, Nexus asks whether to leave without importing. Choose **Stay** to go back, or **Leave** to close the dialog.

The dialog says that rows with new IDs are added, and rows with existing IDs replace the existing rows with those IDs. For offers, a new `OfferId` creates an offer, and an existing one replaces that offer.

![The Import new info dialog on the Offers import screen. It says When you import, the rows in the file with new IDs will be added to the existing data. Rows in the file with existing IDs will replace the existing rows with these IDs. Select which data to import, which is required, is set to OffersV2. Under Select file format, which is required, CSV is selected and JSONL is not. Add file, which is required, is an upload area reading Drop file here to upload or select file, with Allowed file type is .csv under it. See expected columns in file is closed. Cancel and a greyed-out Import file are at the bottom.](https://mintcdn.com/lobyco-4c9fb3ad/rG971_5ZfS49bcjM/images/administer-61-offers-import-dialog.png?fit=max\&auto=format\&n=rG971_5ZfS49bcjM\&q=85\&s=09c1c3b9b7c8a13f03cb99fccdcfa952)

*The Import new info dialog, with OffersV2 chosen*

## Check the result

Your file appears at the top of the **Import Log**, with the **Status** **Importing** while it runs. Select **Refresh** to see when it's done.

Look at its **Status**:

* **Successful**, with numbers in brackets such as (4/4), means every offer went in.
* **Verification needed**, with numbers such as (3/4), means the import found errors, and some rows or all of them didn't go in. See [Fix the rows that were left out](#fix-the-rows-that-were-left-out).
* **Failed**, with no numbers, means the import couldn't read the file at all, for example because it was empty. No offers went in.

Don't count the offers that went in by the first number. The second number is the rows in your file. The first number is that total minus the errors found.

* A row with several errors counts several times, so the first number can even go below 0.
* When one value stops a whole group of rows, it counts as only one error.

To check which offers went in, go to the **Overview** tab, search for their IDs and select one to open it.

## Fix the rows that were left out

1. Select **View** on the import's row. The details of the import open.
2. Under **Errors**, read each error. Its **Description** says what went wrong, such as a store that doesn't exist. Most descriptions name the offer's ID. When a value is missing or can't be read, the description names the row by a number in brackets instead, counting from `[0]` for the first row under the column names.
3. Correct those rows in your own file. The import doesn't give you a file of the rows that failed.
4. Import the corrected file again, as a new import.

The import sends your rows in groups of 100. The message at the top of the details counts groups, and a group with any error counts as not imported. So it can say "The file was not imported" even when other rows went in. To see which offers went in, check the **Overview** tab.

A value the import can't read stops more than its own row. It stops its whole group, so none of those rows go in. The details still show just one error, for the row with that value. In a file with fewer than 100 rows, one such value stops the whole file. These values do it:

* text in a number column, or a decimal in `RedemptionLimit`
* a misspelled choice, such as `Lines` in `ImpactLevel`
* an empty cell in `Priority`, `AllowOtherDiscountsOnTop`, `ItemsApplicationType` or `MaxDiscountAmount`
* a rule with a `Rule1Value` but no `Rule1ThresholdValue`

When the details show one of these, fix that row. Then import the whole file again. Rows that already went in replace their offers with the same settings. If someone has changed one of those offers in Nexus since, though, the import overwrites that change.

![The details of an offer import, opened with View in the Import Log, titled with the file name, which is blurred in this image. Under File details, a red message says The file was not imported, due to 1 errors in the file. You can see a list of the errors below. Below it, greyed out, are the choices made for the import: Select which data to import set to OffersV2, Select file format with CSV and JSONL, and Add file showing the same file name, blurred, and 305 Bytes. Import start date and Import end date both read 14/10/2026 12:08. Under Errors, the line In order to import the failed data, you need to correct the errors below in your local file. Afterwards you can create a new job and import the corrected file. is followed by an Error type filter and a Description search, then one error: Error type CreateCampaignAttemptFailed, with the description Failed to create offer \[0\]: Error converting value \{null} to type 'System.Int32'. Path 'Priority'. Close is at the bottom right.](https://mintcdn.com/lobyco-4c9fb3ad/rG971_5ZfS49bcjM/images/administer-62-offers-import-errors.png?fit=max\&auto=format\&n=rG971_5ZfS49bcjM\&q=85\&s=a79871c33442a9d45d5ffabf940a037c)

*The details of an import with one error*

## Download a list of your offers

The **Overview** tab lists your offers, with their **ID**, **Name**, **Type**, **Status**, start and end dates, and who edited them last. Select an offer to open it.

1. Use the filters above the list to narrow it down, by **ID**, **Name**, **Type**, **Status**, **Start date range** or **End date range**.
2. Select **Export**.

A CSV file downloads, with every offer that matches the filters, from all pages of the list.

The file isn't ready to import as it is. Many of its columns have the import's names, such as `Title` and `RedemptionLimit`, but these have different names:

| In the export | In the import |
| - | - |
| `CampaignId` | `OfferId` (it's the offer's ID, not its campaign's) |
| `CampaignName` | `OfferName` |
| `CampaignType` | `OfferType` |
| `ValidFrom` | `StartDate` |
| `ValidTo` | `EndDate` |

The import's campaign column is `UnifiedCampaignId`. The file also leaves out columns the import needs, such as `ImpactLevel`. So if you import it as it is, every row fails. Use it to look up the IDs, type names and current settings that go in your import file.

The file doesn't hold `ImpactLevel`, `MaxNumberApplyPerReceipt`, **Stacking Priority** or **Allow other offers on top**. [When you update an offer](#when-you-update-an-offer) says where to find them. Open the offer from the list on the **Overview** tab and look in its form.

![The Overview tab of the Offers import screen, headed Export/import, with Export at the top right. The filters are ID, Name, which holds Basket, Type, Status, set to All, Start date range and End date range, and the last column is Edited by. Ten test offers are listed with their ID, name, type, status, start and end dates and the initials of who edited them, for example Basket discount, App Coupon, Expired, 01/07/2025 to 31/08/2026, and Weekend basket 10% off, App Coupon, Draft, 17/10/2026 to 18/10/2026. Several names have a Last modified date under them. Items per page 10 and 1 — 10 of 12 are below the list.](https://mintcdn.com/lobyco-4c9fb3ad/rG971_5ZfS49bcjM/images/administer-63-offers-overview-export.png?fit=max\&auto=format\&n=rG971_5ZfS49bcjM\&q=85\&s=cd26d6e84fa652c20c8dde884767fb85)

*The Overview tab, with Export*

## Troubleshooting

> **Why don't I see Offers import?**
>
> **Offers import** only shows for admin users who have access to offers, and only when Lobyco has switched it on for your organisation. If you work with offers and still don't see it, ask Lobyco support.

> **Why did some rows not go in?**
>
> Select **View** on the import to see each error. A row doesn't go in when:
>
> * a required column is empty
> * a chain or store ID doesn't exist in Lobyco
> * it has both `ChainIds` and `StoreIds`
> * `EndDate` is before `StartDate`
> * `ImpactLevel` doesn't match `DiscountType`
> * `AudienceId` isn't a published audience, or the offer's type has no audience
> * `OfferId` belongs to an offer that was deleted
> * `Published` is `true`, but the offer has no rule, no chains or stores, or a price with no currency
> * `RedemptionLimit` is below 0, or `TotalCoupons` is 0 or less
>
> When the import can't read a value, such as a decimal in `RedemptionLimit`, none of the rows in that group go in. [Fix the rows that were left out](#fix-the-rows-that-were-left-out) lists the values that do this.
>
> Fix the rows and import the file again.

## Related

* **[Create an offer](/business-documentation/activities/offers/create-an-offer)** explains each field the columns set, in the order of the offer form.
* **[Offer types](/business-documentation/activities/offers/offer-types)** describes each type, and how customers get its coupons.
* **[Discount types](/business-documentation/activities/offers/discount-types)** covers each discount type and the rules it needs.
* **[Stacking and limits](/business-documentation/activities/offers/stacking-and-limits)** explains stacking priority and the limits on an offer.
* **[Edit or reuse an offer](/business-documentation/activities/offers/edit-or-reuse-an-offer)** covers changing one offer in the offer form.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.