Automation and templates
The platform keeps working when nobody is logged in
A built-in scheduler expires points, sends due campaigns, rebuilds segments, runs scenarios, backs up the database and watches its own health. Every job is a console command your team can also run by hand.
- scheduled jobs
- 25
- console commands
- 50
- notification events
- 33
Scheduler
Jobs that run on their own
The scheduler runs as its own service. Daily jobs use fixed clock times so a restart never runs them twice. Each job has a lock, so two copies of the scheduler cannot collide.

| Runs | What it does |
|---|---|
| hourly | Expires points that reached their expiry date |
| hourly | Runs scheduled percentage burns of bonus balances |
| every 5 minutes | Credits bonus grants whose activation date has come |
| every minute | Releases bonus reserves held past their time limit |
| every minute | Expires unconfirmed write-off holds |
| hourly | Switches off rules whose validity period ended |
| hourly | Runs event rules imported from the till system |
| every 5 minutes | Sends campaigns whose time has come |
| hourly | Recomputes dynamic segment membership |
| every minute | Resumes scenarios whose pause is over |
| hourly | Starts birthday and inactivity scenarios |
| hourly | Saves month-end RFM snapshots and e-mails them to administrators |
| daily 02:50 | Deletes logos no form uses any more |
| every 15 minutes | Pulls catalogues from ERP and web shops |
| every 15 minutes | Expires unused shop codes and old webhook deliveries |
| every 5 minutes | Deletes expired marketplace order codes |
| daily 02:30 | Deletes webhook logs older than 30 days |
| every 5 minutes | Starts a backup when its slot is due |
| every minute | Probes platform health, records history and raises alerts |
| daily 02:40 | Deletes resolved alerts past retention |
| every 15 minutes | Re-registers the alert bot webhook when it fails |
| daily 01:00 | Creates next months' partitions for orders, ledger and logs |
| daily 02:15 | Refreshes planner statistics on hot tables |
| every minute | Writes buffered key usage from Redis to the database |
| every 6 hours | Deletes expired password reset tokens |
Notification templates
Ready-made messages for every event
Each new company starts with a full set of default templates in every channel. The company edits text and design, switches events on or off, and campaigns reuse the same channels.
| Event | Channels |
|---|---|
| Sign-in and security | |
| Registration code | E-mail Push SMS Telegram WhatsApp |
| Portal sign-in code | E-mail Push SMS Telegram WhatsApp |
| Confirmation code | E-mail Push SMS Telegram WhatsApp |
| E-mail verification | |
| Password reset | E-mail SMS WhatsApp |
| Password changed | |
| Phone change code | SMS WhatsApp |
| Phone changed | SMS WhatsApp |
| Points and tiers | |
| Points earned | E-mail Push SMS Telegram WhatsApp |
| Points spent | E-mail Push SMS Telegram WhatsApp |
| Write-off code | E-mail Push SMS Telegram WhatsApp |
| Points about to expire | E-mail Push SMS Telegram WhatsApp |
| Points expired | E-mail Push SMS Telegram WhatsApp |
| Tier upgrade | E-mail Push SMS Telegram WhatsApp |
| Tier downgrade | E-mail Push SMS Telegram WhatsApp |
| Bonus package granted | |
| Personal bonus received | |
| Reward unlocked | E-mail Push Telegram |
| Reward claimed | E-mail SMS WhatsApp |
| Engagement and marketing | |
| Welcome | E-mail SMS Telegram WhatsApp |
| Birthday | E-mail Push SMS Telegram WhatsApp |
| Membership anniversary | E-mail Push Telegram |
| We miss you | E-mail SMS Telegram WhatsApp |
| Campaign message | E-mail Push SMS Telegram WhatsApp |
| Special offer | E-mail Push SMS Telegram WhatsApp |
| Purchases and staff | |
| Purchase receipt | |
| Refund | E-mail SMS WhatsApp |
| Order cancelled | E-mail SMS Telegram WhatsApp |
| Monthly RFM report for administrators | |
| Welcome to a new company | |
| Staff password reset | |
| Staff password changed | |
| Profile changed by staff | |
Telegram
Two bots: one for members, one for operators
The member bot of each company links a Telegram chat to a member in one tap: the bot asks the member to share the phone number, matches it to the program and from then on delivers codes, balances and campaign messages.
The platform alert bot sends incidents to the operators' chat and answers commands.
- /status — current health of every component
- /problems — open alerts only
- /help — the list of commands
Console
Every command, with what it does
Commands without a schedule are tools for operators: imports, re-keys, restores and clean-ups.
| Command | What it does | Runs |
|---|---|---|
| Points and rewards | ||
| app:points:expire | Expires points that reached their expiry date | hourly |
| app:bonus:burn | Runs scheduled percentage burns of bonus balances | hourly |
| app:bonus:activate-grants | Credits bonus grants whose activation date has come | every 5 minutes |
| app:bonus-reserves:expire | Releases bonus reserves held past their time limit | every minute |
| app:redemption:expire-holds | Expires unconfirmed write-off holds | every minute |
| app:rules:deactivate-expired | Switches off rules whose validity period ended | hourly |
| app:till:process-triggers | Runs event rules imported from the till system | hourly |
| app:orders:backfill-applied-rules | Freezes the paying rules onto older orders, verifying each replay | on demand |
| Marketing and analytics | ||
| app:campaigns:execute-scheduled | Sends campaigns whose time has come | every 5 minutes |
| app:segments:rebuild | Recomputes dynamic segment membership | hourly |
| app:segments:reassign-tiers | Reassigns tiers linked to a segment | on demand |
| app:scenarios:process-delays | Resumes scenarios whose pause is over | every minute |
| app:scenarios:process-scheduled-triggers | Starts birthday and inactivity scenarios | hourly |
| app:analytics:rfm:monthly | Saves month-end RFM snapshots and e-mails them to administrators | hourly |
| app:analytics:backfill-tier-history | Seeds tier history for members who already have a tier | on demand |
| Members, tenants and imports | ||
| app:members:regenerate-cards | Reissues card numbers from the tenant's card template | on demand |
| app:members:backfill-registration-source | Relabels members with the channel of their integration key | on demand |
| app:tenant:purge-members | Deletes a tenant's members and history, keeping settings | on demand |
| app:tenant:purge-catalog | Deletes a tenant's catalogue for a clean re-import | on demand |
| app:tenant:delete | Deletes a tenant with all of its data | on demand |
| app:super-admin:create | Creates a platform administrator with a one-time password | on demand |
| app:registration-forms:import-logos | Moves sign-up form logos into the database | on demand |
| app:registration-forms:prune-logos | Deletes logos no form uses any more | daily 02:50 |
| Catalogue, shops and webhooks | ||
| app:catalog:sync | Pulls catalogues from ERP and web shops | every 15 minutes |
| app:ecommerce:cleanup | Expires unused shop codes and old webhook deliveries | every 15 minutes |
| app:mp-order-codes:expire | Deletes expired marketplace order codes | every 5 minutes |
| app:webhooks:emit-samples | Sends one sample of every webhook event | on demand |
| app:webhooks:cleanup-logs | Deletes webhook logs older than 30 days | daily 02:30 |
| Backups | ||
| app:backup:dispatch | Starts a backup when its slot is due | every 5 minutes |
| app:backup:database | Dumps the database, rotates copies and uploads to S3 | on demand |
| app:backup:restore | Restores the platform from a backup | on demand |
| app:backup:tenant | Backs up the data of one tenant | on demand |
| app:backup:restore-tenant | Restores one tenant from its backup | on demand |
| Platform operations | ||
| app:health:tick | Probes platform health, records history and raises alerts | every minute |
| app:health:cleanup-alerts | Deletes resolved alerts past retention | daily 02:40 |
| app:health:telegram-webhook-ensure | Re-registers the alert bot webhook when it fails | every 15 minutes |
| app:health:telegram-webhook | Registers the alert bot webhook | on demand |
| app:health:telegram-poll | Runs the alert bot without a webhook | on demand |
| app:telegram:poll | Runs member bots without a webhook | on demand |
| app:outbox:relay | Publishes transactional outbox messages to the broker | on demand |
| app:partitions:create | Creates next months' partitions for orders, ledger and logs | daily 01:00 |
| app:db:analyze | Refreshes planner statistics on hot tables | daily 02:15 |
| app:pos-keys:flush-last-used | Writes buffered key usage from Redis to the database | every minute |
| app:tokens:cleanup | Deletes expired password reset tokens | every 6 hours |
| app:secrets:rekey | Re-encrypts stored secrets with a new key | on demand |
| app:notifications:sandbox | Manages the outbound allow-list for test stands | on demand |
| app:translations:import | Imports interface translations | on demand |
| app:geo:import | Imports the world city directory | on demand |
| app:seed | Fills a development stand with demo data | on demand |
| app:load-test:seed | Generates a high-volume data set for load tests | on demand |