Уведомления о новых регистрациях и первых продажах
Пока проект маленький, каждый новый пользователь и особенно первая оплата — это событие. Дашборд открывать лень, а знать «кто-то зарегистрировался прямо сейчас» приятно и полезно. 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, )Node.js (Express)
Заголовок раздела «Node.js (Express)»Хук на регистрацию только копит счётчик, а 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); }}Python (FastAPI)
Заголовок раздела «Python (FastAPI)»from fastapi import FastAPIfrom 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:00sched.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-й пользователь — отдельный громкий пуш.
- Дофамин для инди-разработчика. «Кто-то только что зарегистрировался» и особенно «первая продажа» — лучшая мотивация продолжать.
- Пульс проекта в кармане. Дайджест раз в день показывает динамику без открывания дашборда.
- Без шторма. Регистрации — дайджестом, оплаты — точечно; телефон не звенит без повода.