Руководство по триггерам

В мире стартапов с открытыми исходными кодами и разработкой полного стека (типа Django, Rails, Javascript, PHP, MySQL, Postgres…) очень популярны ORM, а средства типа триггеров SQL не так востребованы.

Но все же триггеры SQL сохраняют свое значение. Когда я работал над нестандартной ERP-системой, триггеры оказались неоценимым инструментом. При построении сильно ориентированного на данные ПО, особенно с данными в финансовой сфере, где точность является главным требованием, вы с большей вероятностью увидите, что данные обрабатываются непосредственно на более низком уровне.

В этой статье я поделюсь информацией о том, как эффективно использовать триггеры SQL.

Содержание

  1. Что такое триггер?
  2. Как создать триггер SQL — синтаксис PostgreSQL
  3. Пример триггера в PostgreSQL #1: создание таймера
  4. Пример триггера в PostgreSQL #2: создание таблицы аудита
  5. Дополнительные соображения о триггерах

Что такое триггер?

Триггеры SQL, также называемые триггерами баз данных, позволяют вам сказать движку SQL (например PostgreSQL) выполнить часть кода при наступлении некоторого события, или даже перед наступлением события.

В PostgreSQL вы описываете исполняемый код посредством создания функции, которая возвращает значение типа trigger. В некоторых других движках, например, MySQL блок кода является частью триггера, и находится внутри него.

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

Преимущества использования триггеров SQL

Поддержание целостности данных

Триггеры баз данных могут найти множество применений и являются прекрасным инструментом для обеспечения строгой целостности данных. Альтернативные решения типа хуков модели Django могут сбоить, если вы имеете другие серверы приложений или пользователей с доступом к базе данных, которые не знают конкретной бизнес-логики, закодированной в вашем приложении.

Разделение бизнес-логики

Размещение критичной бизнес-логики в коде приложения также представляет проблему, когда бизнес-логика обновляется. Если вашим бизнес-требованием являлось умножение входящих номеров на 10, а теперь вы захотели умножать это число на 20, изменение логики в SQL гарантировало бы, что каждые данные, начиная точно с момента развертывания, будут обрабатываться новой логикой.

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

Атомарные транзакции

Естественная атомарность является еще одной желательной особенностью, присущей триггерам. Поскольку событие и триггерная функция являются частью одной атомарной транзакции, вы знаете с абсолютной определенностью, что триггер сработает, если возникнет событие. Они как единое целое в идеальном браке SQL.

Как создать триггер SQL: синтаксис PostgreSQL

Вот составляющие создания триггера для вашей базы данных:

  1. Тип события триггера
  2. До или после события
  3. Воздействие триггера

Типы событий триггера

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

Триггер базы данных допускает также перечисление более одного из этих событий.

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

Триггер BEFORE (до) или AFTER (после)

Триггер может выполняться либо до, либо после события.

Если вы хотите заблокировать событие типа INSERT, вы захотите выполнять действие до (BEFORE). Если вы хотите быть уверенным, что событие действительно произойдет, идеальный вариант — после (AFTER).

Воздействие триггера

Триггер может выполняться либо на строку, либо на оператор. Скажем, вы выполняете один оператор UPDATE, который изменяет 5 строк в таблице.

Если вы укажете в триггере FOR EACH ROW, тогда триггер выполнится 5 раз. Если вы укажете FOR EACH STATEMENT, тогда он выполнится только раз.

И, конечно, мы не можем забыть о фактическом коде, который выполняется при срабатывании триггера. В PostgreSQL он помещается в функцию и отделен от триггера. Разделение триггера и кода, который он выполняет, создает более чистый код и позволяет нескольким триггерам выполнять один и тот же код.

Пример триггера #1: создание таймера

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

Настройка схемы базы данных

Структура схемы предполагает каждый вход и выход отдельными событиями. Каждое событие — это строка в таблице time_punch. Как альтернативу вы можете также сделать каждую «рабочую смену» сотрудника событием и хранить время как входа, так и выхода в одной строке.

В следующей статье я глубже погружусь в разработку схемы базы данных.

Для нашего примера я уже разработал схему таблиц. Нижеприведенный код создает таблицы employee и time_punch и вставляет некоторые данные по времени прохода для нового сотрудника Bear.

create table employee ( id serial primary key, username varchar );
create table time_punch (
id serial primary key,
employee_id int not null references employee(id),
is_out_punch boolean not null default false,
punch_time timestamp not null default now()
);
insert into employee (username) values ('Bear');
insert into time_punch (employee_id, is_out_punch, punch_time)
values
(1, false, '2020-01-01 10:00:00'),
(1, true, '2020-01-01 11:30:00');

Bear зашел в 10:00 и вышел в 11:30 (длинный рабочий день). Давайте напишем запрос SQL для вычисления рабочего времени Bear.

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

Использование SQL для вычисления рабочего времени

Решение, которое я предлагаю, ищет на каждый «выход» соответствующий ему «вход».

select tp1.punch_time - tp2.punch_time as time_worked
from time_punch tp1
join time_punch tp2
on tp2.id = (
select tps.id
from time_punch tps
where tps.id < tp1.id
and tps.employee_id = tp1.employee_id
and not tps.is_out_punch
order by tps.id desc limit 1
)
where tp1.employee_id = 1 and tp1.is_out_punch;

time_worked
2
-------------
3
01:30:00 (1 row)

В этом запросе я выбираю все выходы, затем я соединяю их с наиболее близким «входом». Беру разность временных меток и получаю количество часов, которое отработал Bear в каждой смене!

Одна из проблем в этой схеме состоит в том, что возможно вставить несколько «входов» или «выходов» подряд. С созданным запросом это приведет к неоднозначности, которая может привести к неточным расчетам и зарплате сотрудников — тбольше или меньше, чем они должны были бы получить.

Пример триггера INSERT BEFORE: сохранение целостности данных

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

Это идеальная ситуация для использования триггера баз данных!

Давайте создадим триггер для предотвращения события INSERT, которое нарушает наш шаблон. Сначала мы создадим «триггерную функцию». Эта функция есть то, что будет выполнять триггер при наступлении события.

Триггерная функция создается как обычная функция PostgreSQL за тем исключением, что возвращает триггер.

create or replace function fn_check_time_punch() returns trigger as $psql$
begin
if new.is_out_punch = (
select tps.is_out_punch
from time_punch tps
where tps.employee_id = new.employee_id
order by tps.id desc limit 1
) then
return null;
end if;
return new;
end;
$psql$ language plpgsql;

Ключевое слово new представляет значения вставляемой строки. Это также объект, который вы можете вернуть, чтобы позволить продолжиться вставке. Напротив, возвращение null остановит вставку.

Этот запрос сначала находит в time_punch предыдущее значение и гарантирует, что это значение входа/выхода не совпадает с вставляемым значением. Если значения совпадают, то триггер возвращает null, и time_punch не записывается. В противном случае, триггер возвращает new и оператор insert продолжается.

Теперь мы привяжем функцию в качестве триггера к таблице time_punch. BEFORE здесь ключевой момент. Если мы выполним этот триггер как триггер AFTER, он будет выполнен слишком поздно, чтобы остановить вставку.

create trigger check_time_punch before insert on time_punch
for each row execute procedure fn_check_time_punch();

Давайте попробуем вставить еще один «выход»:

insert into time_punch (employee_id, is_out_punch, punch_time)
values
(1, true, '2020-01-01 13:00:00');

Output: INSERT 0 0

Как можно видеть по выводу, триггер предотвратил вставку двух последовательных выходов для одного и того же сотрудника.

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

Пример триггера в PostgreSQL #2: создание таблицы аудита

Аккуратное сохранение данных о нахождении сотрудников критично для бизнеса. Данные подобного типа часто непосредственно отражаются на зарплате и, с другой стороны, на заработках компании.

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

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

Я буду использовать нашу таблицу time_punch для демонстрации создания и автоматического обновления таблицы аудита с помощью триггеров.

Создание таблицы аудита

create table time_punch_audit (
id serial primary key,
change_time timestamp not null default now(),
change_employee_id int not null references employee(id),
time_punch_id int not null references time_punch(id),
punch_time timestamp not null
);

В эту таблицу записывается:

  • Время обновления прохождения.
  • Сотрудник, который выполнил обновление.
  • ID прохода, который был изменен.
  • Время прохода до того, как было сделано обновление.

Прежде чем создавать триггер, сначала нам нужно добавить столбец change_employee_id в таблицу time_punch. Тогда триггер будет знать, какой сотрудник сделал каждое изменение в таблице time_punch.

alter table time_punch 
add column change_employee_id int null references employee(id);

(Как альтернативное решение без добавления каких-либо столбцов в time_punch, можно аннулировать права update на эту таблицу и заставить пользователей базы данных использовать пользовательскую функцию типа update_time_punch(id, change_user_id, …))

После того, как произойдет обновление таблицы time_punch, выполнится этот триггер и запишет OLD (старое) значение времени прохода в нашу таблицу аудита.

create or replace function fn_change_time_punch_audit() returns trigger as $psql$
begin
insert into time_punch_audit (change_time, change_employee_id, time_punch_id, punch_time)
values
(now(), new.change_employee_id, new.id, old.punch_time);
return new;
end;
$psql$ language plpgsql;

create trigger change_time_punch_audit after update on time_punch
for each row execute procedure fn_change_time_punch_audit();

Функция NOW() возвращает текущую дату и время с точки зрения сервера SQL. Если бы это было привязано к настоящему приложению, вы, вероятно, захотели бы передавать точное время, когда пользователь фактически сделал запрос, чтобы избежать расхождения из-за задержки.

Для триггера на обновление объект NEW представляет те значения, которые будут содержаться
в строке при успешном обновлении. Вы можете использовать триггер для «перехвата» вставки или обновления простым присвоением своих собственных значений в объект NEW. Объект OLD содержит значения строки до обновления.

Проверим, работает ли это! Я добавил второго пользователя с именем Daniel, который будет редактором времени прохода Bear.

select punch_time
from time_punch
where id=2;

punch_time
---------------------
2020-01-01 11:30:00
(1 row)

Я собираюсь выполнить дважды нижеприведенный запрос для имитации 2 редакций, которые увеличивают время на 5 минут.

update time_punch 
set punch_time = punch_time + interval '5 minute', change_employee_id = 2
where id = 2;

А вот таблица аудита, отражающая прошлые времена прохода:

Дополнительные сообщажения относительно триггеров

Вот несколько вещей, связанные с триггерами, которые следует иметь в виду:

  1. Обслуживание триггеров с течением времени.
  2. Связанная логика триггера.
  3. Опыт разработчиков.

Обслуживание триггеров с течением времени

Бизнес-логика в коде приложения документируется естественным образом, т.к. она меняется со временем, с помощью git или другой системы управления исходниками. Разработчику легко увидеть логику в базовом коде и сделать быструю журнализацию git, а также посмотреть список изменений.

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

Связанная логика триггера

Триггеры также могут запускать другие триггеры, быстро усложняя результаты казалось бы невинных INSERT или UPDATE. Этот риск также может привести к побочным эффектам кода приложения.

Опыт разработчиков

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

Изначально SQL может показаться неуклюжим и неудобным языком для изучения, поскольку многие из шаблонов, которые вы изучаете для построения запроса, «вывернуты наизнанку» по сравнению с тем, как вы извлекаете данные на процедурном языке.

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

Практическое руководство по использованию триггеров и 36 основных триггеров для мотивации аудитории в соцсетях для любых брендов во всех нишах от «Студии Чижова».

17K
показов

5.8K
открытий

В соцсетях важно мотивировать аудиторию к совершению целевого действия — это не только совершить покупку, но и, например, принять участие в опросе или конкурсе, поделиться контентом с друзьями и прочее.

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

Система триггеров — это комплекс мотивов, которые подталкивают к продажам. В этой статье мы расскажем, как правильно ее выстроить.

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

У каждого сегмента целевой аудитор

У каждого сегмента целевой аудитории свои триггеры

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

Например:

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

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

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

Также в этом случае хорошо сработают триггеры эмоций, с помощью которых мы вызываем у аудитории определенные чувства и этим мотивируем к покупке. Например, можем показать им картину будущего — какой классный вечер они проведут, если придут к нам на свидание.

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

Триггеры — это часть системного подхода и работают в связке

Система триггеров — это система мотиваций к покупке. В Студии мы анализируем аудиторию, понимаем, какие мотивации действуют на разные сегменты, и делаем выводы, какие из них использовать в контенте.

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

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

Но они не сработают в товарах премиум-сегмента, где упор идет на эксклюзивность и авторитет бренда. Согласитесь, распродажа Rolls-Royce даже звучит странно :)

Далее мы расскажем о том, какие группы триггеров существуют, и покажем примеры того, как они работают на реальных проектах.

Виды триггеров

Всего мы выделили семь групп триггеров, которые подойдут большинству бизнесов.

Далее поговорим о каждой группе подробнее.

Триггеры идентичности

Они мотивируют людей, которые являются частью какого-то общества: семьи, друзей, коллег, группы по интересам, единомышленников и так далее.

Есть несколько видов триггеров идентичности.

Разберем каждый подробнее.

Род занятий

Подписчики хорошо реагируют на предложения, сделанные персонально для них. Для этого хорошо подойдет триггер по роду деятельности.

Сюда можно отнести:

  • профессию;
  • хобби;
  • причастность к группе людей (предприниматель, студент, волонтер, донор, водитель и т. д.).

Триггеры рода занятий мы активно используем в продвижении Академии Студии Чижова.

«В Академии есть и опытные эсэмэмщики, и начинающие копирайтеры. Когда они в своей ленте видят знакомый маячок, то на подсознательном уровне понимают, что сейчас обращаются именно к ним. Получается такая персонализация, которая приятно откликается. Реакция на такие публикации будет более быстрой и теплой, чем на общие формулировки — „ничего себе, это ж для меня, это мне, обо мне“».

Кристина Желябовская, контент-менеджер Студии Чижова.

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

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

Академия Студии Чижова рассказывает о метриках, которые должен знать эсэмэмщик

Гео

Географические триггеры не всегда связаны с местом пребывания подписчика.

Это могут быть посты:

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

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

Организаторы концертов в Петербурге делятся местами для фото в городе

Мотив

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

«В публикациях и письмах Академии чаще всего мы используем триггер мотива. Это обусловлено четким позиционированием Студии.

Мы работаем на результат для наших заказчиков, знаем, как его добиться, добиваемся и учим этому в Академии. Так как это обучение от настоящих практиков (что не часто встретишь на рынке онлайн-обучения), то это именно тот крючок, который попадает в нашу аудиторию и мотивирует выбрать наши курсы».

Кристина Желябовская, контент-менеджер Студии Чижова.

Примеры мотивов:

  • необходимость заработать больше денег;
  • желание сменить профессию;
  • желание увеличить доход или повысить чек на свои услуги;
  • желание работать удаленно и уйти из офиса;
  • желание увеличить продажи бизнеса.
Блог Саши Чижова рассказывает о том, как продвигать бизнес в 2023 году

Ситуация

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

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

Ситуации могут быть абсолютно разными:

  • сосед курит в подъезде и нужно его наказать;
  • зубы болят и человек стесняется улыбки;
  • ребенок медленно читает и нужно это исправить;
  • спина болит и нужен массаж;
  • на гараж упало дерево и нужно его спилить.
Пример триггера ситуации — помогаем выбрать метод операции

Социальные триггеры

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

Желание принадлежать к социальной группе людей может заставлять аудиторию:

  • присоединяться к сообществам;
  • вступать в закрытые клубы;
  • оплачивать ежемесячный взнос за членство;
  • приобретать какие-либо товары, которые использует выбранный социум;
  • совершать покупки по рекомендации или опираясь на отзыв.

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

Комьюнити

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

Сюда можно отнести призывы подписаться на рассылку со специальными предложениями и секретными скидками только для подписавшихся. Кстати, подписка тоже может быть закрытой и платной.

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

Авторитет

Повысить ценность предложения и убедить подписчика в необходимости обратиться именно к вам может размещение:

  • рейтингов;
  • наград;
  • номинаций на награды;
  • достижений;
  • выступлений;
  • публикаций в СМИ.

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

Рассказываем в группе Студии о попадании в шорт-лист премии

Социальное одобрение

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

Из такого отзыва подписчик может закрыть для себя следующие боли:

  • качество покупки и срок использования (пользуюсь уже 2 года, все хорошо, ничего не сломалось);
  • качество продукта (еда была вкусная, даже детей было за уши не оттащить);
  • работа менеджера (менеджер подсказал, что лучше подарить жене, и помог определиться с выбором);
  • дорого (у жены уже сломался третий, а я купил подороже и ни разу не пожалел);
  • сравнение с конкурентами (покупал раньше у N, но, попробовав вашу, я теперь ваш фанат на века).
Пример подробного отзыва с закрытием возражений в группе обуви ручной работы

Забота

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

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

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

Ресторан заранее рассказывает подписчикам о сочетаемости своих блюд и вина

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

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

Инструкция по контент-маркетингу от SMM-агентства

«О том, что такой формат работает, лучше всего говорят отзывы от подписчиков и читателей: „вот так просто и рассказали всё?!“, „спасибо, что делитесь опытом“ и т. д. Именно полезные статьи, чек-листы набирают больше всего вирального охвата в Студии».

Кристина Желябовская, контент-менеджер Студии Чижова.

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

Магазин товаров для лешмейкеров упрощает выбор подписчикам и публикует топ товаров месяца

Результат

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

К этой категории триггеров можно отнести:

  • кейсы;
  • результаты в формате «до/после»;
  • истории подписчиков, добившихся успеха (прошел курс, освоил новую профессию, устроился на высокооплачиваемую работу);
  • цифры, говорящие о достижениях при использовании продукта (обучили 5500 студентов за год).

Важно: в публикациях лучше давать более четкую статистику, например наш курс прошли не 50 000 студентов, а 50 257 студентов. Округленные цифры вызывают меньше доверия.

Публикация от обучающей платформы с интервью выпускников

Косметолог показывает «до/после»

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

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

Даже если у подписчиков нет времени читать пост, — а тематика медицинская все-таки сложная, на бегу изучать не будешь, — то посмотреть визуал не проблема. При этом мы одновременно проходим все этапы воронки: показываем проблемы и решение, демонстрируем экспертность, мотивируем записаться на консультацию и формируем лояльную аудиторию».

Валентина Пригодина, контент-менеджер Студии Чижова.

Публикация бренда ручной обуви с результатом за год

Знаменитые покупатели

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

В качестве триггера можно использовать:

  • коллаборации с блогерами (создали линейку одежды совместно с …, создали набор продуктов по выбору(рекомендации) блогера и т. д.);
  • отзывы от блогера;
  • розыгрыши совместно с другой компанией/персоной;
  • освещение посещения заведения/компании известной личностью.
Коллаборация бренда обуви с художницей

Эксклюзивность

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

Рассмотрим на примере.

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

Мотивация воспользоваться и внимание к предложению — очень высокие. Степень перегретости участников — горячие.

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

Пример триггера эксклюзивности в фермерском блоге

Общий враг (или общая проблема, социальная ситуация)

Объединиться с подписчиками и начать войну с общим врагом (например, мошенниками) или объединиться для решения общей проблемы (например, загрязнение почвы, загрязнение окружающей среды) — еще один способ привлечь внимание аудитории, найти с ней больше общего, улучшить коммуникацию и повысить лояльность бренда.

Подписчики будут более активно делать выбор в пользу вашего бренда, если будут чувствовать единение, общие ценности, если им будет «откликаться».

Общий враг может оказаться и системой: помощь приютам бездомных животных, организация благотворительных акций и сборов, акции типа «Добрый кофе» и т. д.

Пример борьбы с загрязнением окружающей среды от «ВкусВилла»

Пример благотворительной акции кафе

Триггеры жадности

Перспектива получить что-то бесплатно/дешевле/дополнительно может подтолкнуть людей к покупке.

Также ради возможности что-то получить люди готовы выполнять несложные задания:

  • вступать в группы;
  • переходить по ссылкам;
  • подписываться на рассылки;
  • ставить лайки и делать репосты.

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

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

Бесплатно

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

Бесплатно можно дать:

  • первый урок на курсе обучения;
  • первый месяц подписки;
  • доставку для первого заказа.
Первый урок бесплатно от школы барабанов

Подарок

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

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

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

Установка сплит-системы в подарок от сети магазинов бытовой техники

Скидка

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

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

Важно: у любой акции должен быть четко оговорен временной промежуток, на котором она действует. Ограниченность времени действия — дополнительный триггер для подписчика. Но и слишком маленьким этот промежуток делать не стоит, клиенты могут просто не успеть воспользоваться предложением в суете бытовых дел и рабочих задач.

Скидки в онлайн-школе кулинарии

«Как правило скидки работают хорошо и мотивируют пользователя совершить покупку, но необходимо тестировать различные способы подачи скидки. По нашему опыту скидка 20% работает хуже, чем скидка 1000р, при том что 20% это как раз 1000р от стоимости продукта. Также был опыт ведения проекта с картинами на заказ и в качестве оффера использовали скидку 50% и вторая картина в подарок. Так вот второй оффер сработал значительно эффективнее»

Олег Глухов, трафик-директор студии Чижова:

Заплати потом

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

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

Рассрочка от «Эльдорадо»

Заработай

Вариант заработка для подписчика может быть разным:

  • приведи друга и оба получите бонусы;
  • пройди опрос и получи бонусы, которые можно использовать для оплаты;
  • скачай приложение;
  • зарегистрируйся в системе лояльности;
  • подпишись на рассылку;
  • напиши отзыв.
Акция «Пригласи друга» от «СберМаркета»

Триггеры доверия

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

Гарантии

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

Триггер гарантии может закрыть это возражение и побудить к покупке.

Самый действенный пример — если не понравится результат, вернем деньги.

Гарантия возврата денег от химчистки

Верность своим словам

Суть триггера — подписчик должен полностью верить вашим словам. Если вы пишете, что сейчас последний шанс купить курс по скидке и больше такого не будет, но запускаете эту же акцию через неделю — то это будет убивать репутацию и может даже вызвать внимание правоохранительных органов за нарушения в рекламе. Классический пример — постоянные «закрытия» Sunlight.

Если вы пишете, что возьмете на обучение только 10 человек, нельзя, чтобы подписчик оплатил и оказался в группе из 50. Честность и точка.

Последний день скидки от Академии Студии Чижова

«Это один из важных пунктов, который помогает нам преодолеть недоверие к онлайн-курсам, которое сейчас присутствует на рынке. Мы сказали — мы делаем. Мы долго заслуживали доверие нашей ЦА, и это намного важнее, чем сиюминутная продажа.

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

Такой лид, может, и будет стоить дороже, но окупит себя на других продуктах и в перспективе».

Кристина Желябовская, контент-менеджер Студии Чижова.

Отзывы

Для того чтобы вызвать доверие и триггер сработал, оформляйте отзывы, соблюдая хотя бы одно из условий:

  • отзыв-скриншот, где видно имя отправителя;
  • есть ссылка на страницу того, кто оставил отзыв;
  • как можно более развернутый отзыв, содержит детали и нюансы, описывает как плюсы, так и минусы использования;
  • отзыв имеет фото или видео использования товара, в идеале — с тем, кто оставил отзыв, в кадре;
  • отзыв — это репост со страницы оставившего отзыв.
Пример отзывов от обувного бренда

Закрытие возражений

В этот триггер можно отнести посты из рубрики «ответы на частые вопросы», разбор случаев и ситуаций использования и закрытие болей и сомнений клиентов перед покупкой.Важно донести мысль, что у вас есть решение проблемы клиента и вы обязательно поможете, если возникнут трудности с продуктом — будь это опоздавший курьер или решение возникшей проблемы.

Пример закрытия возражений от бренда кожаных изделий

Вредное допущение

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

Пример: 30 и 31 декабря компания активно пушит по всем соцсетям, что принимают заказы весь день 31-го числа. Но 31-го утром понимают, что не вывозят, и честно сообщают об этом клиентам. Да, безусловно, кто-то может расстроиться и высказать недовольство, что компания не сдержала обещание в комментарии, но это поможет избежать бОльшего разочарования и полного разгрома от тех, кому сорвали праздник.

Пример признания своей неправоты от доставки еды

«Использование этого триггера — важный этап прогрева и выстраивания отношений между заказчиком и исполнителем.

Его задача — транслировать мысль, что у компании нет цели „продать и забыть“ о существовании покупателя. Цель — поддерживать его на всех этапах сотрудничества и взаимодействия, от момента „знакомства-прогрева“ до „покупки-сопровождения“.

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

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

Иван Никитин, проект-менеджер Студии Чижова.

Эмоциональные триггеры

Воздействуя на положительные и отрицательные эмоции людей, можно очень ярко «откликаться» для потенциального клиента. Задев нужное, можно привлечь внимание к бренду и дать подписчику помощь в решении его проблемы.

Для эмоциональных триггеров существует только одно правило — подписчик после прочтения должен прочувствовать и пережить то, что ему пытаются донести.

Любопытство

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

Важно: не переходить грань и не делать агрессивный кликбейт, иначе можно получить противоположный результат. Люди хорошо понимают, когда ими манипулируют и создают ложную интригу, чтобы заставить их что-то прочитать или перейти по ссылке.

Триггер любопытства в посте сети магазинов техники

Триггер любопытства в соцсетях Студии Чижова

Удовольствие

Зацепить клиента заголовком или текстом можно, надавив на триггер удовольствия.

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

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

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

Страх

У каждого человека есть набор страхов, которых он всеми способами старается избегать. Если правильно в них попасть, то подписчик обратит внимание на публикацию или письмо и изучит его в поисках решения проблемы.

Триггер страха в посте сети магазинов техники

Надежда

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

Триггер надежды в посте фитнес-блога — показываем результат с отстройкой от конкурентов

Ожидание

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

Пост с предложением попасть в список предзаписи от Академии Студии Чижова

«В Академии Студии Чижова мы используем предзапись на курсы, чтобы заранее собрать базу самых „теплых“ подписчиков, а заодно оценить спрос.

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

Ирина Боревич, руководитель Академии Студии Чижова.

Интрига

Такую мотивацию дают подборки и топы с прогнозами:

  • что будет популярно в наступившем/следующем году;
  • прогнозы о том, как изменятся цены компании в наступившем году;
  • какие нововведения планируются или вступают в силу;
  • интерактивные и игровые механики из разряда «обувной гороскоп — рассказываем, какая из нашей обуви подходит разным знакам зодиака»;
  • анонсы объявления новостей (например, завтра покажем вам нашу новинку, над которой трудились последние месяцы).

Добавить постам интриги может публикация серии постов. В самом посте достаточно указывать часть рассказа (например, пост, часть 2) и давать ссылки или метки для перехода на предыдущие и/или следующие части.

Интрига от бизнес-коуча

Глоток будущего

Триггер похож на «Удовольствие», но тут основная цель — погрузить подписчика в картину будущего и показать ему, как может измениться его жизнь, если он купит наш товар или воспользуется услугой.

Глоток будущего от сети магазинов бытовой техники

Перенос в счастливый момент

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

Пример триггера от бара

«Этот триггер мы часто используем в проекте по продвижению фотопечати и фотокниг.

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

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

Виктория Мингинос, контент-менеджер студии Чижова:

Триггеры минимальных усилий

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

Единственный нюанс — все, что вы пишете, действительно должно быть правдой. Слегка преувеличенной, но все же правдой. В противном случае можно получить волну негатива, отписок и жалоб на подобные посты.

Быстро

Данный триггер может использоваться для услуг, которые позволяют получить результат относительно быстро. Например, курсы колористики можно пройти за 1–2 месяца, а обучение профессии парикмахера потребует несколько лет обучения. Быстро в сравнении со вторым вариантом? Вполне.

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

Пример триггера «Быстро» от курсов колористов

Легко

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

Пример триггера легкости от школы скорочтения

«Триггеры легкости хорошо работают, когда нужно замотивировать воспользоваться большой и сложной услугой. Например, выучить язык, начать разбираться в программировании, стать экспертным экспертом, сдать ЕГЭ по математике и так далее.

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

Поэтому такие услуги стараются продавать по кусочкам: как сложную задачу декомпозируют на мелкие, так и тут услугу разбивают на удобоваримые уроки, порой в игровой форме. Например, „Дуолинго“ — занимайся 15 минут в день и выучи язык. 15 минут в день психологически воспринимаются легко, человек вовлекается, прогревается и уже с большей вероятностью совершит покупку».

Сергей Насыров, контент-директор Студии Чижова.

Триггеры FOMO (упущенной выгоды)

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

У человека должна оформиться мысль — если не купить/заказать сейчас, я упущу возможность, которая может больше не повториться.

Время

Ограничение по времени заставляет решать здесь и сейчас.

Пример триггера упущенного времени от Академии Студии Чижова

Количество

Если продается штучный товар и он может в любой момент быть раскуплен — это надо обязательно упоминать в письмах и постах.

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

Пример триггера дефицита в магазине фруктов

Дефицит

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

В текстах постов и писем может не указываться количество остатка товаров или услуг, а использоваться слова «лимитированная» или «ограниченная» серия, «количество мест/товаров ограничено», и это также будет указывать на дефицит. Люди всегда стараются закупиться побольше товаром, который исчезает из продажи.

Для обозначения дефицита могут использоваться любые ограничения:

  • ограничение по цвету (например, выпустили ограниченную серию товара необычного цвета);
  • комплектация (например, ограниченная серия подарочных наборов по выгодной цене, созданных из товаров, которые обычно продаются по отдельности);
  • время (продажи открыты только конкретного числа и больше их не будет, открытие дня дополнительных продаж);
  • количество (количество товаров ограничено);
  • стоимость (только сегодня все по 9990).
Триггер дефицита в Академии Студии Чижова

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

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

Люди могут просто забыть, потерять в инфошуме, а этот триггер не только напоминает об акции, о предложении или продукте, но и цепляет возможностью сэкономить, получить выгоду».

Кристина Желябовская, контент-менеджер Студии Чижова.

Ажиотаж

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

Триггер ажиотажа в посте бренда обуви

Заключение

При использовании триггеров самое важное — выстроить четкую систему мотиваций, где каждый триггер работает в связке с другим и встроен в общую коммуникационную стратегию. Тогда они будут работать и приносить продажи.

Внедряйте или приходите в Студию Чижова — мы поможем сделать из соцсетей полноценный канал продаж с лояльной и активной аудиторией.

Больше полезного контента о продвижении в соцсетях в нашем телеграм-канале.

Инструкция по автоматизации процессов в amoCRM с помощью виджета «Триггеры»

Виджет «Триггеры» помогает автоматизировать рутинные действия в amoCRM, настраивать бизнес-процессы и связывать любые сервисы с amoCRM с использованием веб-хуков.

В данной инструкции вы научитесь:

  • Создавать сценарии автоматизации на различные события в CRM;
  • Работать с шаблонизатором переменных;
  • Связывать несколько виджетов в единую систему через Триггеры;
  • Интегрировать через Триггеры внешние сервисы и сайты с amoCRM;

Описание виджета и цены

Плейлист с примерами настроек на Youtube

Список переменных для шаблонизатора

ОБЩИЕ ПОНЯТИЯ

  • Как запускается сценарий?
  • Пример настройки сценария
  • Все сценарии по типу запуска
  • Список всех условий
  • Список всех сравнений
  • Работа с отложенные триггерами
  • Работа с глобальными переменными
  • Триггерные ссылки
  • Входящие веб хуки
  • Отладка сценариев
  • Ответы на вопросы и коды ошибок
  • Технические ограничения
  • Примеры готовых решений

БАЗОВЫЕ ТРИГГЕРЫ

  1. Создать сделку
  2. Создать контакт
  3. Создать компанию
  4. Копировать сделку
  5. Сменить значение поля
  6. Поставить задачу
  7. Добавить примечание
  8. Сменить теги
  9. Сменить статус сделки
  10. Запустить другой сценарий
  11. Запустить SalesBot (чаты с клиентами)
  12. Отправить веб-хук
  13. Подписать на сделку (на чат)
  14. Изменить задачу
  15. Изменить глобальную переменную
  16. Удалить отложенный триггер
  17. Нормализовать телефон и e-mail
  18. Добавить товары
  19. Удалить товары

ТРИГГЕРЫ С ДРУГИМИ ВИДЖЕТАМИ

  1. Отправить письмо («Почтовик»)
  2. Отправить сообщение в («Телеграм»)
  3. Отправить уведомление, запросить данные («Пушер»)
  4. Создать документ («Документы»)
  5. Отправить СМС («SMS-шлюз»)
  6. Подтянуть реквизиты («Dadata»)
  7. Добавить чек-лист («Чек-листы»)
  8. Создать платеж («Касса»)

Сценарии автоматизации

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

  • Внутри сценария есть блоки условий, а в них триггеры;
  • Если блоки условий подходят, то триггеры запускаются и выполняют нужные действия;
  • В одном сценарии можно добавлять несколько независимых блоков условий со своими действиями.

Пример работы простейшего сценария:

  1. Сценарий запускается на смену этапа сделки;
  2. Внутри есть блок условий: если, «Текущий этап сделки» = «Принято в работу» И «Бюджет» > «10000»
  3. То, сменить ответственного на «Юрия Меньшова»

На что можно запустить сценарий

  • Сделки

    • Создание сделки
    • Изменение сделки
    • Смена ответственного у сделки
    • Изменение статуса сделки
  • Контакты

    • Создание контакта
    • Изменение контакта
    • Смена ответственного у контакта
  • Компании

    • Создание компании
    • Изменение компании
    • Смена ответственного у компании
  • Задачи

    • Создание задачи
    • Изменение задачи
    • Смена ответственного у задачи
  • Примечания

    • Создание примечания на контакт
    • Создание примечания на компанию
    • Создание примечания на сделку

    Звонки, СМС, письма тоже являются примечаниями. На эти действия тоже можно выполнять триггеры.

  • При входящем сообщении

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

  • Цифровая воронка

    Можно применять все фильтры и правила цифровой воронки в совокупности с правилами в триггерах

    Запуск из SalesBot
    Можно запустить сценарий из SalesBot.

  • Ручной запуск

    • Запуск из всплывающего уведомления с запросом.
    • Запуск из карточки сделки
    • Запуск из карточки контакта
    • Запуск из карточки компании
    • Запуск из списков сделок, контактов, компаний.
  • Запуск из другого сценария

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

Интерфейс — список сценариев

  1. Сценарий можно включить и выключить. Выключенный сценарий не будет выполняться, но если есть отложенные триггеры, они будут выполнены согласно расписанию.
  2. Можно менять порядок строк перетаскиванием.
  3. При клике на Событие отобразятся последние 1000 событий, которые запускали данный сценарий.
  4. Колонка «Сработал» показывает дату и время последнего запуска. При клике на дату можно увидеть последнее действие, которое выполнил сценарий.

Как создать и настроить сценарий?

Чтобы создать новый сценарий, выберите событие, на которое он должен запускаться, например «Сделка добавлена», введите название, например «Задача на обработку» и нажмите на кнопку «Создать сценарий».

Выйдет окно создания нового сценария.

Это окно содержит

  1. Название — краткое название сценария. Кроме того данный текст будет отображаться в карточках сделки, контакта, компании для ручного запуска сценария.
  2. Описание — более подробное описание, чтобы не забыть, что выполняет данный сценарий.
  3. Блок условий — блок, разделенный на 2 части. В левой части Условия, в правой Триггеры, которые будут выполнены в том случае, если условия из левого блока будут выполнены. Можно добавить несколько блоков, и каждый из них выполнится последовательно сверху вниз. Порядок блоков можно менять перетаскиванием. Так же можно задать таймер, который отсрочит выполнение данного блока условий. У блока может быть свое название.
  4. Поле для выбора сценария, который выполнится, если не сработает ни один блок условий.
  5. Выбор тайминга выполнения — как часто можно запускать данный сценарий. Например сделка меняется каждые 10 секунд, нужно ли пересчитывать бюджет каждый раз или достаточно делать это раз в минуту. Кроме того можно задать условие, при котором сценарий для данной конкретной сущности выполнится всего 1 раз, для этого поставьте галочку «только 1 раз». Минимальный тайминг сценария для конкретной сущности 5 секунд.

Работа с блоками условий

  1. Триггеры, в блоке условий, выполняются только тогда, когда все условия в данном блоке соблюдены, иначе блок игнорируется и не выполняется.
  2. Блоки условий выполняются последовательно сверху вниз. Проверка условий в самом блоке так же происходит сверху вниз. Блоку условий можно задать небольшой тайминг выполнения, до 20 секунд, например, чтобы дождаться заполнения полей, после предыдущих действий.
  3. В блоке условий можно добавить несколько условий, по умолчанию условия проверяются по принципу «И», то есть все условия должны выполниться.
  4. Внутри условия можно выбрать разные типы данных для сравнения (дата, время, кол-во сделок, значение поля, текущий день недели и т.д.), в зависимости от выбранного типа, могут быть доступны различные типы сравнений.
  5. Блоки условий и сами условия можно перетаскивать на свое усмотрение. Выполнения и проверки идут сверху вниз.

Пример настройки
Например, нам нужно назначить ответственного за новую заявку одному из двух сотрудников. Оптовые заявки одному менеджеру, розничные другому. В названии заявки указано, это опт или розница, на нее и будем ориентироваться при задании условий. Таким образом условия задачи выглядят так:

  • Если сделка называется «Заявка с формы ОПТ», назначить ответственного за сделку Елену, поставить Елене задачу.
  • Если сделка называется «Заявка с формы РОЗНИЦА», назначить ответственного Анну, поставить Анне задачу.

Добавляем условия:

  1. Кликните на строку условия «Не настроено», или добавьте новое условие, если такой строки нет.
  2. Здесь мы видим три поля. Сверху и снизу — это поля для сравнения их между собой, среднее — это оператор сравнения. Сравнивать можно что угодно с чем угодно, в том числе значения из связанных сущностей (например, поле сделки можно сравнить с полем связанной компании), даты, системные поля и т.д., весь список значений и операторов приведен ниже.
  3. В данном случае мы сравниваем название сделки с текстовым значением заданным в ручную — «Заявка с формы ОПТ», если название удовлтеворяет этому значению, то выполнятся триггеры в этом блоке. Таким образом наше условие выглядит так: Название>Сделки > «Равно» > Текстовое значение> «Заявка с формы ОПТ». Смотрите скрин.
  4. Сохраните условие.

5. В результате блок условий выглядит следующий образом

При необходимости можно добавить еще условия, например если сейчас не выходной, если у сделки бюджет не меньше 1000 рублей и т.д. Условия можно комбинировать между собой по типу «И» (все условия должны быть выполнены) и «ИЛИ» (хотя бы одно условие должно быть выполнено).

Добавим еще несколько условий и зададим название этому блоку «Если ОПТ». Название поможет в будущем нам отслеживать, какие блоки запускаются, какие нет, это нужно при отладке.

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

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

Добавляем Триггеры
По условиям задачи нам нужно назначить Елену ответственной за сделку. Для этого выберем триггер «Сменить ответственного» и настроим его.

  • Название — можно оставить пустым.
  • Применить — выберите «В сделке» или оставьте по умолчанию, так как данный сценарий запускается из сделки, сущность по умолчанию будет сделкой.
  • Таймер — можно отсрочить запуск данного действия, но в данном случае этого не требуется, оставим «Без таймера».
  • Параметры > Новый ответственный — здесь нужно выбрать сотрудника, на которого будет переведена сделка.
  • Сменить в связанных сущностях — можно сменить ответственного в том числе в Компании, в Контактах и в задачах.

Сохраним параметры триггеров.

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

  • Добавим условие на другой текст названия заявки, остальные условия такие же.
  • Ответственного назначим Анну

Итоговый сценарий с двумя блоками условий выглядит так.

Как видим, создалась сделка контакт и компания. Затем Триггеры сменили ответственного за сделку на Елену, так же сменился ответственный за Контакт и Компанию

Результат работы триггеров можно увидеть подробно, если нажать на Детали в списке сработавших сценариев

Результат сравнения условий так же можно увидеть в списке событий.

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

Таким образом вы можете создавать бесконечное множество сценариев автоматизации в зависимости от задач в ваших бизнес-процессах.

Список всех условий и как они работают

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

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

Список всех сравниваемых значений

Можно сравнивать практически все данные из CRM в том числе из связанных сущностей. В настройках сравнения и в нижем и в верхнем поле одинаковые данные, от их перестановки результат не меняется.
Например, вы можете сравнить «Название сделки» с «Текстовым значением»

ТРИГГЕРЫ

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

  • Список триггеров может меняться, в зависимости от сценария, в котором он выполняется. Если какого то триггера вы не видите, значит его нельзя запустить в этом сценарии. Например, нельзя создать сделку при создании сделки.
  • У каждого триггера, в зависимости от типа, есть свои условия.
  • По умолчанию триггер запускается сразу (а точнее, встает в очередь на выполенение), но выполнение можно отложить по таймеру или выполнить его в конкретную дату и время которое записано в поле.

1. Создать сделку

Триггер автоматически создает сделку в amoCRM.
Параметры:

  • Название сделки — задает заголовок сделки. Текст, числа или переменные.
  • Теги — задает теги сделке, можно подставить переменные
  • Ответственный — можно назначить ответственного вручную, или автоматически.
  • Воронка — задает воронку, в которой будет создана сделка
  • Статус — этап сделки на котором создастся сделка.
  • Так же, при создании новой сделки в компании, можно прикрепить к ней существующие контакты компании.

Пример: при завершении сделки, сразу создать еще одну.

2. Создать контакт

Триггер автоматически создает Контакт в amoCRM.
Параметры:

  • Применить — можно выбрать к какой сущности прикрепить контакт, к сделке или к компании. Нельзя прикрепить контакт к контакту.
  • Название контакта — Имя нового контакта. Текст, числа или переменные.
  • Теги — задает теги сделке, можно подставить переменные
  • Ответственный — можно назначить ответственного вручную, или автоматически.
  • Таймер запуска — позволяет отложить действие. Подробнее про отложенные триггеры.

3. Создать компанию

Триггер автоматически создает Компанию в amoCRM.
Параметры:

  • Применить — можно выбрать к какой сущности прикрепить компанию, к сделке или к контакту. Нельзя прикрепить компанию к компании.
  • Название — название создаваемой компании. Текст, числа или переменные.
  • Теги — задает теги сделке, можно подставить переменные
  • Ответственный — можно назначить ответственного вручную, или автоматически.

Пример: при создании сделки, сразу создать компанию.

4. Копировать сделку

Копирует существующую сделку в новую со всеми заполненными полями.
Параметры:

  • Название сделки — по умолчанию будет «Название старой сделки (копия)». Текст, числа или переменные.
  • Теги — Текст, числа или переменные.
  • Ответственный
  • Воронка, Статус
  • Применить — Данный можно можно применить только к Сделке

5. Сменить значение поля

Меняет значения полей Сделки, Контакта и Компании. Для каждой сущности свой триггер смены значения. Параметры:

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

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

В одном триггере можно сменить значения сразу нескольких полей.

  • Чтобы записать значение из другой сущности, используйте переменные, например {{contact.cf(123456)}} — значение поля контакта с ID 123456
  • Чтобы задать значения списков и мультисписков, введите через запятую точные значения из этих списков.
  • Чтобы очистить все значения списков напишите {reset}.
  • Чтобы включить или выключить флажки и переключатели, введите 0 или 1
  • Чтобы сделать калькуляцию полей используйте переменные, например: {{ (поле1+поле2):calc }}
  • Список системных переменных (текущая дата, время, длительность входящего звонка, текст примечания, текст входящего письма, количество сделок компании и тд.) смотрите тут.

Примеры: при успешном завершении сделки, бюджет сделки добавить к полю компании; при входящем звонке, сохранить длительность разговора в секундах в поле Контакта.
Так же задавать значения полям можно в ручном режиме, например выделить 500 сделок и всем задать бюджет. Для этого предварительно нужно создать сценарий с типом «Свой сценарий», задать в нем условия (при необходимости) и триггер, который меняет значение нужного поля. Затем выделить сделки и применить к ним данный сценарий.

6. Поставить задачу

Добавляет новую задачу для сотрудника.
К задаче можно добавить результат выполнения. В этом случае задачу нельзя закрыть без выбора результата, а после закрытия задачи с результатом автоматически запустится следующий сценарий.
Параметры:

  • Применить — можно выбрать сущность к которой добавится задача. Например сценарий запускается на создание Сделки, а задачу можно добавить к Компании этой сделки.
  • Таймер — выбрать таймер для запуска.
  • Ответственный — выбрать ответственного за задачу. По умолчанию ответственным является ответственный за сущность.
  • Тип задачи — можно выбрать из типов, которые есть в amoCRM
  • Срок выполнения — выбрать время, за которое нужно закрыть задачу, например 1 час.
  • Текст задачи — текст задачи. Можно использовать любой текст, числа или переменные.
  • Результат по задаче — можно добавить выбор результата при закрытии, в зависимости от выбранного пункта можно запускать следующий сценарий. Если добавлен хотя бы один результат, то задачу нельзя будет закрыть без выбора результата. Сценарии, запускаемые из задачи, должны быть созданы заранее.

Видео https://www.youtube.com/watch?v=e0hjW0rQaOg

7. Добавить примечание

Добавляет новое примечание в ленту.
Параметры:

  • Текст примечания -текст, который будет добавлен в ленту. Можно использовать переменные. Например: Сделка на {{lead.sale}} успешно завершена!
    Поздравляем тебя, {{client.responsible.name}}!
  • Применить — Данный триггер можно применить к Сделке, Контакту, Компании.

Так же можно добавить системное примечание. Системное примечание отображается мелким шрифтом без рамочки.

8. Сменить теги

Позволяет добавить или убрать тег у Сделки, Контакта, Компании.
Параметры:

  • Применить — можно выбрать сущность у которого необходимо сменить тег. Данный можно применить к Сделке, Контакту, Компании.
  • Таймер — выбрать таймер для запуска.
  • Добавить теги / Удалить теги — можно добавлять тег или несколько через запятую. Чтобы убрать тег нужно знать его название, так же можно указать несколько через запятую. Чтобы удалить все теги оставьте поле «Значения тегов» пустым.

9. Сменить статус сделки

Меняет этап сделки в воронке, в том числе можно сменить саму воронку.
Параметры:

  • Воронка — выбрать воронку
  • Статус — выбрать статус в который нужно перенести Сделку.

Данный триггер можно применить только к Сделке.

10. Выполнить другой сценарий

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

Данным триггером можно запускать только ручные сценарии (тип сценария при создании — «Свой сценарий»)

Пример: при закрытии сделки, через неделю нужно создать еще одну сделку, но, при условии, что на тот момент не будет активных сделок по клиенту.
Данную автоматизацию можно реализовать, через запуск ручного сценария. При закрытии сделки, ставится отложенный на неделю запуск ручного сценария, который, через 7 дней, посмотрит нет ли других активных сделок и создаст новую при их отсутствии.

Параметры триггера:

  • Применить — можно выбрать применительно к чему запустить сценарий. Например задать теги можно для сделки, контакта, компании, а сменить статус, только у сделки. Учитывайте это при настройке ручных сценариев.
  • Таймер — можно отложить запуск сценарий.
  • Сценарий — собственно сам сценарий, который предварительно должен быть создан.

11. Запустить Sales бота

Автоматически запускает настроенного Salesbot в amoCRM.
Параметры:

  • БОТ — можно выбрать из списка созданных ботов.
  • Таймер — настроить отложенное действие.

Например вам нужно оповестить клиента через тот же канал, из которого он обращался (например WhatsApp). Для этого предварительно создайте сейлз-бота, в котором происходит отправка сообщения. Затем запускаете его на любом этапе сделки или по какому то действию в системе, например когда наступила дата рождения клиента и т.д.

12. Отправить веб-хук (web hook)

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

  • URL — адрес, куда нужно отправить запрос.
  • Заголовоки — можно добавлять свои заголовки (headers) в запрос.
  • Тело запроса — добавьте нужные переменные и их значения.

Запрос всегда содержит: id сущности amoCRM, тип сущности, id сценария, id группы сработавших условий. В полях можно использовать переменные и шаблонизатор.

Запустить сценарий при получении ответа
Триггер может слушать ответ и, при его получении, запустить сценарий, передав в него все переменные, которые пришли в ответе. Ответ слушается максимум 5 секунд.
Переменные приходят в формате {var}, или {parrent_child1_child2…}, до 10 вложений. Все тело ответа содержится в переменной {webhook_data}, например его можно вывести в примечание, чтобы увидеть все данные. Переменные можно использовать, чтобы заполнить поля или в условиях блоков условий, система работы такая же как с входящими хуками.

13. Отправить письмо через виджет «Почтовик»

Отправляет e-mail с отслеживанием открытия письма и кликов по ссылкам. Шаблон должен быть создан в виджете «Почтовик» и сам виджет должен быть установлен.
Параметры:

  • Отправитель — от чьего имени отправляется письмо
  • Получатель (по сделке) — если письмо отправляется из Сделки, можно выбрать получателя в ручную, например только основной контакт. Иначе получатель ставится автоматически из компании и контакта.
  • Шаблон письма — заранее созданный шаблон письма с текстом, картинками, переменными, которое отправится клиенту.

В шаблоне письма могу быть свои триггеры автоматизации, например при открытии письма или при кликах по ссылкам, они так же сработают.

14. Отправить сообщение в Телеграм

Отправляет сообщение в мессенджер Telegram в общую группу или в личку (не клиенту!). Данный функционал работает через виджет «Уведомления в Телеграм». Виджет должен быть установлен и настроен. Параметры:

  • Чат — чат или личка, куда нужно отправить сообщение.
  • Текст, числа, эмоджи или переменные. Так же можно формировать ссылки через HTML теги и форматировать текст определенным образом.

Примеры:
<b>жирный</b>
<i>курсив</i>
<u>подчеркнутый</u>
<s>зачеркнутый</s>
Ссылка <a href=»http://www.example.com/»>Подробнее</a>

Пример ссылки на сделку в amoCRM:
<a href=»https://вашдомен.amocrm.ru/leads/detail/{{lead.id}}/»>Открыть сделку</a>

Пример ссылки, по клику которого, можно запустить следующий сценарий:
<a href=»{tlink:290}»>Закрыть эту сделку</a>
Предварительно ссылку нужно создать во вкладке Ссылки, затем добавить к ней ручной сценарий, который закрывает сделку. После этого уникальную переменную ссылки {tlink:290}, можно использовать в качестве ссылки, при переходе по которой будет запускаться настроенная в ней автоматизация.
Ссылки так-же можно отправлять клиентам, они будут по ним переходить, и будут срабатывать сценарии.

Добавление кнопок вместо ссылок
Чтобы при нажатии по триггерной ссылке не происходило перехода в браузер, преобразуйте их в кнопки через маску:
Вместо: <a href =»{tlink:123}»>Создать</a>
напишите: [button url=»{tlink:123}» text=»Создать»]
При нажатии на такую кнопку браузер не откроется, но сценарий в Триггерах сработает.

Обратная связь из Телеграм в Триггеры
В Триггерах можно использовать данные пользователя, кликнувшего по ссылке. Например, настроить распределение на того, кто первый кликнул на кнопку в общем чате.
Для этого существую переменные:
{tg_user_id} — ID кликнувшего пользователя
{tg_user_name} — Имя кликнувшего пользователя
{tg_button} — Текст кнопки, по которой был клик
{tg_chat_id} — ID чата в котором был клик
{tg_chat_name} — Имя чата в котором был клик
Эти переменные можно использовать в блоках условий и в самих триггерах.

Пример такой настройки на распределение на пользователя, который первым кликнул по ссылке в общем чате:

  1. Создаем новый сценарий.
  2. Создаем блоки условий: если пользователь равно «Sergey», и статус сделки «Отправлено в распределение», то меняем ответственного на Сергея и меняем статус «Принято в работу», и так для всех пользователей. На статус нужно ориентироваться для того, чтобы повторные клики других пользователей не меняли ответственного повторно. Таким образом, кто первый нажал, тот забрал сделку и поменял Статус сделки, дальнейшие нажатия будут отфильтровываться.
  3. Создаем триггерную ссылку во вкладке «Ссылки», выбираем запускаемый сценарий, который добавили пунктом выше.
  4. Добавляем действие в цифровой воронке или сценарием через Триггеры: при переходе сделки на этап «Отправлено в распределение», отправляем в Телеграм сообщение с триггерной ссылкой и текстом. Пример — Новая сделка [button url=»{tlink:123}» text=»Принять»]. ID триггерной ссылки (123) тот, который создали в третьем пункте.
  5. Добавьте сообщение, которое приходит в чат, после принятия сделки, чтобы пользователи понимали, что сделка принята и кем. Например: Сделку забрал {tg_user_name}.

Готово!

15. Отправить СМС сообщение

Отправляет SMS на нужный номер. Это может быть номер клиента или любой произвольный номер. Для отправки используется виджет «СМС шлюз». Виджет должен быть установлен и настроен один из 8 агрегаторов , через который будут отправляться сообщения.

Параметры:

  • Отправитель — от кого отправляется сообщение.
  • Получатель — получатель сообщения. Можно выбрать: все контакты, компания, произвольный номер, номер из поля (через переменную)
  • Сообщение — текст сообщения. Текст, числа, переменные.

16. Отправить уведомление в amoCRM с запросом дальнейших действий

Отправляет оповещение пользователю через виджет «Пушер», виджет должен быть установлен в системе. Доступны: push-уведомление в браузер, звуковое уведомление и всплывающее уведомление в amoCRM.

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

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

Параметры:

  • Тип уведомления: уведомление в amoCRM, браузерный push, звук.
  • Текст заголовка и текст сообщения — текст выводимый в уведомлении, недоступно для звуковых уведомлений. Можно использовать переменные.
  • Пользователи: кому показывать уведомление. Можно показывать ответственному за сущность, всем пользователям или выбранным.
  • Добавить кнопки действий: добавляет кнопки запуска следующих сценариев. Можно указать текст кнопки, сценарий, который будет запущен. При выборе флажка справа от сценария, он будет запущен только 1 раз при первом нажатии на кнопку, при этом кнопки у других пользователей этого же уведомления станут недоступны.
  • Применить: к какой сущности применить триггер.

Особенности при настройке пушей на входящее сообщение.
Входящее сообщение всегда крепится к контакту. Поэтому, для корректной работы Пушера, в поле «Применить» всегда нужно выбирать «К контакту», только в таком случае будут работать все переменные и текст сообщения корректно придет в ПУШ.

Пример сценария на распределение:
При нажатии на кнопку в Пушере, запускается сценарий, в который добавлен триггер на смену ответственного сделки. Туда передается ID пользователя нажавшего на кнопку. Данный ID в виде переменной {user_id} нужно вставить в триггер смены ответственного. В поле «Новый ответственный» выберите «Свое значение» и вставьте текст {user_id} (скрин). Теперь, тот, кто первым нажмет на кнопку, станет ответственным за нее.

На нажатие кнопки доступны следующие переменные:
ID пользователя, который нажал на кнопку {user_id}
Имя пользователя, который нажал на кнопку {user_name}
Текст нажатой кнопки {button}

17. Сгенерировать новый документ

Создает документ через виджет «Документы». В данном триггере можно выбрать единственный параметр «Шаблон документа». Если вам нужно создать несколько документов, добавьте несколько триггеров.
При срабатывании триггера документ будет сгенерирован и появится в карточке сделки. Ссылка на документ появится в поле, которое добавлено в настройках шаблона в самом виджете Документы.

18. Подписать на сделку, отписать от сделки

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

Параметры:

  • Подписать/отписать — можно выполнить одно из данных действий.
  • Событие — Чат, в данном случае нет других параметров.
  • Пользователи — можно выбрать пользователей из списка, так же id пользователя можно вставить в специальное поле через переменную. Например id пользователя хранится в поле сделки и ставится туда виджетом «Дополнительный ответственный».

18. Изменить задачу

Триггер может изменять задачи по сущности: менять текст, открыть, закрыть, сменить ответственного и тип задачи.

Работает со ВСЕМИ или с ПОСЛЕДНЕЙ задачей определенного ТИПА. Например, при смене статуса сделки можно закрыть все задачи с определенным типом. При попытке закрыть задачу без добавления результата, можно открыть ее снова, а к тексту задачи добавить «Добавьте результат по задаче!».

Параметры:

  • Найти задачи по типу — находит все задачи по типу и выполняет нужное действие
  • Применить для — можно применить действие для всех задач с таким типом или для последней.
  • Ответственный — можно сменить ответственного.
  • Тип задачи — можно поменять тип задачи.
  • Статус задачи — можно поменять статус, например закрыть.
  • Текст задачи — можно поменять текст.

19. Отменить отложенный триггер

Триггер позволяет отменить другой триггер, который был запланирован на определенное время. Например, можно отменить отложенное уведомление клиенту, если клиент полностью отказался от услуги.
Триггер удаляет все отложенные триггеры для этой сущности в выбранном сценарии, в выбранном блоке условий и в конкретном триггере.

Более подробно по работе с отложенными триггерами.

20. Изменить значение глобальной переменной

Триггер задает значение глобальной переменной. Можно задать значение, дополнить новым значением, стереть значение (например отправив пустое значение).
Более подробно по работе с глобальными переменными.

21. Подтянуть реквизиты через виджет Dadata

Данный триггер запрашивает данные из сервиса Dadata.ru и записывает в поля используя виджет «Интеграция amoCRM и Dadata». Виджет должен быть установлен в amoCRM и настроен.

Например, при вводе ИНН, можно запустить сценарий, который автоматически, подтянет все остальные реквизиты и запишет их в поля: полное наименование компании, адрес, реквизиты, ФИО директора, уставной капитал и т.д.

Все настройки по сопоставлению полей делаются в виджете dadata, подробная инструкция. Триггеры лишь запускают инициализацию настроенного сопоставления из списка. Можно запускать сразу несколько сопоставлений в одном триггере.

Так же вы можете создать нужный сценарий и запустить его на список компаний, сделок или контактов (до 500 шт. за раз), чтобы обогатить свою базу новыми данными.

Пример 1. Автоматическое подтягивание реквизитов при создании сделки с компанией с известным ИНН.

Пример 2. Групповое обновление данных компаний, на основании одного ИНН при перемещении их сделок на определенный этап.

22. Нормализовать телефон и e-mail

Данный триггер приводит к единому виду телефоны и e-mail контакта и компании. Телефон приводит к единому виду, выбранному в настройках.
Например может нормализовать при создании сущности, при изменении или вручную при групповой операции.

Видео https://www.youtube.com/watch?v=p_yEvhS5Als

Нормализация электронной почты

  • Удаляет лишние пробелы и символы.
  • Приводит все символы к нижнему регистру

Нормализация телефона

  • Работает только с мобильными номерами из РФ.
  • Если в двух полях содержится 2 одинаковых телефона, то триггер удалит один из них.
  • Может быть запущен по полям компании или контакта (по всем телефонам или только по основному).
  • Если не удалось нормализовать (поле невозможно привести к нормальному телефону), то значение можно удалить, при этом можно исключить удаление тех номеров, в которых определенное кол-во символов, например для местных коротких номеров.

Пример настройки:

  1. Создайте сценарий на создание контакта.
  2. Добавьте триггер Нормализатор.
  3. Выберите — что нормализовать: Телефон, E-mail или оба поля.
  4. Выберите нужные настройки нормализации и сохраните.
  5. Теперь при создании нового контакта с некорректным телефоном он будет приведен к единому формату.

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

23. Создать чек-лист

Создает чек-лист к нужной сущности используя виджет «Чек-листы».
Виджет Чек-листы работает и без триггеров, но только из цифровой воронки и только со сделками. Используя Триггеры можно создавать чек-листы по более сложным сценариям и для сущности Контакт, Компания.

Настройка

  1. Добавьте новый сценарий или откройте существующий.
  2. Добавьте триггеры в разделе Виджеты — Чек-листы: создать.
  3. Выберите нужный чек-лист, который должен быть создан заранее.
  4. При необходимости выберите сущность, к которому нужно применить триггер, в этом случае чек-лист прикрепится к этой сущности.
  5. Сохраните настройки. Готово.

При нажатии на флажок на пункт чек-листа, процент выполнения можно записывать в поле сущности, задается в настройках конкретного чек-листа. Таким образом, например, можно запускать какой либо сценарий автоматически, когда чек-лист выполнен на сколько то %, опираясь на это значение в поле.

24. Добавить товары

Добавляет выбранные в триггере товары к сделке.

  1. Выберите нужный список товаров;
  2. В поле Поиск найдите и выберите нужный товар или несколько;
  3. Укажите для каждого товара количество;
  4. Укажите для каждого товара тип цены, если у вас несколько цен;
  5. Сохраните настройки. Готово.

При запуске данного триггера, виджет добавит выбранные товары в карточку сделки во вкладку Товары (название выбранного списка)

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

25. Удалить товары

Удаляет все добавленные товары в конкретном списке.
Для удаления выберите нужный список.
При срабатывании триггеры все добавленные товары из конкретного списка будут удалены. Товары в других списках останутся нетронутыми.

26. Создать новый счет в «Кассе»

Создает новый счет в виджете «КАССА»
Перед созданием счета в виджете необходимо добавить шаблон счета. Все настройки по счету задаются в шаблоне виджета Касса, а именно:

  • Эквайринг: в Юкассе, в Тинькофф, Тинькофф-бизнес, или без;
  • Товары: брать из списка товаров в сделке, добавить определенные при создании счета, взять из поля сделки;
  • Цены: тип цены;
  • Количество;
  • Скидка;
  • Комментарий к счету;
  • Тип НДС.

В триггерах выбирается только сам шаблон и сущность, к которой нужно прикрепить счет (основной контакт или компания). Сделка будет по умолчанию прикреплена всегда.

При срабатывании данного триггера, создастся новый счет к сделке, ссылка на счет добавится в поле (если это настроено в Кассе).

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

Работа с отложенными триггерами

Отложенные триггеры позволяют запланировать выполнение триггера на определенное время. Именно через отложенные триггеры выполняются задачи вроде: поздравлений с днем рождения, проверка условий через определенное время, постановка задач на будущее и т.д.

У каждого триггера есть параметр «Таймер запуска». Если его указать, то действие выполнится не сразу, а запланируется на определенную дату и время. Время таймера может быть любым — от 1 секунды до 99 лет. Кроме того дату выполнения можно брать из поля Сделки, Контакта или Компании.
Условия таймера следующие:

  • Без таймера — триггер будет выполнен как обычно без задержек.
  • Секунды, минуты, часы, дни — выполнение триггера можно отложить на количество указанных единиц, например на 30 секунд или на 7 дней. Начало отсчета таймера это момент выполнения триггера.
  • Дата из поля Сделки, Контакта, Компании — триггер будет выполнен в указанную дату. Например СМС уведомление клиента в этот день о записи на услугу. Время срабатывания можно указать в ручную. Можно смещать данную дату по дням + / -. Например через столько то дней или за столько то дней. Поле должно быть с типом Дата.
  • День года из поля Сделки, Контакта, Компании — триггер будет выполняться каждый год в указанный день. При этом в поле должна стоять обычная дата, например 05.05.1990. Триггер будет выполняться каждый год 5 мая. Например таким образом, можно поздравлять клиентов с праздниками или с днем рождения. Можно смещать данную дату по дням + / -. Например через столько то дней или за столько то дней.

Очень важная галочка!
Перезаписывать отложенные действия по сущности
По умолчанию отложенное действие по триггеру будет ставиться (читай добавляться новое) каждый раз, при выполнении сценария. Например сценарий такой: при изменении Контакта, если поле «день рождения» непустое, запустить отложенный триггер на поздравление. Данный сценарий будет выполняться каждый раз при изменении любого поля контакта.

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

Отложенный триггер ставится 1 раз при выполнении сценария, и выполнится 1 раз при наступлении этой даты. Чтобы поставить следующий триггер, нужно снова запустить сценарий. К примеру, вы настроили отложенную отправку SMS на день года из поля Контакта, сценарий настроили на изменение контакта. Соответственно, если после первого поздравления, с контактом не производилось никаких действий, то следующие триггеры на поздравление не будут создаваться. Триггер сам по себе не запланирует поздравления на годы вперед. Нужно снова изменить Контакт, если сценарий был на изменение контакта, так же это можно сделать другим триггером.

Удаление отложенного триггера

Отложенный триггер можно удалить. Например, если клиент отказался от записи, нужно отменить ему напоминание об этой встрече. Для это существует специальный триггер «Отменить отложенные задания». Например, если сделка перешла в статус «Услуга отменена», можно запустить триггер, в котором выбрать нужный сценарий, блок ссылок и конкретный триггер, который ставил отложенные задания.

Триггер «Отменить отложенные задания» удаляет ВСЕ отложенные триггеры в этом сценарии в выбранном блоке условий и в выбранном конкретном триггере по этой сущности.

Примеры настроек отложенных триггеров

Поставить задачу через 7 дней

Отправить клиенту СМС в шесть вечера за день до назначенной встречи

В день рождения клиента в 9 утра отправить клиенту e-mail с поздравлением и скидкой внутри

Работа с глобальными переменными

Глобальные переменные используются в рамках всей системы. В них можно сохранять любые данные, в том числе значения полей из amoCRM. Переменные можно перезаписывать, очищать, добавлять значение к имеющемуся. Одну и ту же переменную можно использовать во всех сценариях, в том числе в качестве условий. Переменные не привязаны к какой либо сущности amoCRM. Тип данных в переменной всегда текстовый, однако вы можете хранить в них: числа, текст, даты (в виде UNIX-time), флаги 1/0). Виджет автоматически поймет формат и корректно отработает, например, калькуляцию значений из переменной.

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

Примеры использования:

  • Перенос значений полей из одной сделки в другую

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

  • Счетчик значений

    Например, нам надо считать, сколько всего пропущенных звонков было по компании. Можно добавить сценарий на пропущенный звонок, и, каждый раз при его срабатывании, значение переменной увеличивать на 1. Если значение переменной превысит 10, то можно отправить уведомление РОПу.

  • Сделать мини отчет

    Пример: нужно понять, сколько раз вовремя не обработали заявку. Для этого необходимо добавить сценарий, который контролирует время нахождения сделки на определенном этапе, каждый раз при просроченном действии, в переменную добавляем новую строку текста, в котором будет ссылка на сделку и ответственный. В конце недели в переменной накопится много строк с данными, его можно отправить в Телеграм и очистить для следующей недели.

  • Использовать в условиях

    Значения переменных можно использовать в блоках условий. Например: если в переменной значение 1, то сценарии будут работать определенным образом, например, распределять на одних людей, если 0, то на других. Таким образом вы можете поменять переменную в одном месте и все сценарии начинают работать по другому алгоритму.

Добавление новой глобальной переменной

Чтобы с переменной можно было работать, ее предварительно нужно добавить. Перейдите во вкладку «Переменные», введите название новой переменной, например «report» (только латинские символы) и нажмите «Добавить переменную». Вы можете сразу задать значение этой переменной или оставить поле пустым. Нажмите сохранить.

Переменная добавлена. Так же в любой момент вы можете открыть нужную переменную и посмотреть ее текущее значение прямо в этом окне.

Изменение значения глобальной переменной

Значение переменной можно изменить через специальный триггер «Изменить значение переменной».

  • Добавьте новый триггер в блок условий вашего сценария
  • Выберите из списка «Изменить значение переменной»
  • В открывшемся окне выберите переменную, которую нужно изменить
  • В поле «Новое значение» введите значение, которое нужно присвоить переменной, например «{{date.now}} — произошло событие«. Можно использовать любые системные переменные, значения полей, модификаторы, калькуляции, произвольный текст и т.д.
  • Сохраните триггер, сохраните сценарий, запустите данный сценарий.

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

Добавление текстового значения к имеющемуся значению переменной

Чтобы текстовое значение не стиралось, а добавлялось к предыдущему, перед новым значением добавьте саму переменную в фигурных скобках. Пример:
{report}
{{date.now}} — произошло событие

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

Математический подсчет в глобальной переменной (счетчик)

Чтобы сделать калькуляцию, используйте название переменной, точно так же как поле сделки.
Пример: прибавление единицы к переменной, каждый раз при срабатывании — {{ ({report}+1):calc }}

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

Значение переменной после калькуляции, к примеру, можно вывести в примечание.

Как записать значение глобальной переменной в поле amoCRM

Добавьте триггер на изменение поля, например: «Изменить значение сделки». В параметрах выберите нужное поле, в значение вставьте название переменной в фигурных скобках, например: {report}.

Как отправить значение глобальной переменной в Телеграм

  • Добавьте новый триггер «Отправить уведомление в Телеграм».
  • Выберите чат, куда отправить сообщение.
  • Введите сообщение и впишите название переменной.

Таким же образом текст переменной можно отправить, например по СМС через виджет СМС-шлюз, по почте через Почтовик, в мессенджер клиенту через SalesBot.

Как использовать глобальную переменную в условиях

  • В блоке условий добавьте новое условие «Значение переменной», справа от поля выберите нужную переменную.
  • Выберите нужное сравнение и второе значение. В данном случае метод работы ничем не отличается от полей.
  • Можно делать сравнение со значением из поля, с произвольным значением или с другой переменной.

ЗАПУСК СЦЕНАРИЕВ

Сценарии запускаются автоматически при действиях в amoCRM или в ручную. В зависимости от типа события, на которые запускается сценарий, доступны разные параметры и переменные.

  • При создании сделки, контакта, компании

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

    В условиях сценария ко всему прочему доступны:

    • Все поля данной сущности и связанных сущностей
    • Теги, бюджет, ответственный, воронка, статус и т.д.
    • Задачи: дата ближайшей задачи, кол-во задач (открытых, просроченных, всего)
    • Количество прикрепленных сделок, контактов, в зависомости от конкретной сущности
  • При изменении сделки, контакта, компании

    Сценарий запускается автоматически при любом изменении сущностей. При этом можно работать со всеми связанными сущностями. Например, при изменении сделки, мы можем менять поля у компании этой сделки.

    Также изменения происходят при смене ответственного, добавлении примечания, в том числе системного, смене тегов, то есть почти при любых действиях с сущностью. То есть при всех этих действиях запустится ваш сценарий, который настроен на изменение. Так же стоит отметить, что изменения сущности могут быть вызваны самим сценарием, тем самым вызывая бесконечное выполнение сценария и триггеров.
    Например: на изменение сделки, мы добавляем примечание, а добавление примечания вызывает изменение сделки, на что снова запускается сценарий и снова добавляется примечание. В функционале виджета заложена базовая защита от таких рекурсий — это прежде всего таймаут сценария. Минимальное время повторного выполнения любого сценария для конкретной сущности составляет 5 секунд. Тем не менее могут быть цикличные сценарии, которые запускают друг друга, поэтому внимательно отнеситесь к выстраиванию логики.

    В условиях сценария ко всему прочему доступны:

    • Все поля данной сущности и связанных сущностей
    • Теги, бюджет, ответственный, воронка, статус и т.д.
    • Задачи: дата ближайшей задачи, кол-во задач (открытых, просроченных, всего)
    • Количество прикрепленных сделок, контактов, в зависомости от конкретной сущности
  • При входящем сообщении

    Сценарий автоматически запускается если клиент пишет в чат который подключен как источник лидов в amoCRM. Например в Telegram, Instagram, Viber, WhatsApp, Skype или в онлайн-чат amoCRM на сайте.

    В условиях, ко всему прочему, доступен текст сообщения. Например: если текст сообщения содержит «сколько стоит», триггером можно автоматически отправить ответ с ценой.

  • При смене ответственного

    Сценарий автоматически запускается при смене ответственного.
    В условиях сценария доступны все условия на изменение сущности.

  • При добавлении/изменении задачи

    Сценарий запускается при создании задачи к любой сущности.
    В условиях ко всему прочему доступны:

    • Тип связанной сущности, к которой добавилась задача
    • Тип задачи
    • Задача завершена? Да/Нет
    • Дата и время начала, и дата и время завершения задачи
    • Длительность задачи
  • При добавлении примечания

    Сценарий автоматически запускается при добавлении примечания в сделке, в контакте, в компании. В amoCRM добавление примечания происходит при:

    • Добавлении обычного текстового примечания
    • Добавлении системного примечания
    • Входящее/исходящее СМС сообщение
    • Входящий/исходящий e-mail
    • Входящий/исходящий телефонный звонок

    Пример настройки, видео «Как узнать время первого звонка клиенту и записать в поле»

    Таким образом для настройки логики становятся доступны следующие условия:

    • Тип примечания (звонок, письмо, смс, системное, текст)
    • По e-mail: тип письма (входящее/исходящее), заголовок письма
    • По СМС: тип сообщения (входящее, исходящее), текст сообщения
    • По звонкам: тип звонка (входящий/исходящий), длительность звонка в секундах, статус звонка (разговор состоялся, не дозвонился, занято и т.д.)
  • Ручной запуск

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

    Кроме того ручной запуск невозможен для следующих типов сценариев:

    • Смена статуса сделки
    • Смена ответственного
    • Задача добавлена/изменена
    • Добавление примечания в любой сущности
    • Входящее сообщение

    Для этих сценариев кнопка в карточке не покажется

  • Запуск из цифровой воронки amoCRM

    Сценарий запускается из цифровой воронки. В виду специфики функционала при это доступны сценарии только следующих типов:

    • Сценарий на создание сделки
    • Сценарий на изменение сделки
    • Ручной сценарий (свой сценарий)

    Все остальные сценарии не будут отображены при добавлении действия в цифровой воронке

  • Запуск из SalesBot

    Сценарий можно запустить и бота. Будут доступны только сценарии связанные со сделками ручные сценарии.

  • Запуск другим триггером

    Запускается триггером из другого сценария. Доступны переменные и данные из привязанных сущностей, переданные из родительского сценария.

  • Запуск при переходе по ссылке

    Сценарий можно запустить при переходе по ссылке. Например, клиенту отправляется письмо или СМС со ссылкой, он по ней переходит и в amoCRM срабатывает автоматизация. Ссылки можно автоматически отправить через мессенджер или почтой. Кроме того ссылку можно отправить в Телеграм в общий чат или себе в личку, например для выполнения автоматизации. Подробнее.

  • Запуск при нажатии кнопки в виджете Пушер

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

ТРИГГЕРНЫЕ ССЫЛКИ

Вы можете отправлять клиентам ссылки на страницы в интернете, например КП, каталог, прайс и при переходите по этим ссылкам запускать сценарии. Ссылку можно отправить через месенеджер (через SalesBot), почтой, или СМС клиенту.

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

В открывшемся окне введите:

  • Название ссылки
  • URL — страница на которую будет переход при клике по ссылке, например ваше КП в GoogleDoc или ваш сайт с каталогом товаром.
  • Сценарий — заранее настроенный сценарий, который выполнится при переходе по данной ссылке.

После сохранения сформируется переменная вида {tglink:58}, которую можно вставить в любое поле через триггер «Изменение полей». Далее ссылку можно отправить клиенту через почту, СМС, в мессенджер через SaleBot использую подстановку того самого поля, в которой хранится ссылка.

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

Лайфхак: Так же ссылку можно отправить в Telegram (не клиенту), в общий чат, себе в личку или руководителю, и сделать автоматизацию по клику.

Например:Приходит сообщение директору о просроченной задаче «По сделке Проект на 2 млн., просрочена задача на отправку счета», и в ней две ссылки: Оштрафовать | Передать другому. При нажатии на «Оштрафовать» создастся задача «Выписать штраф», для руководителя этого сотрудника. При нажатии «Передать другому», сделка тут же переводится другому сотруднику или уходит в общее распределение.

Ручная триггерная ссылка
В такой ссылке используются ID сущностей подставленные через переменные. Сначала сгенерируйте ссылку, затем подставьте нужную переменную с ID цифру сущности после ID.

  • цифру 1 — для контакта
  • цифру 2 — для сделки
  • цифру 3 — для компании

Например:


https://tglk.ru/{{contact.id}}/1/ - ссылка для контакта
https://tglk.ru/{{lead.id}}/2/ - ссылка для сделки
https://tglk.ru/{{company.id}}/3/ - ссылка для компании

Входящие веб хуки (web hooks)

Виджет может принимать входящие веб-хуки с различных сервисов и обрабатывать их используя свой мощный функционал. Например:

  • При заполнении формы на сайте в Tilda, заявку можно пробросить в amoCRM, при этом можно запускать разные сценарии в зависимости от наличия дублей контакта в amoCRM. Если у вас сайт на WordPress, то можно установить бесплатный модуль WebHooks.
  • При обновлении или отписывании контакта в рассылках MailChimp, можно прокинуть обновленную информацию в amoCRM.
  • При оплате счета в 1С, программа может прислать веб-хук, по которому можно найти, к примеру, компанию по ИНН и поставить ей сумму оплаты. Или найти сделку по ID и передвинуть статус.

Если сервис поддерживает WEB-hooks, будьте уверены, его легко можно будет интегрировать с amoCRM через данный виджет, без программиста.

Общий принцип работы с хуками выглядит так:


  1. Создать веб-хук в виджете и скопировать URL.
  2. Вставить URL в сервис, который имеет возможность их отправлять. Например в Тильде это — Настройки сайта > Формы > Другое > Webhook.
  3. Отправить хук с сайта, например, отправить текстовую заявку.
  4. Дождаться приема запроса в настройках данного хука в Триггерах и убедиться, что данные пришли.
  5. Используя пришедшие переменные настроить сценарии в Триггерах. Например, сделать поиск контакта по телефону, если нет, создать новый, если есть, обновить и поставить задачу.

Пример настройки — видео https://www.youtube.com/watch?v=uC6dPc5-JlY

Ниже рассмотрим эту последовательность более подробно.

1. Создание входящего веб-хука в Триггерах

  • Зайдите в настройки виджета, вкладка ХУКИ.
  • В правом верхнем углу введите название хука, например «Заявки с сайта», нажмите Создать.
  • Создастся новый приемщик хуков сгенерируется URL вида https://tglk.ru/in/QB4PoBsADoF9e6lA.
  • На данный момент никакие другие настройки можно не делать, настройки начинаются после приема первых данных по этому хуку.

2. Вставить URL в сервис отправки хуков

Сервисов, которые могут отправлять хуки огромное количество. Например: конструкторы сайтов, сервисы рассылки, некоторые платежные шлюзы, система 1С со специальным модулем, мессенджеры, например Телеграм, так же сама amoCRM (например, если вам нужно отправлять данные из одного аккаунта amoCRM в другую)

Скопируйте URL вида https://tglk.ru/in/QB4PoBsADoF9e6lA и вставьте в соответствующий сервис в настройках.

3. Отправьте тестовую заявку

Отправьте тестовую заявку с сервиса (например заполните форму), вернитесь в окно настройки хука и убедитесь, что данные пришли (окно обновляется в реальном времени).

Пример настройки веб-хука

4. Дождитесь принятия хука и изучите перемменные

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

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

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

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

5. Настройте нужные сценарии

Используя пришедшие переменные необходимо настроить сценарии в Триггерах.

Например, сделать поиск контакта по телефону, если контакт не найден, запустить сценарий создания контакта (данный сценарий предварительно должен быть создан), в котором можно использовать переменные из хука для задания полей новому контакту.

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

Небольшая подборка сервисов имеющих хуки

Конструкторы сайтов и CMS

  • Tilda
  • LP платформы,
  • WordPress (через бесплатный плагин)
  • WIX
  • Taplink
  • 1C Битрикс Управление сайтом

E-mail рассылки

  • MailChimp
  • SendPulse (есть хуки на открытие письма)
  • GetResponse
  • Unisender (есть хуки на открытие письма и переход по ссылке)

Телефония

  • OnlinePBX
  • UIS
  • Sipuni
  • Asterisk

Сервисы колтрекинга

  • RingoStat
  • ROIstat
  • Comagic
  • Calltouch
  • Callibri

Онлайн чаты

  • JivoChat
  • Chatra
  • Marquiz — квизы
  • Callibri

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

ОТЛАДКА И РЕШЕНИЕ ПРОБЛЕМ

Почему не сработал сценарий?
Почему не выполнился триггер внутри сценария?
Почему сценарий сработал, хотя не должен был?
Почему не сработало условие?

На все эти вопросы отвечает отладчик, который заложен в системе.

СИСТЕМА ОТЛАДКИ

В списке сценария, кликните на название события справа (зеленая ссылка — например «Сделка добавлена»).

      Будут показаны последние 100 действий, которые могли вызывать данный сценарий. Например, если это сценарий на создание сделки, то последние 100 созданных сделок с их ID.

      • Если в списке нет ни одной строчки, значит после создания сценария еще ни одна сделка не была создана.
      • Если внутри сценария несколько блоков с условиями, то будет показан каждый блок в виде отдельной строчки и статуса срабатывания конкретного блока.
      • Найдите свою сделку, по которой предполагался запуск сценария и выполнение триггеров (ищите по ID), и посмотрите как выполнились или не выполнились конкретные блоки условий.

          Если сделки, по которой вы тестируете, еще нет в этом списке, значит web-hook на нее еще не пришел. Посмотрите во вкладке Статистика число «Очередь обработки событий», если оно отлично от нуля, то возможно этот хук еще находится в очереди, такое бывает, если приходит очень много хуков из amoCRM. Это штатная работа системы и ускорить ее нельзя, чтобы не заблокировать API amoCRM.

          Блок условий может иметь три статуса:

          • Выполнен — блок выполнился и запустил триггеры, которые были в нем заложены. Значит все хорошо. Можно кликнуть на слово выполнен и увидеть какие триггеры внутри были сработаны. Так же вы можете узнать почему данный блок условий сработал, кликнув на его название.
          • Не соответствует условиям — данный блок не выполнился, так как не подходит по условиям. Нужно кликнуть по названию блока условий и увидеть все условия и значения, которые не дали запуститься этому блоку. Блок условий выполнится только если все строки будут зелеными. Красные строки говорят о том, что какое то условие не выполнилось. При наведении на строку условия покажется более подробная техническая информация: какие данные пришли, как они сравнивались, и к чему это привело, в том числе, время за которое сработала проверка. Скрин ниже.

              • Превышена частота выполнения — данная надпись появляется, если сценарий инициировался чаще чем заложено в настройках сценария — «Выполнять для конкретной сущности: не чаще чем 1 раз в XX сек.». Например в данном поле стоит 60 сек., а сделка будет меняться раз в 10 секунд, в таком случае, сценарий будет запущен только после того изменения, которое произошло спустя 60 секунд после предыдущего изменения, все остальные изменения в этом промежутке будут проигнорированы.

                  Старайтесь не понижать этот тайминг без особой необходимости. Это напрямую влияет на количество срабатываний триггеров, соответственно будут быстрее расходоваться лимиты на операции, которые ограничены на каждый аккаунт.
                  Вообще старайтесь сценарии «на изменение», использовать по минимуму, так как изменения происходят довольно часто. Любое обновление сущности, добавление примечания, звонки, чаты и т.д. вызывают изменение сущности. Поэтому в зависимости от бизнес-процесса, старайтесь использовать менее «частые» сценарии, например: смена статуса, создание сущности, добавление примечания и т.д.

                  Коды ошибок при выполнении триггеров

                  Ограничения на скорость выполнения

                  В следствие особенностей работы API amoCRM, у виджета существуют некоторые ограничения по скорости выполнения операций. В частности, все процессы ставятся в очередь заданий и выполняются с определенным интервалом, чтобы не допустить блокировки API вашего аккаунта. Каждое следующее задание ставится в конец очереди, в следствие этого могут быть задержки в выполнении операций.

                  Например, вы запустили сценарий для 1000 сделок, в зависимости от сложности и количества триггеров в нем, весь процесс будет выполняться 5-10 минут. Все это время остальные запускающиеся процессы будут вставать в очередь и будут выполнены, когда до них дойдет очередь. При этом специальный алгоритм следит за тем, чтобы сценарии, в которых накопились большие очереди, не мешали другим сценариям.
                  Это штатная работа системы и ускорить ее нельзя.

                  Ограничения на количество операций

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

                  Существует лимит операций для аккаунта. На каждого купленного пользователя дается 50 000 операций в месяц, например за 5 пользователей это 250 000 операций. За операцию считается каждое действие триггера и каждый пришедший web-hook из amoCRM. Количество операций можно посмотреть во вкладке Статистика.

                  Данное количество операций в среднем три раза превышает необходимые потребности обычного аккаунта. Однако некоторые аккаунты могут его превышать в следствие неправильной настройки или сложности процессов. Если вы много и часто превышаете лимиты, мы поможем вам оптимизировать сценарии, а если это невозможно, нужно будет докупать нужное количество операций. Рассчет производится по той же схеме — 50 тыс. на одного пользователя. То есть, если вы превысили на 100 тыс. в месяц, нужно будет доплатить за 2 пользователей.

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

                  Ограничения на количество сценариев

                  В одном аккаунте не может быть больше 100 сценариев. Данная цифра полностью покрывает потребности, а бОльшее количество ведет к невозможности нормальной работы с интерфейсом программы. Если у вас больше 100 сценариев, обратитесь к нам, посмотрим, почему так получилось и найдем решение.
                  Максимальное количество активных сценариев по изменению сущностей (сделки, контакта, компании, задачи) не должно превышать более 3-х штук на каждое из событий.

                  Ограничения на хранение очереди отложенных триггеров
                  При наступлении отложенного события, сценарий, инициировавший данное событие, может быть не активным (выключен). В данном случае отложенное событие не выполнится и будет ждать, пока сценарий включится. Если выключенный сценарий не включается в течение 3 месяцев с того момента как должен выполниться отложенный триггер, то данный триггер удаляется.
                  Если же сценарий включится, то все отложенные триггеры у которых уже наступил срок выполнения, выполнятся моментально.

                  Работа триггеров в разных временных зонах
                  Виджет работает по серверному времени UTC+3 (Europe/Moscow). Все интерфейсные элементы, история срабатываний, настройки запуска, привязаны к московскому времени. При настройке автоматизации для разных часовых поясов, вы можете самостоятельно настраивать сценарии и триггеры с учетом сдвига временных зон. Например отсрочить или ускорить запуск триггера на несколько часов.

                  Готовые решения

                  Примеры готовых настроек по сценариям со скриншотами

                  Как поздравить клиента с днем рождения?

                  Пример готовых настроек виджета для поздравления клиента.

                  Как уведомить клиента о записи за 2 часа?

                  Уведомляем клиента о записи с помощью виджета Триггеры и бесплатного виджета СМС-шлюз

                  Как работать с базой и напоминать о себе клиентам, которые купили, но давно не выходили на связь?

                  Готовый бизнес процесс для напоминания клиентам по следующей покупке. (переписать)

                  Не получается настроить? Сложные процессы в компании?

                  Закажите профессиональную настройку виджета «Командой F5». Полная автоматизация ваших бизнес-процессов под ключ, с учетом специфики компании.

                  Telegram канал «Команды F5»

                  Лучшие кейсы автоматизаций, новости о выходе новых виджетов и обновлениях действующих.

                  канала в телеграм

                  В этом руководстве мы рассмотрим шаги по созданию и настройке триггеров для уведомлений в Zabbix.

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

                  • OK – всё в порядке.
                  • Проблема – когда данные выходят за приемлемые значения (например, средняя доступность узла за 2 минуты переходит от логической 1 к логической 0, мы узнаем, что он оффлайн).
                  • Неизвестно – что-то пошло не так, и значение триггера не может быть вычислено.

                  Создание триггеров

                  “Конфигурация” в верхнем меню. → “Хосты” в левом меню. → выберите узел, для которого хотите создать триггер → вкладка “Триггеры” → “Создать триггер” в правом верхнем углу. Заполните необходимую информацию, такую как имя триггера, важность.

                  Список триггеров

                  Список триггеров
                  Окно настройки триггера
                  Окно настройки триггера

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

                  Для подробных примеров вы можете посмотреть в официальной документации по адресу https://www.zabbix.com/documentation/5.2/ru/manual/config/triggers/expression

                  Окно настройки выражения проблемы

                  Окно настройки выражения проблемы

                  Формирование ОК событий – описывает, когда триггер перейдет в состояние OK:

                  • Выражение работает на обратном выражении из предыдущей строки.
                  • Выражение восстановления работает, когда оно становится Истинным, а выражение ошибки становится Ложным.
                  • Если выбрано значение «Нет», триггер не вернется в нормальное состояние самостоятельно.

                  Режим генерации проблемных событий позволяет выбирать между генерацией событий при каждом возникновении проблемы или только при первом.

                  Следующая строка определяет, закрывает ли событие Ok все проблемы на этом триггере или только с соответствующими тегами.

                  «Ручное закрытие» позволяет закрывать проблемы этого триггера вручную.

                  И, как обычно, «Активировано» делает этот триггер рабочим.

                  Добавляем триггер.

                  Теперь чтобы проверить его идем в Конфигурацию → узлы сети → триггеры и проверяем состояние нашего триггера.

                  Заключение

                  Мы изучили важный аспект мониторинга вашей сетевой инфраструктуры Zabbix – создание и настройку триггеров.

                  191028
                  Санкт-Петербург
                  Литейный пр., д. 26, Лит. А

                  +7 (812) 403-06-99

                  700
                  300

                  ООО «ИТГЛОБАЛКОМ ЛАБС»

                  191028
                  Санкт-Петербург
                  Литейный пр., д. 26, Лит. А

                  +7 (812) 403-06-99

                  700
                  300

                  ООО «ИТГЛОБАЛКОМ ЛАБС»

                  Время на прочтение
                  17 мин

                  Количество просмотров 173K

                  Традиционно статья написана тезисно. Более подробное содержание можно найти в приложенном внизу статьи видео с записью лекции про триггеры Oracle.

                  • Общие сведения о триггерах Oracle
                  • DML triggers
                    • Псевдозаписи
                    • Instead of dml triggers
                    • Instead of triggers on Nested Table Columns of Views.
                    • Составные DML триггера (compound DML triggers)
                      • Структура составного триггера
                    • Основные правила определения DML триггеров
                    • Ограничения DML триггеров
                    • Ошибка мутирования таблицы ORA-04091
                  • Системные триггеры (System triggers)
                    • Триггеры уровня схемы (schema triggers)
                    • Триггеры уровня базы данных (database triggers)
                    • Instead of create triggers
                    • Атрибуты системных триггеров
                    • События срабатывания системных триггеров
                  • Компиляция триггеров
                  • Исключения в триггерах
                  • Порядок выполнения триггеров
                  • Включение/отключение триггеров
                  • Права для операций с триггерами
                  • Словари данных с информацией о триггерах

                  Общие сведения о триггерах

                  Триггер – это именованный pl/sql блок, который хранится в базе данных.

                  • Нельзя самому вызвать триггер, он всегда срабатывает только на определенное событие автоматически(если он enable)
                  • Не стоит создавать рекурсивные триггера. Т.е., например, триггер after update, в котором выполняется update той же таблицы. В этом случае триггер будет срабатывать рекурсивно до тех пор, пока не закончится память.

                  Классификация триггеров:

                  • DML trigger (на таблицу или представление)
                  • System trigger (на схему или базу данных)
                  • Conditional trigger (те, которые имеют условие when)
                  • Instead of trigger (dml триггер на представление или system триггер на команду create)

                  Зачем использовать триггеры:

                  • Для автоматической генерации значений виртуального поля
                  • Для логгирования
                  • Для сбора статистики
                  • Для изменения данных в таблицах, если в dml операции участвует представление
                  • Для предотвращения dml операций в какие-то определенные часы
                  • Для реализации сложных ограничений целостности данных, которые невозможно осуществить через описательные ограничения, установленные при создании таблиц
                  • Для организации всевозможных видов аудита
                  • Для оповещения других модулей о том, что делать в случае изменения информации в БД
                  • Для реализации бизнес логики
                  • Для организации каскадных воздействий на таблицы БД
                  • Для отклика на системные события в БД или схеме

                  где plsql_trigger_source, это такая конструкция:

                  Конструкции simple_dml_trigger, instead_of_dml_trigger, compound_dml_trigger и system_trigger будут приведены в соответствующих разделах статьи.

                  DML triggers

                  • DML триггеры создаются для таблиц или представлений, срабатывают при вставке, обновлении или удалении записей.
                  • Триггер может быть создан в другой схеме, отличной от той, где определена таблицы. В таком случае текущей схемой при выполнении триггера считается схема самого триггера.
                  • При операции MERGE срабатывают триггеры на изменение, вставку или удаление записей в зависимости от операции со строкой.
                  • Триггер – часть транзакции, ошибка в триггере откатывает операцию, изменения таблиц в триггере становятся частью транзакции.
                  • Если откатывается транзакция, изменения триггера тоже откатываются.
                  • В триггерах запрещены операторы DDL и управления транзакциями (исключения – автономные транзакции).

                  Конструкция simple_dml_trigger:

                  Где, dml_event_clause:

                  referencing_clause:

                  trigger_edition_clause:

                  trigger_body:

                  По привязанному объекту делятся на:

                  • На таблице
                  • На представлении (instead of trigger)

                  По событиям запуска:

                  • Вставка записей (insert)
                  • Обновление записей (update)
                  • Удаление записей (delete)

                  По области действия:

                  • Уровень всей команды (statement level triggers)
                  • Уровень записи (row level triggers)
                  • Составные триггеры (compound triggers)

                  По времени срабатывания:

                  • Перед выполнением операции (before)
                  • После выполнения операции (after)

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

                  Условные предикаты для определения операции, на которую сработал триггер:

                  Предикат Описание
                  Inserting True, если триггер сработал на операцию Insert
                  Updating True, если триггер сработал на операцию Update
                  Updating(‘colum’) True, если триггер сработал на операцию Update, которая затрагивает определенное поле
                  Deleting True, если триггер сработал на операцию Delete

                  Эти предикаты могут использоваться везде, где можно использовать Boolean выражения.

                  Пример

                  CREATE OR REPLACE TRIGGER t
                    BEFORE
                      INSERT OR
                      UPDATE OF salary, department_id OR
                      DELETE
                    ON employees
                  BEGIN
                    CASE
                      WHEN INSERTING THEN
                        DBMS_OUTPUT.PUT_LINE('Inserting');
                      WHEN UPDATING('salary') THEN
                        DBMS_OUTPUT.PUT_LINE('Updating salary');
                      WHEN UPDATING('department_id') THEN
                        DBMS_OUTPUT.PUT_LINE('Updating department ID');
                      WHEN DELETING THEN
                        DBMS_OUTPUT.PUT_LINE('Deleting');
                    END CASE;
                  END;
                  

                  Псевдозаписи

                  Существуют псевдозаписи, позволяющие обратиться к полям изменяемой записи и получить значения полей до изменения и значения полей после изменения. Это записи old и new. С помощью конструкции Referencing можно изменить их имена. Структура этих записей tablename%rowtype. Эти записи есть только у триггеров row level или у compound триггеров (с секциями уровня записи).

                  Операция срабатывания триггера OLD.column NEW.column
                  Insert Null Новое значение
                  Update Старое значение Новое значение
                  Delete Старое значение Null

                  Restrictions:

                  • С псевдозаписями запрещены операции уровня всей записи ( :new = null;)
                  • Нельзя изменять значения полей записи old
                  • Если триггер срабатывает на delete, нельзя изменить значения полей записи new
                  • В триггере after нельзя изменить значения полей записи new

                  Instead of dml triggers

                  • Создаются для представлений (view) и служат для замещения DML операций своим функционалом.
                  • Позволяют производить операции вставки/обновления или удаления для необновляемых представлений.

                  Конструкция instead_of_dml_trigger:

                  • Это всегда триггер уровня записи (row level)
                  • Имеет доступ к псевдозаписям old и new, но не может изменять их
                  • Заменяет собой dml операцию с представлением (view)

                  Пример

                  CREATE OR REPLACE VIEW order_info AS
                     SELECT c.customer_id, c.cust_last_name, c.cust_first_name,
                            o.order_id, o.order_date, o.order_status
                     FROM customers c, orders o
                     WHERE c.customer_id = o.customer_id;
                  
                  CREATE OR REPLACE TRIGGER order_info_insert
                     INSTEAD OF INSERT ON order_info
                     DECLARE
                       duplicate_info EXCEPTION;
                       PRAGMA EXCEPTION_INIT (duplicate_info, -00001);
                     BEGIN
                       INSERT INTO customers
                         (customer_id, cust_last_name, cust_first_name)
                       VALUES (
                       :new.customer_id,
                       :new.cust_last_name,
                       :new.cust_first_name);
                     INSERT INTO orders (order_id, order_date, customer_id)
                     VALUES (
                       :new.order_id,
                       :new.order_date,
                       :new.customer_id);
                     EXCEPTION
                       WHEN duplicate_info THEN
                         RAISE_APPLICATION_ERROR (
                           num=> -20107,
                           msg=> 'Duplicate customer or order ID');
                     END order_info_insert;
                  

                  Instead of triggers on Nested Table Columns of Views

                  Можно создать триггер для вложенной в представлении таблицы. В таком триггере также присутствует дополнительная псевдозапись – parent, которая ссылается на всю запись представления (стандартные псевдозаписи old и new ссылаются только на записи вложенной таблицы)

                  Пример такого триггера

                  -- Create type of nested table element:
                   
                  CREATE OR REPLACE TYPE nte
                  AUTHID DEFINER IS
                  OBJECT (
                    emp_id     NUMBER(6),
                    lastname   VARCHAR2(25),
                    job        VARCHAR2(10),
                    sal        NUMBER(8,2)
                  );
                  /
                   
                  -- Created type of nested table:
                   
                  CREATE OR REPLACE TYPE emp_list_ IS
                    TABLE OF nte;
                  /
                   
                  -- Create view:
                  
                  CREATE OR REPLACE VIEW dept_view AS
                    SELECT d.department_id, 
                           d.department_name,
                           CAST (MULTISET (SELECT e.employee_id, e.last_name, e.job_id, e.salary
                                           FROM employees e
                                           WHERE e.department_id = d.department_id
                                          )
                                          AS emp_list_
                                ) emplist
                    FROM departments d;
                   
                  -- Create trigger:
                   
                  CREATE OR REPLACE TRIGGER dept_emplist_tr
                    INSTEAD OF INSERT ON NESTED TABLE emplist OF dept_view
                    REFERENCING NEW AS Employee
                                PARENT AS Department
                    FOR EACH ROW
                  BEGIN
                    -- Insert on nested table translates to insert on base table:
                    INSERT INTO employees (
                      employee_id,
                      last_name,
                      email,
                      hire_date,
                      job_id,
                      salary,
                      department_id
                    )
                    VALUES (
                      :Employee.emp_id,                      -- employee_id
                      :Employee.lastname,                    -- last_name
                      :Employee.lastname || '@company.com',  -- email
                      SYSDATE,                               -- hire_date
                      :Employee.job,                         -- job_id
                      :Employee.sal,                         -- salary
                      :Department.department_id              -- department_id
                    );
                  END;
                  

                  Запускает триггер оператор insert

                  INSERT INTO TABLE (
                    SELECT d.emplist 
                    FROM dept_view d
                    WHERE department_id = 10
                  )
                  VALUES (1001, 'Glenn', 'AC_MGR', 10000);
                  

                  Составные DML триггера (compound DML triggers)

                  Появившиеся в версии 11G эти триггера включают в одном блоке обработку всех видов DML триггеров.
                  Конструкция compound_dml_trigger:

                  Где, compound_trigger_block:

                  timing_point_section:

                  timing_point:

                  tps_body:

                  • Срабатывают такие триггера при разных событиях и в разные моменты времени (на уровне оператора или строки, при вставке/обновлении/удалении, до или после события).
                  • Не могут быть автономными транзакциями.

                  В основном используются, чтобы:

                  • Собирать в коллекцию строки для вставки в другую таблицу, чтобы периодически вставлять их пачкой
                  • Избежать ошибки мутирующей таблицы (mutating-table error)

                  Структура составного триггера

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

                  • Before statement
                  • After statement
                  • Before each row
                  • After each row

                  В этих триггерах нет секции инициализации, но для этих целей можно использовать секцию before statement.
                  Если в триггере нет ни before statement секции, ни after statement секции, и оператор не затрагивает ни одну запись, такой триггер не срабатывает.

                  Restrictions:

                  • Нельзя обращаться к псевдозаписям old, new или parent в секциях уровня выражения (before statement и after statement)
                  • Изменять значения полей псевдозаписи new можно только в секции before each row
                  • Исключения, сгенерированные в одной секции, нельзя обрабатывать в другой секции
                  • Если используется оператор goto, он должен указывать на код в той же секции

                  Пример

                  create or replace trigger tr_table_test_compound
                    for update or delete or insert on table_test
                    compound trigger
                    
                    v_count  pls_integer := 0;  
                      
                    before statement is
                    begin
                      dbms_output.put_line ( 'before statement' );
                    end before statement;
                    
                    before each row is
                    begin
                      dbms_output.put_line ( 'before insert' );
                    end before each row;
                    
                    after each row is
                    begin
                      dbms_output.put_line ( 'after insert' );
                      v_count := v_count + 1;
                    end after each row;
                    
                    after statement is
                    begin
                     dbms_output.put_line ( 'after statement' );
                    end after statement;  
                  end tr_table_test_compound;
                  

                  Основные правила определения DML триггеров

                  • Update of – позволяет указать список изменяемых полей для запуска триггера
                  • Все условия в заголовке и When … проверяются без запуска триггера на стадии выполнения SQL
                  • В операторе When можно использовать только встроенные функции
                  • Можно делать несколько триггеров одного вида, порядок выполнения не определен по умолчанию, но его можно задать с помощью конструкции FOLLOWS TRIGGER_FIRST
                  • Ограничения уникальности проверяются при изменении записи, то есть после выполнения триггеров before
                  • Секция объявления переменных определяется словом DECLARE
                  • Основной блок триггера подчиняется тем же правилам, что и обычные PL/SQL блоки

                  Ограничения DML триггеров

                  • нельзя выполнять DDL statements (только в автономной транзакции)
                  • нельзя запускать подпрограммы с операторами контроля транзакций
                  • не имеет доступа к SERIALLY_REUSABLE пакетов
                  • размер не может превышать 32К
                  • нельзя декларировать переменные типа LONG и LONG RAW

                  Ошибка мутирования таблицы ORA-04091

                  Если в триггере уровня строки попытаться получить или изменить данные в целевой таблицы, то Oracle не позволит это сделать и выкинет ошибку ORA-04091 Таблица TABLE_TEST изменяется, триггер/функция может не заметить это.
                  Для обхода данной проблемы используются следующие приемы:

                  • использовать триггеры уровня операции
                  • автономная транзакция в триггере
                  • использовать сторонние структуры (коллекции уровня пакета)
                  • использовать COMPOUND TRIGGER
                  • изменение самого алгоритма с выносом функционала из триггера

                  Системные триггеры (System triggers)

                  Конструкция system_trigger:

                  Такие триггеры относятся или к схеме, или ко всей базе данных.

                  Есть несколько вариантов, в какой момент времени срабатывает системный триггер:

                  • До того, как будет выполнена операция (на которую срабатывает триггер)
                  • После того, как будет выполнена операция (на которую срабатывает триггер)
                  • Вместо выполнения оператора Create

                  Триггеры уровня схемы (schema triggers)

                  • Срабатывает всегда, когда пользователь-владелец схемы запускает событие (выполняет операцию), на которую должен срабатывать триггер.
                  • В случае, если любой другой пользователь запускает процедуру/функцию, которая вызывается с правами создателя, и в этой процедуре/функции выполняется операция, на которую создан системный триггер – этот триггер сработает.

                  Пример триггера

                  CREATE OR REPLACE TRIGGER drop_trigger
                    BEFORE DROP ON hr.SCHEMA
                    BEGIN
                      RAISE_APPLICATION_ERROR (
                        num => -20000,
                        msg => 'Cannot drop object');
                    END;
                  

                  Триггеры уровня базы данных (database triggers)

                  • Такой триггер срабатывает когда любой пользователь БД выполняет команду, на которую создан триггер.

                  Пример триггера

                  CREATE OR REPLACE TRIGGER check_user
                    AFTER LOGON ON DATABASE
                    BEGIN
                      check_user;
                    EXCEPTION
                      WHEN OTHERS THEN
                        RAISE_APPLICATION_ERROR
                          (-20000, 'Unexpected error: '|| DBMS_Utility.Format_Error_Stack);
                   END;
                  

                  Instead of create triggers

                  • Это триггер уровня схемы, который срабатывает на команду create и заменяет собой эту команду (т.е. вместо выполнения команды create выполняется тело триггера).

                  Пример триггера

                  CREATE OR REPLACE TRIGGER t
                    INSTEAD OF CREATE ON SCHEMA
                    BEGIN
                      EXECUTE IMMEDIATE 'CREATE TABLE T (n NUMBER, m NUMBER)';
                    END;
                  

                  Атрибуты системных триггеров

                  Атрибут Возвращаемое значение и тип
                  ora_client_ip_address Varchar2
                  ip-адрес клиента
                  Пример:

                  IF (ora_sysevent = 'LOGON') THEN
                      v_addr := ora_client_ip_address;
                    END IF;
                  
                  ora_database_name Varchar2(50)
                  имя базы данных
                  Пример:

                  v_db_name := ora_database_name;
                  ora_des_encrypted_password Varchar2
                  зашифрованный по стандарту DES пароль пользователя, который создается или изменяется
                  Пример:

                  IF (ora_dict_obj_type = 'USER') THEN
                    INSERT INTO event_table
                    VALUES (ora_des_encrypted_password);
                  END IF;
                  
                  ora_dict_obj_name Varchar2(30)
                  имя объекта, над которым совершается операция DDL

                  Пример:

                  INSERT INTO event_table 
                  VALUES ('Changed object is ' ||
                          ora_dict_obj_name);
                  
                  ora_dict_obj_name_list (
                  name_list OUT ora_name_list_t
                  )
                  Pls_integer
                  количество изменненых командой объектов
                  Name_list – список измененных командой объектов

                  Пример:

                  IF (ora_sysevent='ASSOCIATE STATISTICS') THEN
                      number_modified :=
                       ora_dict_obj_name_list(name_list);
                    END IF;
                  
                  ora_dict_obj_owner Varchar2(30)
                  владелец объекта, над которым совершается операция DDL

                  Пример:

                  INSERT INTO event_table
                  VALUES ('object owner is' || 
                          ora_dict_obj_owner);
                  
                  ora_dict_obj_owner_list (
                  owner_list OUT ora_name_list_t
                  )
                  Pls_integer
                  количество владельцев измененных командой объектов
                  Owner_list – список владельцев изменных командой объектов

                  Пример:

                  IF (ora_sysevent='ASSOCIATE STATISTICS') THEN
                      number_modified :=
                        ora_dict_obj_name_list(owner_list);
                    END IF;
                  
                  ora_dict_obj_type Varchar2(20)
                  тип объекта, над которым совершается операция ddl

                  Пример:

                  INSERT INTO event_table
                  VALUES ('This object is a ' || 
                          ora_dict_obj_type);
                  
                  ora_grantee (
                  user_list OUT ora_name_list_t
                  )
                  Pls_integer
                  количество пользователей, участвующих в операции grant
                  User_list – список этих пользователей

                  Пример:

                  IF (ora_sysevent = 'GRANT') THEN
                      number_of_grantees := 
                       ora_grantee(user_list);
                    END IF;
                  
                  ora_instance_num Number
                  номер инстанса

                  Пример:

                  IF (ora_instance_num = 1) THEN
                    INSERT INTO event_table VALUES ('1');
                  END IF;
                  
                  ora_is_alter_column (
                  column_name IN VARCHAR2
                  )
                  Boolean
                  True, если указанное поле было изменено операцией alter. Иначе false

                  Пример:

                  IF (ora_sysevent = 'ALTER' AND
                    ora_dict_obj_type = 'TABLE') THEN 
                      alter_column := ora_is_alter_column('C');
                  END IF;
                  
                  ora_is_creating_nested_table Boolean
                  true, если текущее событие – это создание nested table. Иначе false

                  Пример:

                  IF (ora_sysevent = 'CREATE' AND
                    ora_dict_obj_type = 'TABLE' AND
                    ora_is_creating_nested_table) THEN
                      INSERT INTO event_table
                      VALUES ('A nested table is created');
                  END IF;
                  
                  ora_is_drop_column (
                  column_name IN VARCHAR2
                  )
                  Boolean
                  true, если указанное поле удалено. Иначе false

                  Пример:

                  IF (ora_sysevent = 'ALTER' AND
                    ora_dict_obj_type = 'TABLE') THEN
                      drop_column := ora_is_drop_column('C');
                  END IF;
                  
                  ora_is_servererror (
                  error_number IN VARCHAR2
                  )
                  Boolean
                  true, если сгенерированно исключение с номером error_number. Иначе false

                  Пример:

                  IF ora_is_servererror(error_number) THEN
                    INSERT INTO event_table
                    VALUES ('Server error!!');
                  END IF;
                  
                  ora_login_user Varchar2(30)
                  имя текущего пользователя

                  Пример:

                  SELECT ora_login_user FROM DUAL;
                  ora_partition_pos Pls_integer
                  в instead of trigger для create table позиция в тексте sql команды, где может быть вставлена конструкция partition

                  Пример:

                  -- Retrieve ora_sql_txt into  sql_text variable
                  v_n := ora_partition_pos;
                  v_new_stmt := SUBSTR(sql_text,1,v_n - 1)
                                || ' ' || my_partition_clause
                                || ' ' || SUBSTR(sql_text, v_n));
                  
                  ora_privilege_list (
                  privilege_list OUT ora_name_list_t
                  )
                  Pls_integer
                  количество привилегий, участвующее в операции grant или revoke
                  Privilege_list – список этих привилегий

                  Пример:

                  IF (ora_sysevent = 'GRANT' OR
                        ora_sysevent = 'REVOKE') THEN
                      number_of_privileges :=
                        ora_privilege_list(privilege_list);
                    END IF;
                  
                  ora_revokee (
                  user_list OUT ora_name_list_t
                  )
                  Pls_integer
                  количество пользователей, участвующих в операции revoke
                  User_list – список этих пользователей

                  Пример:

                  IF (ora_sysevent = 'REVOKE') THEN
                      number_of_users := ora_revokee(user_list);
                    END IF;
                  
                  ora_server_error (
                  position IN PLS_INTEGER
                  )
                  Number
                  код ошибки в указанной позиции error stack, где 1 – это вершина стека

                  Пример:

                  INSERT INTO event_table
                  VALUES ('top stack error ' || 
                          ora_server_error(1));
                  
                  ora_server_error_depth Pls_integer
                  количество сообщений об ошибка в error stack

                  Пример:

                  n := ora_server_error_depth;
                  -- Use n with functions such as ora_server_error
                  
                  ora_server_error_msg (
                  position IN PLS_INTEGER
                  )
                  Varchar2
                  сообщение об ошибке в указанном месте error stack

                  Пример:

                  INSERT INTO event_table
                  VALUES ('top stack error message' ||
                          ora_server_error_msg(1));
                  
                  ora_server_error_num_params (
                  position IN PLS_INTEGER
                  )
                  Pls_integer
                  количество замещенных строк (с помощью формата %s) в указанной позиции error stack

                  Пример:

                  n := ora_server_error_num_params(1);
                  ora_server_error_param (
                  position IN PLS_INTEGER,
                  param IN PLS_INTEGER
                  )
                  Varchar2
                  замещенный текст в сообщении об ошибке в указанной позиции error stack (возвращается param по счету замещенный текст)

                  Пример:

                  -- Second %s in "Expected %s, found %s":
                  param := ora_server_error_param(1,2);
                  
                  ora_sql_txt (
                  sql_text OUT ora_name_list_t
                  )
                  Pls_integer
                  количество элементов в pl/sql коллекции sql_text.
                  Сам параметр sql_text возвращает текст команды, на которую сработал триггер

                  Пример:

                  CREATE TABLE event_table (col VARCHAR2(2030));
                  
                  DECLARE
                    sql_text ora_name_list_t;
                    n PLS_INTEGER;
                    v_stmt VARCHAR2(2000);
                  BEGIN
                    n := ora_sql_txt(sql_text);
                  
                    FOR i IN 1..n LOOP
                      v_stmt := v_stmt || sql_text(i);
                    END LOOP;
                  
                    INSERT INTO event_table VALUES ('text of
                      triggering statement: ' || v_stmt);
                  END;
                  
                  ora_sysevent Varchar2(20)
                  название команды, на которую срабатывает триггер

                  Пример:

                  INSERT INTO event_table
                  VALUES (ora_sysevent);
                  
                  ora_with_grant_option Boolean
                  true, если привилегии выдаются with grant option. Иначе false.

                  Пример:

                  IF (ora_sysevent = 'GRANT' AND
                    ora_with_grant_option = TRUE) THEN
                      INSERT INTO event_table 
                      VALUES ('with grant option');
                  END IF;
                  
                  ora_space_error_info (
                  error_number OUT NUMBER,
                  error_type OUT VARCHAR2,
                  object_owner OUT VARCHAR2,
                  table_space_name OUT VARCHAR2,
                  object_name OUT VARCHAR2,
                  sub_object_name OUT VARCHAR2
                  )
                  Boolean
                  true, если ошибка возникает из-за нехватки места. В выходных параметрах информация об объекте.

                  Пример:

                  IF (ora_space_error_info (
                       eno,typ,owner,ts,obj,subobj) = TRUE) THEN
                    DBMS_OUTPUT.PUT_LINE('The object '|| obj
                       || ' owned by ' || owner ||
                       ' has run out of space.');
                  END IF;
                  

                  События срабатывания системных триггеров

                  Событие Описание Доступные атрибуты
                  AFTER STARTUP При запуске БД. Бывает только уровня БД. При ошибке пишет в системный лог. ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  BEFORE SHUTDOWN Перед тем, как сервер начнет процесс останова. Бывает только уровня БД. При ошибке пишет в системный лог. ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  AFTER DB_ROLE_CHANGE При запуске БД в первый раз после смены ролей from standby to primary or from primary to standby.
                  используется только в конфигурации Data Guard,, бывает только уровня БД.
                  ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  AFTER SERVERERROR Если случается любая ошибка (если с условием, то срабатывает только на ошибку, указанную в условии). При ошибке в теле триггера не вызывает себя рекурсивно. ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_server_error
                  ora_is_servererror
                  ora_space_error_info
                  BEFORE ALTER

                  AFTER ALTER

                  Если объект изменяется командой alter ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_type
                  ora_dict_obj_name
                  ora_dict_obj_owner
                  ora_des_encrypted_password
                  (for ALTER USER events)
                  ora_is_alter_column
                  (for ALTER TABLE events)
                  ora_is_drop_column
                  (for ALTER TABLE events)
                  BEFORE DROP

                  AFTER DROP

                  При удалении объекта ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_type
                  ora_dict_obj_name
                  ora_dict_obj_owner
                  BEFORE ANALYZE

                  AFTER ANALYZE

                  При срабатывании команды analyze ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  BEFORE ASSOCIATE STATISTICS

                  AFTER ASSOCIATE STATISTICS

                  При выполнении команды associate statistics ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  ora_dict_obj_name_list
                  ora_dict_obj_owner_list
                  BEFORE AUDIT

                  AFTER AUDIT

                  BEFORE NOAUDIT

                  AFTER NOAUDIT

                  При выполнении команды audit или noaudit ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  BEFORE COMMENT

                  AFTER COMMENT

                  При добавлении комментария к объекту ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  BEFORE CREATE

                  AFTER CREATE

                  При создании объекта ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_type
                  ora_dict_obj_name
                  ora_dict_obj_owner
                  ora_is_creating_nested_table
                  (for CREATE TABLE events)
                  BEFORE DDL

                  AFTER DDL

                  Срабатывает на большинство команд DDL, кроме: alter database, create control file, create database. ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  BEFORE DISASSOCIATE STATISTICS

                  AFTER DISASSOCIATE STATISTICS

                  При выполнении команды disassociate statistics ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  ora_dict_obj_name_list
                  ora_dict_obj_owner_list
                  BEFORE GRANT

                  AFTER GRANT

                  При выполнении команды grant ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  ora_grantee
                  ora_with_grant_option
                  ora_privilege_list
                  BEFORE LOGOFF Срабатывает перед дисконнеком пользователя, бывает уровня схемы или БД ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  AFTER LOGON Срабатывает после того, как пользователь успешно установил соединение с БД. При ошибке запрещает пользователю вход. Не действует на SYS. ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_client_ip_address
                  BEFORE RENAME

                  AFTER RENAME

                  При выполнении команды rename ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_owner
                  ora_dict_obj_type
                  BEFORE REVOKE

                  AFTER REVOKE

                  При выполнении команды revoke ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner
                  ora_revokee
                  ora_privilege_list
                  AFTER SUSPEND Срабатывает в случае, если sql команда приостанавливается по причине серверной ошибки (нехватки памяти).
                  При этом триггер должен изменить условия таким образом, чтобы выполнение команды было возобновлено)
                  ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_server_error
                  ora_is_servererror
                  ora_space_error_info
                  BEFORE TRUNCATE

                  AFTER TRUNCATE

                  При выполнении команды truncate ora_sysevent
                  ora_login_user
                  ora_instance_num
                  ora_database_name
                  ora_dict_obj_name
                  ora_dict_obj_type
                  ora_dict_obj_owner

                  Компиляция триггеров

                  Если во время выполнения команды create trigger произошла ошибка, триггер все равно будет создан, но будет в невалидном состоянии. При этом все попытки выполнить операцию(на которую должен срабатывать триггер) над объектом, на котором висит такой триггер, будут завершаться ошибкой. Это не относится к случаям, когда:

                  • Триггер создан в состоянии disabled (или переведен в такое состояние)
                  • Событие триггера after startup on database
                  • Событие триггера after logon on database или after logon on schema и происходит попытка залогиниться под пользователем System

                  Чтобы перекомпилировать триггер, используйте команду alter trigger.

                  Исключения в триггерах

                  В случае, если в триггере возникает исключение, вся операция откатывается (включая любые изменения, сделанные внутри триггера). Исключения из этого:

                  • Если событие триггера after startup on database или before shutdown on database
                  • Если событие триггера after logon on database и пользователь имеет привилегию administer database trigger
                  • Если событие триггера after logon on schema и пользователь или является владельцем схемы, или имеет привилегию alter any trigger

                  Порядок выполнения триггеров

                  Конструкция trigger_ordering_clause:

                  1. Сначала выполняются все before statement триггера
                  2. Потом все before each row триггера
                  3. После все after each row триггера
                  4. И в конце все after statement триггера

                  Чтобы задать явно порядок выполнения триггеров, срабатывающих в одинаковый момент времени (потому что по умолчанию такой порядок не определен), используйте конструкции follows и precedes.

                  Включение/отключение триггеров

                  Это может понадобиться, например, для загрузки большого объема информации в таблицу.
                  Выполнить включение/отключение триггера можно с помощью команды:

                  ALTER TRIGGER [schema.]trigger_name { ENABLE | DISABLE };
                  

                  Чтобы включить/отключить сразу все триггеры на таблице:

                  ALTER TABLE table_name { ENABLE | DISABLE } ALL TRIGGERS;
                  

                  Для изменения триггера можно или воспользоваться командой Create or replace trigger, или сначала удалить триггер drop trigger, а потом создать заново create trigger.
                  Операция alter trigger позволяет только включить/отключить триггер, скомпилировать его или переименовать.
                  Компиляция триггера:

                  alter trigger TRIGGER_NAME compile;
                  

                  Права для операций с триггерами

                  Для работы с триггерами даже в своей схеме необходима привилегия create trigger, она дает права на создание, изменение и удаление.

                  grant create trigger to USER;
                  

                  Для работы с триггерами во всех других схемах необходима привилегия * any trigger. Обратите внимание, что права даются отдельно на создание, изменение и удаление.

                  grant create any trigger to USER;
                  grant alter any trigger to USER;
                  grant drop any trigger to USER; 
                  

                  Для работы с системными триггерами уровня DATABASE необходима привилегия ADMINISTER DATABASE TRIGGER.

                  grant ADMINISTER DATABASE TRIGGER to USER; 
                  

                  Словари данных с информацией о триггерах:

                  • dba_triggers – информация о триггерах
                  • dba_source — код тела триггера
                  • dba_objects – валидность триггера

                  Видео-запись лекции, по материалам которой и была написана эта статья:

                  Множество других видео по темам Oracle можно найти на этом канале: www.youtube.com/c/MoscowDevelopmentTeam

                  Другие статьи по Oracle

                  Все о коллекциях в Oracle

                  Понравилась статья? Поделить с друзьями:
                • Апу химки официальный сайт руководство
                • Прокуратура города белгорода руководство
                • Синекод инструкция по применению взрослым сироп от сухого кашля
                • Азитромицин 500 инструкция по применению взрослым при простуде
                • Huter bs 45m инструкция по эксплуатации бензопила