Google Таблицы как база данных: как мы собрали мини-приложение для фитнес-тренеров
FIT BOT терминал онлайн
Привет, это команда Geron Labs. Мы делаем AI-автоматизации и инженерные продукты.
UPDATE - 05.2026 больше информации на странице (сайте) ниже!
Расскажем про Fit Bot, приложение для частных фитнес-тренеров и их клиентов.
Платформа живёт внутри Telegram как полноценный WebApp на React, с двумя темами оформления, десятью экранами и админкой для тренера.
Хранилище необычное: вместо SQL-базы данные лежат в Google Таблицах, которые тренер ведёт сам.
Идея пришла из простого наблюдения - У частного тренера обычно 10-15 клиентов.
И каждый раз одна и та же история: записи с программой, фото упражнений через мессенджер, недельные корректировки, отчеты в голосовых по питанию и тренировкам, плюс контроль только через ГУГЛ -таблицы.
Готовые приложения на рынке есть, но они сделаны под крупный фитнес-клуб с кабинетом администратора.
Частному тренеру такое решение избыточно и стоит денег, которых он не готов отдавать за фичи без применения. Мы сделали прослойку.
Тренер остаётся в своих Google Таблицах, клиент получает Telegram WebApp с кнопками, логированием подходов, распознаванием еды по фото и экраном прогресса. Оба видят одну и ту же информацию, только со своей стороны.
Стек
Клиент открывает бота, нажимает /start, внутри бота открывается мини-приложение. Все данные по тренировкам, питанию, замерам берутся из персональной вкладки Google Таблицы. Тренер эту вкладку видит у себя и может править напрямую.
Как выглядит мини-приложение у клиента
Мы строили FIT BOT как самостоятельный продукт, который потом можно упаковать в iOS и Android через Capacitor или перенести на React Native. Поэтому UI писали с нуля, без готовых тем.
- Главный с карточками по разделам.
- Выбор дня тренировки.
- Экран тренировки с вводом веса и повторов.
- Экран питания со сканированием еды.
- Экран результата сканирования.
- Материалы тренера.
- Связь с тренером с тремя каналами (сообщение, звонок, видеозвонок) и чекбоксом "срочно".
- Профиль.
- Прогресс.
Две темы оформления. Minimal, чёрный фон, белая типографика Montserrat и Inter, тени отсутствуют, читается хорошо на OLED-экранах. Neon, фиолетовый фон, циан и розовый акценты, градиенты на кнопках, blur-подложки на фоне, text-shadow на заголовках.
Переключается в один клик в шапке, чтобы клиент выбрал свой вайб.
Ширина контейнера 500 пикселей, все тач-зоны от 44 на 44 пикселя, safe areas учитывают вырез экрана и системные панели.
Telegram WebApp SDK используем по полной: расширение на весь экран, окраска шапки под тему, haptic feedback на каждом успешном действии, авторизация по initData без отдельного логина.
Ключевые сценарии
Тренировка. Клиент открывает день, видит список упражнений. Под каждым упражнением подпись с прошлым рабочим весом, чтобы не вспоминать. Вводит вес и повторы, нажимает подтвердить. На кнопке loading-состояние с текстом "синхронизация", защита от двойного клика. По завершении success-overlay с иконкой, haptic-откликом и автопереходом на главный экран.
Питание. Клиент нажимает кнопку с иконкой камеры, загружает фото обеда. Файл уходит в ИИ, возвращается название блюда и примерная граммовка. По названию достаём БЖУ. На экране результата две крупные карточки, калории и белки, шрифт 2rem.
Клиент подтверждает или правит цифры, и они попадают в дневник питания в его вкладке Google Таблицы.
Прогресс. Четыре метрики на тёмных карточках с иконками Lucide. Тоннаж за неделю в килограммах объёма. Точность питания в процентах как отношение фактических калорий к плановым за семь дней. Активность числом тренировок. Вес тела и процент жира. Под каждой метрикой короткая подпись курсивом, зачем она нужна.
Связь с тренером. Три кнопки по каналам плюс чекбокс "срочно". После отправки запроса экран переходит в состояние "запрос отправлен", и клиент возвращается на главный.
Админка тренера
Тренер заходит по паролю в отдельный раздел приложения. Видит список своих клиентов карточками, у каждой кнопка "конструктор". Конструктор тренировок устроен так: тренер вводит название дня ("День 1: Спина, Бицепс"), добавляет упражнения через кнопку с плюсом, для каждого задаёт подходы и повторения, кнопкой "удалить" убирает лишнее.
По готовности нажимает "назначить клиенту", и данные уходят в персональную вкладку клиента в Google Таблице.
То есть тренер может работать двумя способами.
Первый способ, привычный: открыл Google Таблицу у себя, заполнил план вручную, раскрасил ячейки как любит.
Второй способ, удобный: открыл Telegram, зашёл в админку, собрал тренировку в конструкторе, назначил клиенту.
Оба способа работают с одной и той же таблицей.
Почему Google Таблицы
Сначала мы прикидывали PostgreSQL с админкой. Но тренер уже работает в Google Таблицах много лет, у него там своя система пометок, формул и цветовых выделений.
Любая новая админка проигрывает этому готовому инструменту. Поэтому мы перевернули подход. Google Таблица сама стала базой данных. Мы подключаемся через сервисный аккаунт, читаем и пишем ячейки, парсим структуру.
Плюсы. Тренер работает в привычной среде. Клонирование клиента занимает два клика. Редактирование тренировочного плана, добавление комментариев, пересчёт формул, всё это работает из коробки. Если что-то пошло не так в коде бота, тренер всё равно видит данные клиента и консультирует его голосом.
Минусы. Google Sheets API ограничен 120 запросами в минуту на проект. Нет индексов, нет транзакций, джойнов не существует. Конкурентная запись рискует затереть данные. Для масштаба в миллион пользователей такое решение не подойдёт. Для пары тренеров со ста клиентами работает уверенно.
Самый главный минус как клиента - это 2-3 секунды на подгруздку данных. В наше время это реально заметно!
Логика парсинга по якорям
Один файл Google Таблиц на тренера. В файле служебная вкладка Temp с шаблоном плана, и по одной вкладке на каждого клиента.
Когда клиент впервые открывает бота, бэкенд ищет его username или Telegram ID среди названий вкладок. Если вкладки нет, клонируем Temp, переименовываем в ник клиента, отдаём клиенту. Процесс занимает две секунды. Тренеру остаётся только зайти и прописать персональный план, хоть вручную, хоть через конструктор.
Парсер построен на якорях.
Это зарезервированные слова в первом столбце. Ищем "День 1", "День 2" и так далее, ниже начинаются упражнения.
- Ищем "План Питания", ниже раскладка по приёмам пищи.
- Ищем "ккал" и "Белки", это строка с целевыми показателями.
- Ищем "UPDATE_PROFILE", это маркер для пересчёта достижений. Тренер может вставлять комментарии, добавлять дополнительные столбцы, менять оформление, лишь бы якоря остались на своих местах.
Сложности, с которыми столкнулись
Рейт-лимиты. Google Sheets API режет по запросам в минуту. Пришлось буферизовать чтения, делать пакетные обновления через batchUpdate, кешировать справочные вкладки в памяти FastAPI.
Конкурентная запись. Если клиент и тренер одновременно правят одну строку, побеждает последний. Мы обошли это разделением столбцов. Клиент пишет в колонку "факт", тренер в колонку "план".
Безопасность. Админка тренера сейчас закрыта паролем в MVP-формате. Для продакшена готовим авторизацию через Telegram initData с проверкой подписи HMAC на бэкенде.
Распознавание еды. Gemini иногда ошибается в граммовках.
Решение: всегда показываем распознанные значения клиенту до сохранения, он правит.
Точность по калориям держится в пределах 15%, для дневника питания этого хватает.
Кириллические имена файлов и вкладок.
На Windows у разработчиков и Linux в деплое Unicode вёл себя по-разному.
Решилось переводом всех внутренних ключей в транслит.
Защита от двойных нажатий.
Первые тестировщики ухитрялись нажимать "сохранить" два раза, улетали дубли логов.
Ввели loading-state на всех сабмит-кнопках с блокировкой повторного клика.
Инструкция для тренера
Отдельно мы собрали документ с правилами для тренера. Там написано, какие фразы в таблице трогать нельзя (те самые якоря), как добавить нового клиента, как выставить веса и приёмы пищи, как работает система достижений.
Инструкция короткая, 70 строк, осваивается за 15 минут.
Технические схемы со всеми потоками данных, структурой вкладки и картой экранов вынесены в отдельный документ рядом со статьёй, чтобы основной текст остался читаемым.
Куда движемся дальше
Google Таблицы остаются для тренеров, которым так удобно. Параллельно поднимается слой с PostgreSQL, где живёт история замеров клиента, метрики прогресса, логи тренировок в нормализованном виде.
На этом слое включается AI-коуч: читает историю клиента, предлагает корректировки плана, подсказывает упражнения при травмах, собирает недельные отчёты. Тренер получает сводку по всем клиентам одним экраном, без ручного перебора вкладок.
Вот вопрос удобно ли было бы спрашивать голосом - что у меня там сегодня - а вам в чате выдает программу?
от вашего тренера?
или все такие все - по меню - через кнопки?
Упаковка в нативное приложение. Сейчас Fitbot живёт в Telegram. Следующий шаг, обёртка через Capacitor или перенос на React Native, чтобы клиент мог установить приложение из App Store и Google Play под брендом тренера или студии.
White label. Берём приложение, меняем логотип, цвета темы (Minimal или Neon под настроение заказчика), название бота, привязываем к Google Таблице конкретного тренера или фитнес-клуба. Получаем готовый продукт под бренд заказчика за пару дней.
Сайт: geronlabs.ru (Доступна в РФ),
geronlabs.xyz (международная версия).
Telegram: @geronlabs_serg.
Примечание от автора
Я вижу, что мы движемся к конкретики -
ДЕНЬ 1 - Такие упражнения - Косяк - корректировка тренера онлайн - похвала - контроль - результат!
Мы за общение - ИИ и технологиям дайм автоматизацию - а наставничество оставляем профессионалам.