MVP маркетплейса в «Google Таблицах»

В статье я расскажу, как можно за час-другой склепать MVP маркетплейса курьеров. Этот прототип подойдёт для службы заказа такси, услуг и прочего. Разумеется, на этой же основе можно сделать много других полезных вещей.

Итак, краткий флоу системы:

  • Курьеры регистрируются на сервисе.
  • Пользователь составляет заказ.
  • Полученный заказ автоматически распределяем на подходящего курьера.
  • Уведомляем курьера о новом заказе.
  • Грабим караваны.
  • Ну и, конечно, хотим завести все это без разработки.

Прием заказов и регистрация курьеров

Приступим. Регистрацию курьеров и прием заказов будем делать на Google-формах. Можно использовать любой другой инструмент, который собирает данные в Google-таблицу. Например, можно сделать лендинг на Tilda и собирать данные через него.

Создать форму: Google Drive → New → More → Forms. Для курьера достаточно ФИО и почты, на которую будут приходить уведомления о новых заказах. Для заказа — сути задачи.

MVP маркетплейса в «Google Таблицах»
MVP маркетплейса в «Google Таблицах»

Чтобы привязать форму к таблице, перейдите во вкладку «Responses» и нажмите на иконку «Google Таблиц». Привяжем обе формы к общей Google-таблице. Пример.

Распределение заказов

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

Не получится нормально использовать формулы на странице с ответами на форму: когда «Google Формы» добавят строку, формулы с этой строки сотрутся. Но есть лайфхак.

Лайфхак: если данные скопировать на отдельный лист формулой "=ARRAYFORMULA('Заказы'!A2:C)", к этим данным формулы будут применяться нормально.

Поэтому делаем отдельную страницу, в первую ячейку вписываем формулу для копирования всех результатов:

​Остальные ячейки на этой странице пустые — они заполняются из выделенной ячейки при помощи ARRAYFORMULA<br />
​Остальные ячейки на этой странице пустые — они заполняются из выделенной ячейки при помощи ARRAYFORMULA

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

Отдельная проблема: список курьеров — это список, так просто его в одну ячейку не сохранить. Но есть лайфхак.

Лайфхак: сохранить список в ячейку можно, если сделать его строкой. Функция JOIN(",",{1,2,3}) превратит список в строку "1,2,3", а SPLIT("1,2,3", ",") превратит обратно в список.

​Формула занятых курьеров. Вася и Дима получили заказы меньше часа назад, а Миша — больше часа. Поэтому заняты только Вася и Дима<br />
​Формула занятых курьеров. Вася и Дима получили заказы меньше часа назад, а Миша — больше часа. Поэтому заняты только Вася и Дима

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

Формула свободных курьеров. Она значит: возьми из всех курьеров тех, у кого непустое имя, кто зарегистрировался до этого заказа и кого нет в списке занятых курьеров<br />
Формула свободных курьеров. Она значит: возьми из всех курьеров тех, у кого непустое имя, кто зарегистрировался до этого заказа и кого нет в списке занятых курьеров

Из свободных берем первого попавшегося.

​Я добавил еще один заказ, чтобы был выбор из двух курьеров<br />
​Я добавил еще один заказ, чтобы был выбор из двух курьеров

Конечно, нужно скопировать формулы до конца таблицы.

Почему нельзя так просто избавиться от этих списков

Нюанс в том, что формулы не сохраняют состояние — им всегда нужны исходные данные, на которых они считались. Если исходные данные со временем изменятся, то и формулы, которые использовали их, изменятся.

То, что хоть раз попало в расчет, не должно изменяться, иначе разъедется вся история.

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

Уведомления курьерам о новых заданиях

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

Отправлять сообщения будем с Gmail, а интеграцию сделаем при помощи Zapier.

Логинимся в Zapier, создаем новый zap. Указываем триггер — обновление Google-таблицы.

MVP маркетплейса в «Google Таблицах»

Указываем таблицу, страницу распределения заказов и колонку имен курьеров. Когда обновим курьера, будет срабатывать триггер.

MVP маркетплейса в «Google Таблицах»

В действии выбираем Gmail → Send Email.

MVP маркетплейса в «Google Таблицах»

Теперь заполним шаблон письма. Для этого нужен адрес получателя. Прокинем его в таблицу распределения заказов при помощи index-match.

MVP маркетплейса в «Google Таблицах»

Теперь в Zapier выберем это поле как адресата.

MVP маркетплейса в «Google Таблицах»

И сделаем шаблон письма.

MVP маркетплейса в «Google Таблицах»

Отлично. При попытке тестирования оно выдаст ошибку. Это связано с тем, что Zapier почему-то использует пустую строку из таблицы. Этап тестирования можно пропустить.

После скипа тестирования включим Zap.

Пробуем

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

MVP маркетплейса в «Google Таблицах»

Улучшения

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

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

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

Можно приделать SMS-уведомления заказчику, динамическое ценообразование, что угодно еще.

Получается довольно гибкая штука, адаптируйте под что угодно.

Стартуйте и растите быстро.

53
25 комментариев

Комментарий недоступен

8
Ответить

И потом осознать что проебал год своей жизни на api, приложухи для декстопа и мобайла, разворачивание собственных инстансов osrm/osm/graphhopper, настройку всего этого говна в k8s с ci/cd. А сосед тем временем продал свой стартап амазону и уехал на кипр, а также красавица жена чудесным образом исчезла, и вот хз, связаны ли две эти вещи или нет.

34
Ответить

А вот и нет. Благодаря автору этот шаблон под свой бизнес можно немного подпилить. Очень интересное решение

3
Ответить

Мне вот тоже такая штука нужна была, но я дальше API не прошел))) Что по приложениям посоветуете, я пока пытаюсь освоить RN

1
Ответить
15
Ответить

Я считаю, это искусство и шедевр! Браво!

8
Ответить

Хуяк-хуяк и в продакшн 👍🏻😂

8
Ответить