☰ Меню · Рестораны и кафе
Руководства

Рестораны и кафе

Три задачи, которые POS заведения решает через Loyaltyfy: синхронизация QR-меню, приём заказов со столов и лояльность на кассе.

Обычно источник правды по ценам и наличию это POS. Укажите для каждого блюда свой артикул в external_id и обращайтесь к блюдам по нему: хранить наши id не придётся.

  1. 1
    Прочитайте текущее меню

    GET /v1/menu возвращает категории, блюда и модификаторы на всех языках. Добавьте ?lang=en, чтобы получить обычные строки на одном языке.

  2. 2
    Создайте недостающее

    POST /v1/menu/items с category (id категории или ваш код категории, по неизвестному коду категория создаётся), external_id, name на одном или нескольких языках и price. Повторная отправка с тем же external_id вернёт уже существующее блюдо.

  3. 3
    Отправляйте изменения

    При каждом изменении или раз в несколько минут отправляйте POST /v1/menu/items/bulk с ценами и наличием. До 500 блюд за запрос, неизвестные артикулы вернутся в not_found.

curl
curl https://loyaltyfy.io/api/v1/menu/items/bulk \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "item": "1001", "price": 4800 },
      { "item": "2040", "available": false },
      { "item": "3017", "price": 9900, "old_price": 12000 }
    ]
  }'
Ответ · 200
{
  "object": "menu_bulk_result",
  "updated": ["1001", "2040"],
  "unchanged": [],
  "not_found": ["3017"],
  "failed": []
}

Стоп-лист: available: false оставляет блюдо в меню с пометкой «нет в наличии» и убирает кнопку заказа, visible: false скрывает его. У модификаторов свой переключатель, так что можно отключить овсяное молоко, не отключая кофе:

curl
curl -X PATCH https://loyaltyfy.io/api/v1/menu/option_values/MOD-OAT \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "available": false }'
Фото, описания и переводы заведение обычно правит в редакторе меню Loyaltyfy. Синхронизируйте только то, за что действительно отвечает POS (цены, наличие, возможно названия), чтобы две системы не перезаписывали друг друга.

Заказы со столов

Если заказы включены (Меню → Заказы в кабинете), гости, отсканировавшие QR на столе, могут отправить корзину в заведение. У каждого стола своя ссылка с номером стола:

curl
https://loyaltyfy.io/m/your-venue?table=12

Сумму каждого заказа мы считаем на своей стороне по актуальному меню, поэтому POS может доверять суммам. Заказы с блюдом или модификатором из стоп-листа отклоняются до того, как дойдут до вас.

  1. 1
    Получайте новые заказы

    Подпишитесь на вебхук order.created или опрашивайте GET /v1/orders?status=new раз в 10-15 секунд.

  2. 2
    Примите заказ

    Создайте заказ в POS, затем вызовите POST /v1/orders/{id}/accept, передав свой id заказа в external_id. Для сопоставления с вашими артикулами используйте external_id каждой позиции.

  3. 3
    Ведите по статусам

    PATCH /v1/orders/{id} со статусами preparing, ready, served, completed. Или POST /v1/orders/{id}/reject с причиной, если кухня не может взять заказ.

curl
curl "https://loyaltyfy.io/api/v1/orders?status=new" \
  -H "Authorization: Bearer sk_test_..."
Один заказ из списка
{
  "object": "order",
  "id": "0c69a81c-0fbc-4333-b26c-789566b9bea4",
  "number": 10,
  "status": "new",
  "table": "7",
  "note": "No onions, please",
  "currency": "MDL",
  "subtotal": 14000,
  "item_count": 2,
  "items": [
    {
      "item_id": "a48343bd-9f6e-424a-b003-fe790617f4d6",
      "external_id": "2040",
      "name": "Zeamă",
      "quantity": 2,
      "unit_price": 7000,
      "total": 14000,
      "options": []
    }
  ],
  "external_id": null,
  "reject_reason": null,
  "guest_language": "en",
  "source": "qr_menu",
  "livemode": true,
  "created_at": "2026-10-06T18:14:48.233+00:00",
  "accepted_at": null,
  "completed_at": null,
  "updated_at": "2026-10-06T18:14:48.233+00:00"
}
curl
curl -X POST https://loyaltyfy.io/api/v1/orders/0c69a81c-0fbc-4333-b26c-789566b9bea4/accept \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "external_id": "POS-ORDER-55821" }'

Статусы меняются только вперёд: new → accepted → preparing → ready → served → completed. Из new заказ может перейти в rejected, а любой открытый заказ можно перевести в cancelled. Шаги можно пропускать (сразу из accepted в completed тоже можно). На переход назад придёт 409 invalid_status_transition. Заведения без интеграции с POS ведут те же статусы на экране Заказы, так что ваш POS может только принимать и завершать заказы.

Лояльность на кассе кафе

Всё как в любой интеграции с POS: ищите гостя при скане карты, отправляйте чек после оплаты. В кафе со штамп-картой («каждый 6-й кофе бесплатно») штамп начисляется за чек. Передавайте line_items с вашими артикулами, чтобы заведение видело, что покупают гости.

Вопросы по интеграции: api@loyaltyfy.io. Отвечаем в течение одного рабочего дня.