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

# Build a Box

> Постпокупочное предложение Build a Box: покупатели собирают собственный набор из подобранных вами товаров, а скидка за объём растёт по мере заполнения коробки.

**Build a Box** — это тип постпокупочного предложения, в котором покупатель собирает собственную коробку из набора подобранных вами товаров и покупает весь набор одной транзакцией. Вместо того чтобы принять или отклонить один товар, он выбирает, что положить и сколько, а скидка за объём может расти по мере заполнения коробки.

Оно стоит в одном ряду с постпокупочными предложениями одного и нескольких товаров и сочетается с обычными виджетами предложений, такими как заголовок и таймер.

<Note>
  Build a Box предлагает несколько разных товаров. Чтобы продавать больше единиц одного товара по многоуровневым ценам, используйте [Quantity upsells](/ru/aftersell/quantity-upsells).
</Note>

Чтобы добавить такое предложение, откройте воронку, нажмите **Add offer** и выберите **Build a box**.

<div id="setting-up-the-box">
  ## Настройка коробки
</div>

<div id="choosing-candidate-products">
  ### Выбор товаров-кандидатов
</div>

Раздел **Product selection** определяет, из каких товаров покупатель может выбирать. Они называются *кандидатами*.

1. Откройте предложение коробки в редакторе постпокупочной воронки.
2. Раскройте **Product selection**.
3. Нажмите **Add product** и выберите один или несколько товаров. Товары, уже находящиеся в списке, исключаются из выбора.
4. Сохраните.

Коробка поддерживает до **12 кандидатов**. Перетащите рукоятку строки для изменения порядка — именно этот порядок видят покупатели. Используйте значок удаления, чтобы убрать товар; последнего оставшегося кандидата удалить нельзя, поскольку коробке нужен хотя бы один.

<div id="box-size">
  ### Размер коробки
</div>

**Box size** задаёт, сколько товаров должен выбрать покупатель:

| Настройка                    | Что она делает                                                                                             |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------- |
| **Minimum items**            | Нижняя граница. Считается в штуках, поэтому три единицы одного товара считаются за три.                    |
| **Maximum items (optional)** | Оставьте пустым для отсутствия ограничения. Установите равным минимуму для коробки фиксированного размера. |

Для коробки фиксированного размера редактор отмечает, что покупатели должны выбрать ровно столько товаров и увидят счётчик «0 of N selected».

<Warning>
  Если ваши кандидаты в сумме не могут достичь минимума, редактор показывает критический баннер с заголовком **«This box won't be shown to shoppers»**, указывающий максимально возможное количество товаров и заданный вами минимум. Предложение полностью пропускается при показе.

  Предлагаемое исправление зависит от причины:

  * **У товара выключен селектор количества**, поэтому его можно добавить только один раз — включите его обратно, добавьте больше товаров или снизьте минимум.
  * **В остальных случаях** — снизьте минимум, добавьте больше товаров или повысьте максимальное количество товара.
  * **Максимум коробки не допускает ни одного товара** — баннер сообщает об этом и просит повысить его или оставить пустым.
</Warning>

<div id="discounts">
  ## Скидки
</div>

<div id="discount-tiers">
  ### Уровни скидок
</div>

Раздел **Box discount** задаёт скидку, которая масштабируется с количеством товаров в коробке. Добавьте уровень кнопкой **Add tier**, затем задайте **Minimum items for tier N** и **Discount for tier N**.

Как выбирается ставка:

* Покупатель получает **самую глубокую** ставку, на которую его коробка имеет право, а не просто последний пересечённый порог. Если вы настроили 30% от 3 товаров и 20% от 6 товаров, покупатель с 6 товарами всё равно получит 30%.
* Ставка оценивается по **текущему количеству товаров**, а не по минимуму коробки. Плитка открывается по полной цене и переоценивается по мере заполнения коробки, поэтому показываемая покупателю ставка — всегда та, которую его текущий выбор действительно зарабатывает.
* Пустая таблица уровней допустима и означает, что коробка продаётся по полной цене.

Общего лимита скидки на коробку нет — таблица уровней — единственное, что задаёт ставку.

Редактор показывает предупреждения для конфигураций уровней, которые выглядят непреднамеренными. Два из них блокируют сохранение; третье носит только рекомендательный характер:

| Предупреждение                                                                                            | Когда появляется                                                                       | Блокирует сохранение? |
| --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | --------------------- |
| Уровень даёт меньшую скидку, чем меньший уровень, поэтому никогда не применяется                          | Уровень со строго большим минимумом имеет меньшую ставку скидки, чем уровень ниже него | Да                    |
| Уровень находится ниже минимума коробки, поэтому каждая доступная покупателю коробка уже его зарабатывает | Минимум уровня ниже нижней границы коробки                                             | Нет                   |
| Два уровня начинаются с одного и того же количества товаров                                               | Дублирующиеся минимумы уровней                                                         | Нет                   |

Максимум коробки также должен быть равен минимуму или больше него. Установка максимума ниже минимума блокирует сохранение.

<div id="per-product-discounts">
  ### Скидки по товарам
</div>

Кандидат может иметь собственную скидку вместо ставки коробки. Откройте кандидата, перейдите в **Discount** и отметьте **Give this product its own discount**.

* Переопределение применяется на плитке этого товара и в итоге коробки вместо ставки уровня.
* `0` — допустимое переопределение: оно удерживает товар по полной цене внутри коробки со скидкой.
* Оставьте переопределение выключенным, чтобы следовать скидке коробки.

<div id="editing-several-products-at-once">
  ### Редактирование нескольких товаров сразу
</div>

**Edit all products** открывает панель массового редактирования. Снимите отметку с любого кандидата, которого хотите исключить из правки.

Там, где выбранные товары различаются, поле показывает **Mixed** — его редактирование записывает ваше значение во все из них, а если его не трогать, сохраняется собственное значение каждого товара. Переключатель переопределения показывает неопределённое состояние, когда переопределения есть только у некоторых.

<div id="per-product-settings">
  ## Настройки по товарам
</div>

У каждого кандидата есть собственная панель, охватывающая **Badge**, **Product image badge**, **Image**, **Product details** (включая рейтинги отзывов, где цвета звёзд по умолчанию `#fdcc0d` и `#d1d5db`), **Variant options**, **Box limits**, **Discount** и **Already purchased**.

Внешний вид плитки не задаётся для каждого кандидата отдельно. Он определяется настройкой [**Layout**](#layout) на уровне предложения, поэтому все плитки в коробке имеют одинаковую форму.

Две настройки в разделе **Box limits** стоит выделить:

* **Show quantity selector** — включена по умолчанию. Выключите её, чтобы каждое добавление клало ровно одну единицу, без степпера количества на плитке.
* **Maximum quantity in a box** — оставьте пустым для отсутствия ограничения или установите 1, чтобы коробка-ассорти оставалась разнообразной.

Раздел **Already purchased** определяет, что происходит, когда у покупателя уже есть этот товар — купленный в текущем заказе или принятый на предыдущем шаге воронки. Сопоставление идёт по ID товара, поэтому другой вариант купленного товара тоже считается. Выберите один из трёх вариантов:

| Вариант                        | Что он делает                                                                                                                                      |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Show normally**              | Товар появляется в коробке без особой обработки (по умолчанию).                                                                                    |
| **Show a "Your choice" badge** | Товар остаётся в коробке, и бейдж-плашка отмечает его как уже имеющийся у покупателя.                                                              |
| **Hide the product**           | Товар полностью убирается из коробки. Недоступно для самых дорогих/дешёвых кандидатов, которые определяются из заказа после чтения этой настройки. |

Когда выбран **Show a "Your choice" badge**, появляются три дополнительные настройки:

* **Badge text** — текст на бейдже. Оставьте пустым, чтобы использовать перевод вашего магазина (задаётся в **Settings > Translations** в пункте **Already purchased badge**). По умолчанию «Your choice».
* **Badge color** — цвет заливки плашки бейджа (hex, по умолчанию `#008060`).
* **Badge text color** — цвет текста внутри плашки бейджа (hex, по умолчанию `#ffffff`).

Бейдж виден в предпросмотре редактора воронки, поэтому вы можете увидеть, как он выглядит, до публикации.

<div id="layout">
  ## Макет
</div>

**Layout** в настройках макета коробки задаёт форму плитки и количество плиток в одном ряду:

| Макет             | Как выглядит                                                                        |
| ----------------- | ----------------------------------------------------------------------------------- |
| **Classic**       | Изображение рядом с текстом, два товара в ряду.                                     |
| **Compact grid**  | Изображение над текстом, три товара в ряду, на телефоне по одному в ряду.           |
| **Spotlight**     | Первый товар занимает половину ширины, остальные следуют за ним в компактной сетке. |
| **Split columns** | Товары слева, а итог и кнопка покупки в отдельной колонке справа.                   |

В этом же разделе задаются отступы вокруг коробки.

<div id="progress">
  ## Прогресс
</div>

**Box progress** управляет индикатором заполнения:

| Настройка                | Варианты                                       | По умолчанию |
| ------------------------ | ---------------------------------------------- | ------------ |
| **Position**             | Над товарами / Над кнопкой покупки / Оба места | Над товарами |
| **Show progress bar**    | Вкл. / выкл.                                   | Вкл.         |
| **Bar color**            | Hex                                            | `#008060`    |
| **Bar position**         | Над текстом / под текстом                      | Над текстом  |
| **Top / bottom padding** | 0–10 с шагом 2                                 | 0            |

Позиции «скрыто» нет. Чтобы полностью убрать строку прогресса, очистите поле текста прогресса.

<div id="progress-text-variables">
  ### Переменные текста прогресса
</div>

Введите `{` в любом из трёх редакторов [формулировок прогресса](#progress-wording), чтобы вставить переменную.

| Переменная                                            | Что показывает                                                                                                                                                                                                                                    |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `{box-progress}`                                      | Всё стандартное предложение прогресса. Оно меняет структуру в зависимости от состояний коробки, чего не может ни одно написанное вручную предложение — см. [Формулировки прогресса](#progress-wording), чтобы переформулировать каждое состояние. |
| `{items-in-box}`                                      | Сколько товаров сейчас в коробке.                                                                                                                                                                                                                 |
| `{items-to-go}`                                       | Сколько осталось до минимума.                                                                                                                                                                                                                     |
| `{box-minimum}`                                       | Минимум коробки.                                                                                                                                                                                                                                  |
| `{box-maximum}`                                       | Максимум коробки.                                                                                                                                                                                                                                 |
| `{current-discount}`                                  | Действующая сейчас ставка.                                                                                                                                                                                                                        |
| `{next-discount}`                                     | Ставка, открываемая добавлением товаров. Пусто на самом глубоком уровне.                                                                                                                                                                          |
| `{items-to-next-discount}`                            | Сколько ещё товаров нужно для её достижения. Пусто на самом глубоком уровне.                                                                                                                                                                      |
| `{subtotal}` / `{total}` / `{discount}` / `{savings}` | Цены коробки, суммированные по всему выбору. Пусто, пока цена не определена.                                                                                                                                                                      |
| `{first-name}`                                        | Имя покупателя.                                                                                                                                                                                                                                   |
| `{timer}` / `{timer-end}`                             | Обратный отсчёт предложения.                                                                                                                                                                                                                      |

Переменные заголовка шага, доступные в предложениях нескольких товаров, не имеют эквивалента для коробки и здесь не предлагаются.

<div id="progress-wording">
  ### Формулировки прогресса
</div>

**Progress wording** состоит из трёх редакторов форматированного текста, по одному на каждый этап заполнения коробки. Введите `{` в любом из них, чтобы вставить [переменную](#progress-text-variables). Очистите поле, чтобы скрыть строку прогресса в этом состоянии.

| Редактор                             | Когда показывается его строка                                                                                                         |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Before the minimum items reached** | Пока в коробке меньше минимума. Покупатель ещё не может оформить заказ, поэтому только эта строка объясняет, почему кнопка неактивна. |
| **Between minimum and maximum**      | Когда коробка превысила минимум, но более глубокая скидка или максимум ещё впереди.                                                   |
| **Maximum items hit**                | Когда коробка получила всё возможное: максимум или самую глубокую скидку, если у коробки нет максимума.                               |

Редактор показывает только те поля, которых ваша коробка действительно может достичь:

* **Before the minimum items reached** появляется, только если минимум коробки больше нуля.
* **Between minimum and maximum** появляется, только если у коробки есть максимум или хотя бы один уровень скидки. Если нет ни того, ни другого, достижение минимума уже является конечным состоянием.
* **Maximum items hit** появляется всегда. Каждая коробка до него доходит.

Поскольку это редакторы форматированного текста, вы можете делать формулировки жирными, менять их цвет и размер, а не только слова.

При смене **Language** коробки все формулировки, которые вы не редактировали, переводятся заново. Отредактированное поле остаётся ровно таким, каким вы его ввели.

<div id="tile-button-text">
  ## Текст кнопок плитки
</div>

Раздел **Tile button text** в панели Buttons позволяет настроить формулировки на кнопках Add и Remove, появляющихся на каждой плитке кандидата, только для этой воронки.

* **Add button text** — надпись на плитке до того, как покупатель добавит товар в коробку. По умолчанию «Add to box».
* **Remove button text** — надпись на плитке после того, как покупатель добавил товар. По умолчанию «Remove».

Оставьте любое поле пустым, чтобы использовать перевод вашего магазина со страницы Translations. Если перевод магазина тоже пуст, используется английское значение по умолчанию.

Надпись состояния недоступности («Unavailable») этими настройками не затрагивается.

Чтобы задать значения по умолчанию для всего магазина вместо переопределения по воронке, перейдите в **Translations** в админке Aftersell и обновите записи **Add to box** и **Remove from box**.

<div id="shipping">
  ## Доставка
</div>

Раздел **Shipping** задаёт стоимость доставки коробки. Коробка либо доставляется бесплатно, либо добавляет плату за доставку. Если вы взимаете плату, вы задаёте сумму и выбираете, умножать ли её на количество товаров в коробке, поэтому коробка из шести товаров может стоить шесть поштучных ставок или одну фиксированную плату.

<div id="language-and-order-tagging">
  ## Язык и теги заказов
</div>

* **Language** задаёт язык текста и кнопок коробки, а также переводов сведений о товарах.
* **Order tag** присваивает тег Shopify каждому заказу, в котором принята коробка. Используйте его для маршрутизации выполнения заказов или для выделения заказов с коробкой в отчётах.

<div id="limitations">
  ## Ограничения
</div>

* **Одна общая кнопка принятия.** У коробки один призыв к действию, а не кнопки по товарам, потому что Shopify ограничивает количество принятий на постпокупочной странице.
* **Нет предложений замены.** Коробку нельзя использовать как замещающий апселл.
* **Разбивка цены не сворачивается.** **Show price breakdown** в **General settings** включает или выключает её. Когда она включена, она всегда развёрнута — предложение нескольких товаров, напротив, прячет свою разбивку за ссылкой «Show price breakdown».

<div id="subscription-only-products">
  ### Товары только по подписке
</div>

Товары, настроенные на продажу только по подписке (`requiresSellingPlan: true` в Shopify — без варианта разовой покупки), не могут быть включены в предложение build-a-box. Каждый товар в коробке оплачивается как разовая покупка в заказе, поэтому Shopify отклоняет товары только по подписке при показе. Эти кандидаты молча отбрасываются в каждом реальном заказе, хотя предпросмотр редактора воронки продолжает их показывать.

Редактор воронки предупреждает вас, когда эта ситуация обнаружена:

* **Предупреждающий баннер** — некоторые кандидаты доступны только по подписке, но достаточно кандидатов без подписки остаётся для достижения минимума коробки. Баннер перечисляет затронутые товары по названиям. Предложение всё ещё показывается покупателям, но с меньшим количеством товаров, чем настроено.
* **Критический баннер** — все кандидаты доступны только по подписке, или оставшиеся кандидаты без подписки не могут достичь минимума коробки. Предложение полностью пропускается для каждого покупателя.

**Если вы видите предупреждающий баннер**, коробка всё ещё работает — она просто показывает меньше товаров, чем вы настроили. Добавьте больше кандидатов, которые также можно купить разово, чтобы коробка содержала задуманный вами ассортимент.

**Если вы видите критический баннер**, предложение вообще не будет работать, пока вы его не исправите. Любое из этих действий устраняет его:

* Добавьте кандидатов, которых также можно купить разово.
* Снизьте минимум коробки, чтобы оставшихся кандидатов хватало для его достижения.
* Выключите «только по подписке» у затронутых товаров в Shopify, если они должны продаваться и как разовая покупка.

Вы также можете полностью убрать кандидатов только по подписке из коробки. Для покупателей это ничего не меняет — они и так отбрасываются в каждом реальном заказе, — но это убирает баннер и приводит предпросмотр редактора в соответствие с тем, что реально показывается.

Товары с **включённой** подпиской (предлагающие и разовую покупку, и подписку) из коробки не отбрасываются. Они просто продаются как разовая покупка, как и любой другой товар коробки, — коробка никогда не несёт план продаж.
