Automation and notifications
The first of the month in one run
Invoice generation, e-invoicing, PDF creation and the customer e-mail are one action on the invoice list. The job queue does the rest in the background.
- "Full process" action with or without e-invoicing
- Dunning e-mails per invoice, per customer or in bulk for negative balances
- Automatic contract renewal with notices 30 and 5 days before expiry
The full process, step by step
- Generation. For every active contract an invoice is built from subscriptions, unpaid one-off services and VoIP calls. Chained contracts (previous/next) are not invoiced twice.
- E-invoicing. Invoices with a buyer tax ID go into batch sessions and come back with an official number and hash.
- PDF. Invoice with amount in words, VAT summary, balance and QR code. A separate PDF with the itemised call list for VoIP numbers.
- E-mail. According to the contract setting: to the payer, the recipient or both. Postal invoices go as a list to customer service. Sending creates an outcome entry in the ledger.
Every step has a state flag (complete, PDF, ready to send, sent), so the process can resume from where it stopped.
Notifications and the contract lifecycle
-
E-mail through AWS SES
Templates editable in the panel, CSS inlined, per-second sending throttle, attachments, mass messages to selected customers.
-
SMS through SMSAPI
SMS notifications about invoices, reminders and blocks.
-
Dunning
Overdue reminder from the invoice list, the customer card or in bulk from the balance list. Regulatory notice with attachment: on the roadmap.
-
Automatic renewal
E-mail 30 and 5 days before contract end, then a new contract with or without discount and a confirmation to the customer. Manual action or scheduled job.
-
Internal notifications
A contract change e-mails a link to the history to the group responsible for contracts.
-
Planned
Automatic block for arrears
Rule: negative balance and due date exceeded by N days, then reminder, then soft or hard block of the host. On the roadmap.
Job queues instead of loading spinners
Long operations (invoices, statement import, regulator reports, e-mail sending) go to a Redis queue and run in the background. Periodic tasks (session refresh every 60 s, hourly deactivation of expired hosts) run through Celery beat. The queue panel is in the admin, errors go to Sentry.
- django-rq for one-off jobs, Celery for periodic ones
- Docker composition: web, worker, celery-worker, celery-beat, PostgreSQL, Redis
- Ansible deployment for cloud and on-premise
How many hours a month does invoicing cost you?
On the demo we count it together and show which steps disappear.