Skip to content
django-nms

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

  1. 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.
  2. E-invoicing. Invoices with a buyer tax ID go into batch sessions and come back with an official number and hash.
  3. PDF. Invoice with amount in words, VAT summary, balance and QR code. A separate PDF with the itemised call list for VoIP numbers.
  4. 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.