---
title: "Шторка страницы"
description: "Короткий баннер, который появляется на страницах Ring с предложением добавить приложение на главный экран или рекламируемым товаром; как посетители его закрывают, как продавцы включают рекламу товаров и как авторы страниц получают комиссию"
locale: "ru"
---
# Шторка страницы

Шторка страницы это узкий баннер (около 10% высоты экрана), который появляется, когда посетитель перестаёт прокручивать. Она показывает одно из двух предложений: **Добавить на главный экран** для приложения или **товар**, который продавец решил рекламировать. На страницах новостей и в постах блогов участников товар, добавленный из шторки, может принести автору страницы комиссию, когда покупатель позже оплатит заказ.

> **Info**
> Используйте вкладки **Founder** / **Developer** в боковой панели документации, чтобы отфильтровать эту страницу. Общие разделы относятся к обеим аудиториям.

> **Success**
> **Статус (2026-10-26):** Выпущено в Layer 1 и настраивается для каждого клона через блок `curtain` в `ring-config.json`. Очередь теперь учитывает прежние отказы, поэтому посетитель, выбравший «Не сегодня», не увидит тот же баннер снова на следующей странице.

| Без шторки | Со шторкой |
|------------|------------|
| Подсказки установки зависят от браузера | Ring сам предлагает добавить на главный экран, один раз за окно политики |
| Авторы не зарабатывают на упомянутых товарах | Авторы получают дополнительные кредиты с оплаченных корзин, начавшихся с их страницы |
| Продавцы платят за рекламу где-то ещё | Продавцы включают рекламу товара и задают комиссию автору от 1% до 10% |

### For founders

## Почему это важно для вашего сообщества

Авторы приводят читателей, продавцы ищут покупателей. Шторка соединяет их без отдельной рекламной системы. Продавец отмечает товар, автор ссылается на него или пишет на ту же тему, и когда читатель покупает товар, автор получает вознаграждение в кредитах платформы. Выплата продавцу не уменьшается: комиссия начисляется как дополнительные кредиты.

  
- **[Новости](/docs/features/news.md)** — Страницы статей, где появляются предложения товаров.

  
- **[Блог участника](/docs/features/member-blog.md)** — Посты участников получают те же предложения товаров и комиссию автору.

  
- **[Магазин](/docs/features/store.md)** — Продавцы включают рекламу в шторке в форме товара.

### Типичные сценарии

- **Фуд-блогер ссылается на мёд фермы** в статье. Читатели видят мёд в шторке, нажимают «В корзину» и оплачивают в течение 30 дней. Блогер получает 5% от этой позиции кредитами.
- **Новый посетитель на мобильном** читает три страницы. На одной из них шторка предлагает добавить на главный экран. Он нажимает «Не сегодня» и не видит этого 24 часа.
- **Читатель нажимает «Не для меня»** на товаре. Этот товар больше никогда ему не покажется.

```mermaid
flowchart LR
  A[Vendor enables advertise] --> B[Article page]
  B --> C[Curtain offer]
  C -->|Add to cart| D[Signed touch stored]
  D --> E[Paid order within 30 days]
  E --> F[Author gets credit]
```

### Где смотреть результаты

- **Продавцы:** страница доходов показывает 7-дневную воронку шторки: показано, показано повторно, CTA, не сегодня, не для меня, прокручено, оплачено и начисленные кредиты.
- **Авторы:** My News (`/my-news`) показывает ту же 7-дневную воронку для их страниц плюс заработанные кредиты шторки.
- **Операторы:** страница аналитики администратора показывает ту же воронку для всего клона рядом с активной политикой шторки.

### For developers

## Конфигурация

`ring-config.template.json` поставляется с такими значениями по умолчанию. Переопределите любой ключ в `ring-config.json` своего клона. Значения читает `getCurtainPolicy()` в `lib/ring-config-core.ts`, а проверяет `parseCurtainPolicy` в `features/curtain/lib/policy.ts`.

| Ключ | По умолчанию | Допустимые значения |
|------|--------------|---------------------|
| `curtain.enabled` | `true` | `false` отключает все предложения |
| `curtain.productSource` | `page_then_pool` | `page_then_pool`, `page_only`, `pool_only` |
| `curtain.maxImpressionsPerDay` | `5` | от 1 до 50 на предложение за сутки UTC |
| `curtain.notTodayHours` | `24` | от 1 до 168 |

{`{
  "curtain": {
    "enabled": true,
    "productSource": "page_only",
    "maxImpressionsPerDay": 3,
    "notTodayHours": 48
  }
}`}

## Как выбираются предложения

`requestCurtainDrop` в `features/curtain/actions.ts` возвращает до трёх предложений (`CURTAIN_QUEUE_MAX`):

1. Полностью пропускается, когда политика выключена или путь начинается с `/admin`, `/login`, `/register`, `/auth`, `/vendor` или `/store/checkout`.
2. Предложения товаров только на страницах, передающих `newsArticleId` через `CurtainPageProvider` (статьи новостей и посты блогов участников). Статья должна быть опубликована и видна зрителю согласно `canViewNewsArticle`.
3. Товары **страницы** это ссылки `/store/`, найденные в тексте статьи. Товары **пула** это активные товары с `curtainAdvertiseEnabled`. Каждый должен быть рекламируемым, активным, иметь цену, не быть собственным товаром продавца-зрителя и не быть подавленным.
4. Сортировка: сначала товары из ссылок, затем совпадение темы с категорией и тегами статьи, затем меньше показов сегодня.
5. Свободное место заполняется предложением добавить на главный экран, если браузер ещё не запускает установленное приложение.

`curtain-host.tsx` показывает очередь и применяет `canShowOffer` к каждому элементу очереди, что и исправляет возврат закрытых баннеров.

## Ответы посетителей

| Ответ | Эффект |
|-------|--------|
| CTA | В корзину (товар) или подсказка установки (A2HS) |
| Не сегодня | Подавлено на `notTodayHours` с этого момента |
| Не для меня | Подавлено навсегда для этого предложения |
| Прокрутка | Записывается, без подавления |

Настройки хранятся в `localStorage` (`ring_curtain_prefs`), а для вошедших участников также в таблице `curtain_preferences` (миграция `050`, часть `schema.sql`) через `syncCurtainPrefs`.

## Атрибуция и комиссия

- Каждое предложение товара несёт HMAC `offerToken` из `features/curtain/lib/offer-token.ts`, подписанный `AUTH_SECRET`. Он связывает предложение, товар, автора и статью.
- Касания CTA хранятся в cookie `ring_curtain_attr` и хранилище (окно 30 дней, не более 12 касаний).
- Оформление заказа оставляет только касания, прошедшие `verifyCurtainTouches`. Автор и процент берутся из токена и актуального товара, никогда из браузера.
- После оплаты `mintCurtainAuthorCommission` в `features/curtain/services/commission.ts` добавляет автору кредиты: подытог позиции, умноженный на процент товара (от 1 до 10, по умолчанию 5). Пропускает покупку самому себе, реферера заказа, дубликаты и работает только при включённых кредитных вознаграждениях.
- События `curtain_shown`, `curtain_response`, `curtain_cta`, `curtain_suppress` и `curtain_paid` питают `getCurtainFunnel` в `features/analytics/lib/curtain-analytics.ts`.

## Включение продавцом

Форма товара продавца содержит `AdvertiseProductWidget` (`features/curtain/components/advertise-product-widget.tsx`). Он записывает `curtainAdvertise: { enabled, commissionPercent }` и `curtainAdvertiseEnabled` в товар. Товар без цены нельзя рекламировать.

## Частые вопросы

### Влияние

#### Вычитается ли комиссия из выплаты продавцу?

Нет. Это дополнительные кредиты, начисленные автору и записанные с источником `curtain_author`.

### Миграция

#### Нужна ли миграция?

Не для новой установки. Существующим базам данных нужна `050_curtain_offers.sql` для `curtain_preferences` и индекса аналитики.

### Эксплуатация

#### Как отключить шторку для одного клона?

Установите `"curtain": { "enabled": false }` в `ring-config.json` этого клона и пересоберите.

  
- [features/store](/docs/features/store.md) — Зависит от: товаров, корзины и оплаченных заказов, которые запускают комиссию.

  
- [features/news](/docs/features/news.md) — Тот же процесс: страницы статей с предложениями товаров.

  
- [features/member-blog](/docs/features/member-blog.md) — Тот же процесс: посты участников содержат те же предложения.

  
- [features/rewards](/docs/features/rewards.md) — См. также: кредитные вознаграждения, которые должны быть включены для комиссии.

  
- [features/refcodes](/docs/features/refcodes.md) — См. также: реферальная атрибуция с тем же 30-дневным окном.
