Renda 2025 CRMA Microsoft-native CRM that got a one-person tax advisory through income tax season.
- 1Built for Consultoria Sostenible, a one-person tax advisory with 250+ clients: a campaign tracker on Power Apps, Power Automate and SharePoint, with a live dashboard, email tracking with overdue filters and one-click invoicing, at zero new subscriptions.
- 2Role: Freelance: sole designer and developer. Status: Deployed.
- 3Stack: Power Apps, Power Automate, SharePoint, Excel Online, Outlook.
- 4Key figure: 250+ clients, one tax season, zero new subscriptions.
Why
Small businesses and autónomos, Spain's self-employed professionals, rarely get a seat at the enterprise CRM table. Salesforce and HubSpot are built and priced for teams with dozens of seats, not for one advisor tracking 250 clients out of a spreadsheet that has been growing for years.
So we built it the other way around. Instead of forcing a big platform onto a small business, I built a custom app on top of the Microsoft 365 tools Consultoria Sostenible already paid for. No new subscriptions, no new logins: Power Apps, Power Automate and SharePoint doing the heavy lifting. I was the only designer and developer on it.
The result is Renda 2025, a campaign tracker built to get one advisor through Spain's income tax season without losing a single client in the chaos.
client records on one SharePoint list, worked by one advisor through the 2025 income tax season: four tabs, eleven campaign states, one click to an invoice, and zero new subscriptions.
- 1Dashboard: a live snapshot of the whole campaign, colour-coded by state, with a priority queue of who needs attention today
- 2Tracking: every client's recent emails next to their status, with filters for missing documents, no contact yet, and 14+ days without a reply
- 3Invoicing: one click fires a flow that fills the Excel template, saves it to the right folder and updates the client's state
- 4Clients: a searchable, editable database of every record, with year-over-year fee history at a glance
What she sees
The dashboard is a filterable gallery over the SharePoint list, coloured by eleven campaign states: pending, in progress, filed, ready to invoice, excluded, and the steps in between. A priority field orders the queue, so the question of where the campaign stands is answered in seconds rather than by scrolling rows.
Tracking pulls each client's recent Outlook messages into the same screen as their state. If a client wrote three days ago, it shows immediately; if nobody has written in two weeks, a filter surfaces them. Nothing quietly slips through the cracks.
- 1.Generate invoice (Power Apps trigger)→
- 2.Copy the Excel template under a dynamic name→
- 3.List the template's rows→
- 4.Clear the seed row→
- 5.Add the client's row→
- 6.Save to the campaign folder on OneDrive→
- 7.Respond OK, app sets state to Acabada
| Where | What |
|---|---|
| SharePoint list | 252 client records, the single source of truth |
| State | 11-value choice column driving colours and filters |
| Priority | Order field behind the dashboard queue |
| Fees | 2022, 2023, 2024 history; 2025 editable, 2023 as fallback |
| Language | Per-client, so the invoice comes out in the right one |
| Excel template | One seed row that the flow replaces per invoice |
| Outlook | Read through the Office 365 connector for the tracking tab |
What I learned the hard way
Excel Online does not recalculate formulas when a flow writes to it with no human in the session, so a PDF exported by the flow showed stale totals. I tried delays, recalculation calls and flattening formulas with an Office Script, then made the pragmatic call: the flow delivers the finished XLSX and she opens it, which recalculates on the spot and gives her a chance to review before sending.
Isolated Excel Online sessions return stale reads, so anything that must agree with itself goes through a single Office Script call with all parameters at once. SharePoint's internal column names are the source of truth, not the display names, which is how a column called Renda 2023 with a space, Renda2022 without one and RENDA2024 in capitals all ended up in the same list. Power Apps caches the schema, so a new column needs a manual refresh and a reopened preview. The Excel actions in a flow want the file Id from the copy step and a custom value for the table name, because a dynamic file locks the dropdown.
And the SharePoint recycle bin is a real recovery path: when the client list was deleted by accident mid-campaign, I restored all 252 records from it and diffed them in Python against the last export before anyone noticed.
- 1Dates as text: yyyy-mm-dd, lowercase mm, before anything touches Excel
- 2Reset inputs: a boolean set on screen open, so the form refreshes when the selected client changes
- 3Guarded flow calls: wrapped in IfError with a busy flag that disables the button while the flow runs
- 4Validate first: required fields checked in the app before the flow is called
- 5Patch on success: the client's state is written back only when the flow responds OK
What it changed
None of these are flashy features on their own. What they add up to is time. Before, keeping track of 250 clients meant jumping between spreadsheets, inboxes and hand-written invoices just to answer where things stood. Now that overhead is nearly gone, and the advisor spends her time on the part of the job that matters, advising clients, instead of managing a filing system around them.