Колонки
Як для імпорту з Excel: «№» або «Квартира», «Статус», «Ціна», «Площа» — українською чи англійською. Порядок колонок і зайві колонки не важливі.
Інтеграції
Шахматку вже ведете в Google Таблиці чи CRM — другу вести не треба. Budvid бере звідти статуси й ціни, а заявки покупців надсилає у вашу CRM.
Публікуєте аркуш — Budvid щогодини оновлює з нього статуси й ціни. Без програміста.
2Ваша CRM надсилає статуси й ціни одним запитом — презентація показує їх за ~15 секунд.
3Кожна заявка з презентації — JSON на вашу адресу з підписом, повторами й журналом доставок.
Сценарій 1 · без програміста
Менеджери й далі працюють у своїй таблиці. Budvid раз на годину читає опублікований аркуш і оновлює статуси й ціни квартир у презентації.
Як для імпорту з Excel: «№» або «Квартира», «Статус», «Ціна», «Площа» — українською чи англійською. Порядок колонок і зайві колонки не важливі.
Квартира — «12», «кв. 12» чи «Квартира 12». Статуси — «вільна», «бронь», «продано» або available, reserved, sold. Ціни — «€ 81 000», «81 000,00», «81000».
Кабінет покаже, що саме: посилання не з публікації, таблицю знято з публікації, не знайшлися колонки чи номери квартир.
Опубліковану таблицю може відкрити кожен, хто має посилання. Публікуйте аркуш лише зі статусами й цінами — без імен і телефонів покупців.
Сценарій 2 · для вашого програміста
Квартиру продали чи забронювали в CRM — CRM одним запитом передає шахматку в Budvid, і покупці бачать зміни в презентації за ~15 секунд.
curl -X PUT "<API_URL>/v1/projects/<slug>/sales" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"sales": [
{"id": "flat-12", "status": "sold", "price": 81000},
{"id": "flat-13", "status": "reserved", "price": 79500, "area": 57.6},
{"id": "flat-14", "status": "available", "price": 84000}
]}'
Відповідь: {"saved": 3}. Поточну шахматку віддає та сама адреса методом GET.
<API_KEY>Ключ APIКабінет → «Тариф» → «Ключі API» → «Створити ключ». Ключ показується один раз. Ключі є в тарифах «ЖК», «Девелопер», «Агенція 100» і «Агенція 300».<API_URL>Адреса сервісуКабінет → форма входу → «Або ключем API» → поле «Адреса сервісу».<slug>Назва презентації в адресіbudvid.com/p/<slug> — посилання на опубліковану презентацію.idКвартира чи будинокКолонка id у CSV із кабінету: вкладка «Шахматка» → «Завантажити CSV». Наприклад, flat-12.statusavailable · reserved · soldВільна, бронь, продано.priceЦіна цілим числом або nullУ валюті проєкту — вона обирається в профілі. null — без вашої ціни.areaПлоща, м² — не обов’язковоВід 5 до 5000, з точністю до десятої. Без неї — площа з плану.Список замінює шахматку цілком: передавайте всі квартири разом, до 3000 в одному запиті. Квартира, якої в списку немає, показується вільною.
Сценарій 3 · заявки
Покупець залишив заявку в 3D-презентації — Budvid одразу надсилає її на вашу адресу. Приклад: вхідний вебхук у вашій CRM — Bitrix24, KeyCRM, Binotel чи власна система.
webhook.test, а вкладка «Доставки» показує код відповіді вашого сервера.POST https://crm.example.com/hooks/budvid
Content-Type: application/json
X-Archviz-Event: lead.created
X-Archviz-Delivery: dlv_…
X-Archviz-Signature: t=1761400000,v1=5f2c…
{
"id": "evt_…",
"event": "lead.created",
"created": 1761400000,
"data": {
"id": "lead_…",
"project": "<slug>",
"unit": "flat-12",
"name": "Олена",
"phone": "+380 67 123 45 67",
"note": null,
"lang": "uk",
"created": 1761400000
}
}
v1 — HMAC-SHA256 у hex від рядка <t>.<тіло запиту> з вашим секретом. Відкидайте запити зі старим t — понад 5 хвилин.
// Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(rawBody, header, secret) {
const p = Object.fromEntries(
header.split(',').map((s) => s.split('=')));
const age = Math.abs(Date.now() / 1000 - Number(p.t));
if (!p.t || !p.v1 || age > 300) return false;
const expected = createHmac('sha256', secret)
.update(`${p.t}.${rawBody}`).digest('hex');
return expected.length === p.v1.length &&
timingSafeEqual(Buffer.from(expected), Buffer.from(p.v1));
}
// PHP
$body = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_ARCHVIZ_SIGNATURE'] ?? '';
parse_str(str_replace(',', '&', $header), $p);
$ok = isset($p['t'], $p['v1'])
&& abs(time() - (int) $p['t']) <= 300
&& hash_equals(
hash_hmac('sha256', $p['t'] . '.' . $body, $secret),
$p['v1']);
unit — id квартири, яку дивився покупець, або null; created — час у секундах Unix; lang — мова презентації.
Доставлено — коли ваш сервер відповів 2xx за 10 секунд. Інакше повторюємо через 1 хв, 5 хв, 30 хв, 2 год і 12 год.
Запит іде тільки на ту адресу, яку ви вказали: переадресацію (3xx) не виконуємо — така відповідь вважається невдалою спробою.
Якщо CRM чекає свої поля, між Budvid і CRM ставлять невеликий обробник: він перевіряє підпис і перекладає поля у формат CRM.
Готового модуля немає. Заявки приходять у CRM через вхідний вебхук або ваш обробник, а статуси й ціни CRM передає через API — як описано вище.
Шахматка одна: кожне оновлення — з таблиці, через API чи вручну в кабінеті — записується поверх попереднього. Оберіть одне джерело, щоб вони не перезаписували одне одного.
Через ~15 секунд після запису. З Google Таблиці записуємо щогодини або за кнопкою «Оновити зараз», через API — одразу після вашого запиту.
Ні: у презентації — тільки статуси, ціни й площі квартир. Але опубліковану в Google таблицю може відкрити кожен, хто має посилання, тож не тримайте на тому аркуші даних покупців.
Напишіть, у чому ведете шахматку й заявки, — підкажемо, як з’єднати це з Budvid.