A quick update on what's shipped since my last post.
---
The main thing: affiliates
I added an affiliate programme to Income Refinery Pro. If you're a Pro user and you want to share it with your audience or friends, you can now sign up at the Lemon Squeezy affiliate hub, paste your referral link into Settings → Affiliates, and optionally set a discount code.
A few decisions behind how I built it:
I didn't hard-code the commission rate anywhere in the product. The settings panel just says: "Give your audience a discount code — they save on Pro, you earn a commission." No percentage. I made this choice because Lemon Squeezy lets me change the rate from the dashboard, and I didn't want copy in the app becoming stale or misleading. Small thing, but I'm glad I caught it before shipping.
The share card gets a referral QR code. Income Refinery Pro has a "Share Your Progress" feature — you can export a 1080×1080 image of your monthly income, FI milestone progress, and projected FI date to share wherever you want. When you have an affiliate link saved, a new checkbox appears: "Include my affiliate QR code — earn commission on referrals." Tick it, and a QR code for your affiliate URL is printed in the lower-left corner of the card, with your discount code shown right next to it.
The practical idea: your income milestone post becomes a referral tool without any extra steps. Post your progress, someone scans the QR, buys Pro, you earn.
Getting the QR code right took three attempts. First I tried lazy-loading a library from a CDN — worked in the browser but the async timing meant the QR rendered after the canvas snapshot, so downloaded cards came out blank. Then I wrote my own encoder from scratch. Passed ES5 validation, looked reasonable in the preview. Turned out it had 454 module-level errors — Google Lens could decode it, my phone's native scanner could not. Third attempt: I pulled qrcode-generator v1.4.4 from the npm registry (it's MIT, ~57KB) and embedded it directly in the HTML file. Synchronous, offline, no external dependencies. Scannable on the first try.
I also had to increase the cell size from ~3px to 5px per module and bake in a proper 4-module quiet zone. Hardware-level QR scanners are less forgiving than AI-assisted ones.
---
A bug fix: Dividend Health was silently breaking on re-import
Income Refinery Pro has a Dividend Health Panel that tracks DPU (dividend per unit) trends — whether a holding is growing, flat, or has cut its dividend — based on historical payment events. The AI import prompt generates one row per dividend event per holding, which is what populates this.
A user reported that Dividend Health stopped showing data after re-importing their holdings spreadsheet. I traced it to two places:
1. The import commit function had two paths: "add new holding" and "update existing holding." The new-holding path correctly wrote dpuHistory, dpuTrend, and dpuTrendDetail onto the counter. The update path did not — it updated name, units, DPU, and months, then stopped. So every time someone re-imported to refresh their data, the trend fields got silently dropped from any holding that already existed.
2. The CSV parser was misreading a specific multi-row format where historical dividend events stored the DPU value in the Units column (because the DPU column was left blank on non-representative rows). The parser was collecting those rows as having units=0.03, amount=null — they passed the filter but produced zero events. The fix: when a row has an ex-date, no DPU, and a "units" value that's much smaller than the group's representative unit count, treat that units value as the event DPU. Threshold is < 10% of the rep unit count, capped at 1000.
---
Where things stand
Still pre-Product Hunt launch — aiming for late July. No revenue yet. The product is live and free at incomerefinery.com, Pro is $49 one-time at the link in my profile.
Happy to answer questions on any of the above.
The thing I'd be careful with before Product Hunt is that none of the features you described are actually why someone buys the product.
Dividend Health, forecasts, exports, rental income, FX conversion, affiliate sharing — those are all implementation details.
The bigger question is what job the product owns.
Is it a dividend tracker?
A passive-income dashboard?
Or is it the place someone goes to answer one question:
"How close am I to replacing my income?"
That positioning decision probably matters more than the next feature, because it changes how people evaluate everything else.
Happy to put the tighter positioning angle in writing if useful. I'd be careful not to let Product Hunt become the first large-scale test of the wrong story.