Маркетинговая кампания Little Dragon на базе Twilio

Этот блог был первоначально опубликован на моем SVBTLE 14 февраля 2014 года. Моим следующим крупным проектом будет проект, работающий на Twilio, поэтому я подумал, что стоит переиздать его на Medium. Здесь стоит отметить, что с 2014 года Twilio добилась значительных успехов в обработке большей части этой функциональности в своей экосистеме. Я бы внимательно посмотрел на их текущие предложения продуктов, потому что некоторые из моих решений ниже могут быть немного устаревшими. Наслаждаться!

В течение многих лет артисты использовали Интернет как канал общения со своими поклонниками. Мы рассылаем информационные бюллетени по электронной почте и информируем наших поклонников о каждом нашем шаге в Twitter и Facebook. Мы проводим прямые трансляции концертов, публикуем видеоролики, адресованные фанатам, и пытаемся персонализировать эти впечатления, используя методы геолокационного маркетинга. Однако мы боремся с шумом сети и тусклостью отношений один ко многим.

Наши отношения с фанатами в реальном мире похожи. Когда группа только начинает свою деятельность, они, вероятно, знают всех своих поклонников по имени, потому что они друзья и семья. По мере роста группы они теряют этот личный контакт и начинают продвигать себя по принципу «один ко многим». Это очевидно на живом шоу, на котором группа выступает для небольшой группы фанатов, но даже здесь вы увидите, как артист пытается персонализировать опыт, ссылаясь на название города, в котором он находится. Идея состоит в том, что это персонализированное сообщение добавит еще один уровень ценности во временные отношения шоу.

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

Или нет?

У меня была теория.

Можем ли мы преодолеть безличный барьер Интернета, интегрировав телефонию? Мобильный телефон стал нашим личным продолжением. Мы берем его с собой, настраиваем в соответствии с нашими потребностями и на самом деле слушаем, когда кто-то говорит с нами по этому поводу. Так почему бы художнику не позвонить всем?

Чтобы добиться такого масштаба, требуется немного технологий, много дыма и зеркал, но все начинается с группы и их содержания. Для меня этой группой была Little Dragon, а контентом был их потрясающий новый сингл Klapp Klapp с их грядущего релиза Nabuma Rubberband.

Контент

Подписав предложение, Little Dragon установил штатив в своей домашней студии и записал четыре очень личных сцены. Юкими мила, Эрик выглядит нервным, Хакан был забавным, а Фредди кровоточил, готовя финальную сцену. Они прислали мне их без обрезков, в том числе умирали от смеха в конце каждого выстрела. Вы могли сказать, что им это нравилось.

Я не думаю, что когда-либо так сильно раскачивал Adobe Creative Cloud, как в этом проекте. Я редактировал каждую сцену и извлекал звук звонка с помощью Premiere. Затем этот звук был очищен в Audition, чтобы добиться максимального качества, необходимого для воспроизведения разговора. After Effects использовался для добавления официального видео клипа на классную доску телевизора в сцене с Эриком с использованием маски. Photoshop и Illustrator постоянно работали над дизайном сайтов и логотипов.

Когда весь контент был подготовлен, мы были готовы к программированию. В конечном итоге я получил много понимания, полученного в результате недавних взломов телефонии с Queens of the Stone Age и Trivium. Главный ключ в том, что это будет синергия между Twilio и Pusher.

Звонок

Юкими выходит на сцену через автозапуск HTML5 video и садится читать книгу. По достижении определенного currentTime видео приостанавливается, и пользователю предлагается ввести свой номер телефона.

if video.currentTime >= 17.00
  video.pause()
  showIntro()

Как только пользователь отправляет свой номер телефона, он отправляется на сервер для обработки с помощью превосходной библиотеки Phone Lib, основанной на библиотеке обработки телефонных номеров Google.

p = Phonelib.parse(number)
if p.valid? 
  p.sanitized
else
  status 404
end

Если он действителен, клиент получает очищенный номер телефона, который хранится локально с использованием store.js для использования в дальнейшем.

store.set('number', number)

Затем сцена продолжает воспроизводиться до тех пор, пока не будет достигнут другой currentTime (после того, как Юкими наберет ваш номер). Мы снова сделаем паузу и отправим запрос вызова на наш сервер с помощью Ajax.

else if video.currentTime >= 50.10
  video.pause()
  callUser()

Отсюда сервер снова использует гем Phone Lib, чтобы направить ваш звонок на соответствующий международный номер телефона, расшифровывая, с какой страной связан ваш номер, и ссылаясь на 19 номеров, которые мы приобрели на Twilio. Мы сделали это не только для того, чтобы снизить наши телефонные счета, но и для того, чтобы максимально увеличить вероятность того, что кто-то ответит, поскольку пользователи с большей вероятностью ответят на местный звонок, чем на международный.

to   = Phonelib.parse(number)
from = Numbers.detect { |n| n[:country] == p.country }

Затем мы используем рубиновый камень Twilio, чтобы инициировать звонок между Маленьким Драконом и нашим пользователем.

call = twilio.account.calls.create(
  from: from, 
  to: to, 
  url: "/call/yukimi", 
  if_machine: 'Hangup'
)

Этот вызов направляется на другой путь на нашем сервере, который просто воспроизводит соответствующий аудиофайл для каждой из наших сцен.

Twilio::TwiML::Response.new do |r| r.Play "/sounds/yukimi.wav" end

Синхронизация

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

Pusher['klappklapp'].trigger('calls', {
  number: params["Called"], 
  epoch: (Time.now.to_f * 1000).to_i
})

Клиент получает это событие менее чем за 5 мсек и сравнивает его с локально сохраненным числом. Если они совпадают, воспроизведение видео снова начинается. Хотя я не добавил его в окончательную версию, я все же поработал, сравнив эпоху сервера и клиента, чтобы оценить задержку и соответствующим образом скорректировать currentTime видео.

channel.bind 'calls', (data) -> 
  if data.number is store.get('number')
    # now = new Date().getTime() 
    # lag = (now - data.epoch) / 1000 
    # video.currentTime = video.currentTime + lag video.play()

Синхронизация вызова и клиента никогда не будет идеальной с учетом всех факторов, таких как подключение к Интернету и прием сотовой связи, но она становится шокирующе близкой и является свидетельством скорости этих облачных сервисов.

Прием

Всего за пять дней Little Dragon совершил более 19 000 звонков в более чем 20 стран мира. И все это время в разгаре одного из самых оживленных пресс-мероприятий в их карьере. ;-) По мере того, как кампания набирает обороты, начали поступать сообщения как из музыкальных изданий, таких как Rolling Stone, так и из технических редакций, таких как Wired.

Увеличили ли мы близость? Думаю, это вам решать. Однако, если по какой-то причине пользователь добрался до конца опыта, я не сомневаюсь, что он оставил поклонника.