Part 1Marc de Batlle
0%
Part 1Marc de Batlle
All work01 / 11
Two

Renda 2025 CRMA Microsoft-native CRM that got a one-person tax advisory through income tax season.

Chapter concepts
  1. 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.
  2. 2Role: Freelance: sole designer and developer. Status: Deployed.
  3. 3Stack: Power Apps, Power Automate, SharePoint, Excel Online, Outlook.
  4. 4Key figure: 250+ clients, one tax season, zero new subscriptions.
01
Period2026
RoleFreelance: sole designer and developer
StatusDeployed

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.

252

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.

Four tabs
  1. 1Dashboard: a live snapshot of the whole campaign, colour-coded by state, with a priority queue of who needs attention today
  2. 2Tracking: every client's recent emails next to their status, with filters for missing documents, no contact yet, and 14+ days without a reply
  3. 3Invoicing: one click fires a flow that fills the Excel template, saves it to the right folder and updates the client's state
  4. 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.

Exhibit 2-5
The invoice flow, GenerarFacturaR25
  1. 1.Generate invoice (Power Apps trigger)
  2. 2.Copy the Excel template under a dynamic name
  3. 3.List the template's rows
  4. 4.Clear the seed row
  5. 5.Add the client's row
  6. 6.Save to the campaign folder on OneDrive
  7. 7.Respond OK, app sets state to Acabada
Exhibit 2-6
Data layer
WhereWhat
SharePoint list252 client records, the single source of truth
State11-value choice column driving colours and filters
PriorityOrder field behind the dashboard queue
Fees2022, 2023, 2024 history; 2025 editable, 2023 as fallback
LanguagePer-client, so the invoice comes out in the right one
Excel templateOne seed row that the flow replaces per invoice
OutlookRead 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.

Patterns that held up
  1. 1Dates as text: yyyy-mm-dd, lowercase mm, before anything touches Excel
  2. 2Reset inputs: a boolean set on screen open, so the form refreshes when the selected client changes
  3. 3Guarded flow calls: wrapped in IfError with a busy flag that disables the button while the flow runs
  4. 4Validate first: required fields checked in the app before the flow is called
  5. 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.

At a glance
ClientConsultoria Sostenible, tax advisory
Users1 advisor, 252 client records
StackPower Apps, Power Automate, SharePoint, Excel Online, Outlook
CostZero new subscriptions
RoleSole designer and developer
StatusDeployed, ran the 2025 campaign
Continue
Previous chapterTrip-Setter
Next chapterDonants de Veu