Projects
I build working tools: automation, workpapers, and processes that turn scattered data into information that is ordered, reviewable, and usable.
These are not practice exercises. Each one came out of a real problem: hours of manual data entry, files that do not reconcile, processes only one person knew how to run.
Most come from accounting and tax work, but the rule is always the same: Excel when the end user has to be able to open, understand, and audit the result; Python when volume or repetition make doing it by hand stop making sense.
Many of these tools connect to Mexico's tax authority (the SAT) on the data side —CFDI, DIOT— and to accounting systems like CONTPAQi on the loading and posting side.
SAT → accounting-system automator
The problem
Every month, booking a firm's CFDIs means opening XML after XML, deciding the expense account for each one, building the journal entry, and keying the DIOT separately. It is slow, and a mistake goes unnoticed until the entry does not balance.
What it does
It reads the XML folder (loose or zipped) and pulls everything from the CFDI 4.0: issuer, recipient, 16/8% VAT, excise tax, withholdings, UUID, PUE/PPD payment method, payment complements, and related documents. It checks each UUID's status against the SAT (valid or cancelled) and generates journal entries ready to import into CONTPAQi 18.5.2, plus the DIOT TXT in the SAT's batch format.
What sets it apart
The expense account is predicted by a machine-learning model trained per company. Every time you correct an account in the review spreadsheet, the model learns and classifies better the next month. Before writing any file it checks that debits = credits on every entry and reports the accounts it could not assign.
Tools Python, scikit-learn, SQLite
CFDI anonymizer
The problem
Teaching with real cases needs real data. But a CFDI carries clients' tax IDs, names, and company names that cannot be shown in a course, a screenshot, or a sample file.
What it does
It turns real CFDIs into anonymized copies: it swaps tax IDs, names, and company names for consistent fake data —the same vendor always gets the same alias— and keeps amounts, taxes, line items, and dates so the exercises still reconcile. The mapping is stored in SQLite, so the process is reversible.
An honest note
The anonymized files are not valid with the SAT (the digital seal no longer matches); they are for demos, courses, and testing, not for stamping.
Tools Python, lxml, SQLite
CFDI processor
The problem
A client sends a folder with hundreds of mixed XMLs: invoices, payroll, payment complements, versions 3.3 and 4.0 all jumbled together. Before you can review anything, they have to be sorted —and once sorted, there's still the manual work of building the fiscal workpaper on top.
What it does
It auto-detects each document's version and type (CFDI 3.3 and 4.0, Payroll 1.2, Payments 2.0) and exports everything to an Excel workbook with one sheet per document type, loose or zipped XML. A viewer with a per-tab filter lets you review before exporting, and a filtered export mirrors exactly what's on screen —filtered stays filtered, complete stays complete, never the other way around. It also exports to CSV with SAT catalog values normalized (code and description, never just one), built to feed an AI without it having to guess the catalog.
What sets it apart
It builds a cash-basis VAT workpaper inside the same Excel file: it recognizes each PUE-method CFDI in its issue month and each PPD-method one in whichever month its payment complement actually pays it —a PPD invoice with no matching payment complement in the batch is flagged "provisioned," not yet deductible or creditable— with the legal basis (specific VAT law articles) cited on its own sheet.
An honest note
This is the tool I run daily in my own practice, not a demo. It's still actively growing: a multi-period historical vault and direct SAT status validation (valid/cancelled) haven't been built yet.
Tools Python, PySide6, pandas, openpyxl
Accounting & tax workpapers
The problem
Workpapers get rebuilt every year, and when the format lives only in the head of whoever built it, no one else can maintain it.
What it does
An Excel workpaper system generated from code: formulas, queries, and macros versioned separately, and the final workbook is assembled by a build script instead of being hand-edited every year.
Tools Excel (macros), Power Query, Python
SISUB / ICSOE automator
The problem
Every four months, filing the SISUB and ICSOE means cross-referencing two Excel layouts by hand, writing formulas between files for fixed earnings, editing the previous period's CSV by changing the quarter and year, and keying each contract into a 6-step web wizard —bulk upload only unlocks above 20 workers per contract, and most have 2 to 4.
What it does
Builds a single master table (worker × contract × date range) from payroll XML and Mexico's SUA contribution files, with a defined source hierarchy for each field —for example, the integrated daily wage comes from the payroll XML first and only falls back to SUA or a calculation when that's missing. From that one table it projects the 3 SISUB CSVs, the ICSOE CSV/Excel, and the firm's control workbook, replacing the VBA macros it used to run on. Before generating anything it runs a validation rule catalog that points to the exact contract, worker ID, and row behind each error.
What sets it apart
The ICSOE web-wizard automation (via Playwright) never signs on its own: by default it leaves the filing captured and sitting on the government portal's signature screen, validated and ready, but the actual "Sign" click is always a person's. The only two irreversible steps in the whole flow are gated behind an explicit permission in the code, not good intentions.
Tools Python, SQLAlchemy, Playwright
Tax-portal document automator (SAT/IMSS/INFONAVIT)
The problem
Every month, pulling compliance documents for an entire client roster means logging into each portal one RFC at a time, solving CAPTCHAs by hand, and saving every PDF manually.
What it does
Designed to log into the SAT, IMSS, and INFONAVIT portals once a month for a whole roster of RFCs and download the SAT's tax-status certificate and compliance opinion, plus the IMSS/INFONAVIT equivalents for clients with employees, with a run log that pauses and asks for human help only when it truly cannot continue.
What sets it apart
A small core that knows nothing about any specific portal (credentials, secrets, CAPTCHA, human pause, logging) plus one small adapter per portal that does. Two of the three domains sit behind a commercial bot manager (Imperva/Incapsula, Akamai), so the browser always runs visibly, with a persistent profile and human-like pacing, and login is never retried in a loop. The SAT CAPTCHA solver —previously a Chrome extension running a local ONNX model— was ported to Python to reuse the same core here.
An honest note
Actively in progress: right now only the e.firma login against the real IMSS portal (ICSOE) is done. Actually downloading the certificates —the end goal— is the next phase, not built yet.
Tools Python, Playwright, ONNX Runtime
Other tools
- Bulk REP loader
Loads payment complements into the accounting system through its SDK, in bulk instead of one by one.
.NET
- CFDI renamer
Renames whole batches of XML by whatever rule you need, instead of file by file.
Python
- Reporter
Operational reports straight from the accounting system's database; currently, an active-employee roster.
Python
- DIOT generator
Builds the period's DIOT from received CFDIs, in the batch format the SAT requires.
Python
Web projects
- This blog (Excel SolutionsV)
The site you're looking at right now. React + Vite on the frontend, Express + MongoDB on the backend, with a custom server-rendering middleware so Google indexes the content without depending on JavaScript.
React, Express, MongoDB, GSAP
- Personal portfolio
Portfolio built with React and TypeScript, deployed separately from the blog.
React, TypeScript
- Crónicas del Vejerete
Personal blog built with Next.js.
Next.js, TypeScript
- Pura Vida Vallarta
Marketing site for a tour operator in Puerto Vallarta, built with Next.js and Sanity as a headless CMS.
Next.js, Sanity
Need help with your Excel workflow?
Formula troubleshooting, automation, custom dashboards, or general consulting — tell me what you're stuck on and I'll reply within two business days.
Get Excel help