# Revenue Analytics

Desktop application for reconciling contract revenue against the general ledger, analysing month-over-month (MRR) movements, and tracking Professional Services backlog using Sage Intacct exports.

The application reduces manual reconciliation work by importing Sage Intacct reports into a local SQLite database and providing interactive views for investigating revenue movements, categorising revenue changes, and analysing backlog.

Designed for Revenue Operations, Billing, Revenue Accounting, and Finance teams using Sage Intacct.

---

## Features

- Import Contracts and General Ledger CSV exports from Sage Intacct.
- Build a local SQLite database—no server required.
- Reconcile contract revenue against general ledger activity.
- Automatically categorise recurring revenue movements.
- Assign uncategorised transactions to contracts.
- Persist user-defined contract mappings and movement categories for future imports.
- Drill down from summary figures to the underlying transactions.
- Analyse Professional Services backlog by comparing contract values with billed revenue.

---

## Screenshots

### Contracts View

Displays contract revenue in a pivot table grouped by customer, contract, and revenue source (Projects, Monthly Revenue, Resell).

<img width="719.33" height="552" alt="image" src="https://github.com/user-attachments/assets/74af1873-4b44-4da0-a5ac-9502b26e2957" />
---

### Ledger View

Displays all General Ledger transactions, including manual journal entries and Order Entry invoices that are not linked to contracts.

<img width="1348" height="666.67" alt="image" src="https://github.com/user-attachments/assets/8791d12f-2e12-460c-abf8-8d789fe6ad59" />
---

### MRR Summary

Summarises Month-over-Month recurring revenue movements by category.

Users can immediately identify:

- New Business
- Expansion
- Contraction
- Churn
- Pricing changes
- Other revenue movements
  
  <img width="1355.33" height="694.66" alt="image" src="https://github.com/user-attachments/assets/e9d1fa03-18ae-453e-a7d0-5764378242d7" />

### Automatic Transaction Categorisation

Revenue movements are categorised automatically based on imported data. When automatic categorisation is not possible, users can assign categories manually. These mappings are stored locally and reused during future imports, reducing manual effort over time.
    
<img width="1406.66" height="662.66" alt="image" src="https://github.com/user-attachments/assets/f01a862e-ea47-4739-9fd3-4348010af347" />

Result:
<img width="1360" height="330.66" alt="image" src="https://github.com/user-attachments/assets/c6971a06-279e-47f3-9cae-7ddacd742ffc" />

### Revenue Movement Drill-down

Double-clicking a Month-over-Month movement displays the customers and contracts responsible for that change.

  <img width="1484.66" height="735.33" alt="image" src="https://github.com/user-attachments/assets/733f61ee-4433-411c-9903-ed651f6a5b37" />

Double-clicking a customer difference in the MRR Summary view displays the individual ledger entries contributing to that movement.

  <img width="1116.66" height="643.33" alt="image" src="https://github.com/user-attachments/assets/da8c2f91-ec72-4181-82f3-e5bbc93b8d46" />

  
### Professional Services Backlog

Calculates remaining project backlog by subtracting billed revenue from the total contract value.

Provides an up-to-date view of remaining Professional Services revenue still to be recognised.

  <img width="719.33" height="210.66" alt="image" src="https://github.com/user-attachments/assets/849385bd-63ba-4630-9ed5-890366c91e28" />


### Technology
- Python
- PySide6 (Qt)
- pandas
- SQLite
