Перейти к содержимому

Уведомления о новых регистрациях и первых продажах

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

  • Только на сервере. Хук вешаем в обработчик регистрации и вебхук платежей, а не на клиенте — иначе токен утечёт и любой сможет слать вам пуши.
  • Дайджест против шторма. Если регистраций много, не шлите пуш на каждую — копите счётчик и присылайте раз в день. Мгновенный пуш оставьте для оплат.
  • Первая продажа — это событие. Отметьте её отдельно и погромче: такое случается один раз.

Берём notify() из обзорной страницы — в Python это две строки:

import os, requests
def notify(title, message, priority=5):
requests.post(
f"{os.environ['NOTIFLY_URL']}/message",
params={"token": os.environ["NOTIFLY_TOKEN"]},
json={"title": title, "message": message, "priority": priority},
timeout=5,
)

Хук на регистрацию только копит счётчик, а cron раз в день присылает дайджест:

const {notify} = require('./notifly');
let signupsToday = 0;
// в обработчике регистрации
app.post('/signup', async (req, res) => {
const user = await createUser(req.body);
signupsToday++;
res.json({ok: true});
});
// ежедневный дайджест в 21:00 (node-cron)
const cron = require('node-cron');
cron.schedule('0 21 * * *', () => {
if (signupsToday === 0) return; // тихий день — не шумим
notify('📈 Новые пользователи', `Сегодня зарегистрировалось: ${signupsToday}`, 4);
signupsToday = 0;
});

Мгновенный громкий пуш — только на самую первую оплату:

const {notify} = require('./notifly');
// в обработчике успешной оплаты (или в вебхуке платёжной системы)
async function onPaymentSucceeded(payment) {
const isFirstEver = await db.payments.count() === 1; // это первая продажа в проекте
if (isFirstEver) {
notify(
'🎉 Первая продажа!',
`${payment.amount} ${payment.currency} от ${payment.email}. Оно работает!`,
9
);
} else {
notify('💰 Оплата', `${payment.amount} ${payment.currency} от ${payment.email}`, 5);
}
}
from fastapi import FastAPI
from notifly import notify
app = FastAPI()
signups_today = 0
@app.post("/signup")
async def signup(payload: dict):
global signups_today
await create_user(payload)
signups_today += 1
return {"ok": True}

Дайджест раздаём по расписанию (APScheduler):

from apscheduler.schedulers.background import BackgroundScheduler
def daily_digest():
global signups_today
if signups_today == 0:
return # тихий день — молчим
notify("📈 Новые пользователи", f"Сегодня зарегистрировалось: {signups_today}", 4)
signups_today = 0
sched = BackgroundScheduler()
sched.add_job(daily_digest, "cron", hour=21) # каждый день в 21:00
sched.start()

Мгновенный сигнал о первой продаже:

async def on_payment_succeeded(payment):
is_first_ever = await payments_count() == 1 # первая продажа за всё время
if is_first_ever:
notify(
"🎉 Первая продажа!",
f"{payment['amount']} {payment['currency']} от {payment['email']}. Оно работает!",
9,
)
else:
notify("💰 Оплата", f"{payment['amount']} {payment['currency']} от {payment['email']}", 5)
  • Активация, а не только регистрация. Пуш, когда новый пользователь дошёл до ключевого действия («создал первый проект») — это честнее, чем сам факт signup.
  • Апгрейд тарифа. Переход с free на paid — приятное событие, приоритет 5–6.
  • Отписка/возврат. Тоже стоит знать, но тихо (приоритет 3), чтобы вовремя спросить «что не так».
  • Круглые числа. 100-й, 1000-й пользователь — отдельный громкий пуш.
  • Дофамин для инди-разработчика. «Кто-то только что зарегистрировался» и особенно «первая продажа» — лучшая мотивация продолжать.
  • Пульс проекта в кармане. Дайджест раз в день показывает динамику без открывания дашборда.
  • Без шторма. Регистрации — дайджестом, оплаты — точечно; телефон не звенит без повода.