CRM gokalex
The software I run my own business with: invoices with their e-invoicing status, payments, hosting and domain renewals, to-dos.

- Client
- in-house
- Work
- business web app and PWA
- Technology
- PHP 8.3 with no framework, SQLite and MySQL, JavaScript, Python, fatturapa.com API, PWA
What it does
Invoices come in from fatturapa.com with their status in SDI, the Italian e-invoicing system. For each one I record deposits and balances, and the amount still due works itself out. Payments can also be read from the bank statement: when the payment reference quotes the invoice number and the amount matches, the CRM marks the invoice as paid on its own; the other cases wait for a confirmation.
Each client's hosting, domain and service renewals sit in a list with the yearly total and in a calendar, which I also follow from Google Calendar through a private iCal address. When a service is renewed, the client gets the confirmation email.
To-dos take attachments (a pasted screenshot too) and the time worked, which becomes the draft invoice on fatturapa.com.
It replaced a spreadsheet with 18 sheets, which can still be browsed in an archive with their original formulas.
How it's built
PHP 8.3 with no framework, with SQLite on the development machine and MySQL in production. Importing the old data is a Python script that can run again without creating duplicates. It installs on the phone as a PWA and has a page for when there's no connection.

An invoice with the deposit received and the form to record the balance 
Hosting, domain and privacy renewals per client, with the yearly total 
Calendar of the month's renewals
The screens of the software come from test copies filled with made-up data.
