Original Idea
Multi-Currency Invoicing A web app that applies live FX rates, local tax templates, and localized invoices.
Product Requirements Document (PRD): GlobalBill Multi-Currency Invoicing
1. Executive Summary
GlobalBill is a next-generation SaaS invoicing platform designed for the 2026 international business landscape. It automates the complexity of multi-currency billing by integrating real-time FX rates, localized tax compliance engines (VAT/GST), and dynamic PDF generation. By utilizing a "Three-Currency" ledger model, GlobalBill allows businesses to bill in any currency while maintaining crystal-clear internal reporting in their base currency, effectively neutralizing the "currency noise" of global trade.
2. Problem Statement
International businesses lose an estimated 3-5% of revenue annually due to:
- Manual FX Calculation Errors: Using outdated or "google-searched" rates that don't reflect actual settlement values.
- Tax Non-Compliance: Failure to adhere to shifting global mandates like the EU’s "VAT in the Digital Age" (ViDA).
- FX Volatility: Lack of visibility into realized vs. unrealized gains/losses, making financial forecasting difficult.
- Localized Friction: Invoices that aren't formatted to local standards (date formats, currency symbols) lead to delayed client payments.
3. Goals & Success Metrics
- Goal 1: Reduce invoice generation time for international clients by 70%.
- Goal 2: Eliminate manual tax calculation errors via API-first compliance.
- Goal 3: Provide 100% visibility into FX impact on revenue.
Success Metrics:
- North Star: Time elapsed from "Invoice Created" to "Payment Settled."
- Accuracy: Zero discrepancies between billed tax and reported tax during audits.
- Retention: Percentage of users utilizing more than 3 distinct billing currencies.
4. User Personas
- Freelancer Fiona: Works for clients in the US, EU, and UAE. Needs a simple way to send professional, localized invoices without being an expert in VAT.
- Agency Alex: Managing Director of a 20-person consulting firm. Needs high-level "Revenue Bridge" reports to see how currency fluctuations affect their bottom line.
- SaaS Sam: Founder of a global software startup. Needs automated recurring billing that handles localized tax for 100+ countries via Stripe.
5. User Stories
- As a Freelancer, I want to select a client's country and have the app automatically suggest the correct tax rate and currency, so that I don't send an illegal invoice.
- As a Financial Controller, I want to see a "Waterfall Chart" of my revenue, isolating the impact of FX fluctuations, so that I can explain revenue drops to stakeholders.
- As a Client, I want to receive an invoice in my local language and currency with a "Pay Now" link that supports my local payment methods (e.g., SEPA, iDEAL), so that I can pay quickly.
- As an Admin, I want the system to fetch the spot rate at the moment of invoice issuance and "freeze" it, so that my audit trail is immutable.
6. Functional Requirements
6.1. Core Invoicing & FX Engine
- Real-time FX Synchronization: Integration with Open Exchange Rates API.
- Three-Currency Ledger: Every transaction must record:
- Transaction Currency (TC): What the client sees.
- Functional Currency (FC): The business's local book currency.
- Reporting Currency (RC): For consolidated global reporting.
- Spot Rate Freeze: The exchange rate must be captured at the
issued_attimestamp and stored permanently on the invoice record.
6.2. Localized Tax Engine
- Automated VAT/GST/Sales Tax: Integration with Stripe Tax or Kintsugi to calculate taxes based on the client's tax jurisdiction and product type.
- Tax ID Validation: Real-time VIES/local database validation for B2B tax-exempt transactions.
6.3. Document Generation
- Dynamic PDF Engine: Using Puppeteer to render HTML-to-PDF, supporting text expansion (e.g., German translations) and Unicode characters.
- Intl-Standard Formatting: Automated formatting of dates (DD/MM/YYYY vs MM/DD/YYYY) and currency symbols ($100 vs 100 €) based on BCP 47 locale tags.
6.4. Reporting & Analytics
- FX Bridge Analysis: Dashboard visualizing the bridge from "Constant Currency Revenue" to "Reported Revenue."
- Realized vs. Unrealized Tracking: Automatic calculation of G/L when a payment is marked as settled at a different rate than the issued date.
7. Technical Requirements
7.1. Tech Stack (2026 Standards)
- Frontend: React v20.0.x (patched for CVE-2025-55182), TypeScript 5.7+, Tailwind CSS v4.1.18 (Oxide engine).
- Backend: NestJS v11.1.12 running on Node.js 22 (LTS).
- Database: PostgreSQL 18 (utilizing native UUIDv7 and
TSTZRANGEfor temporal exchange rates). - Caching: Redis (via
cache-manager-redis-yet) for L2 caching of FX rates. - PDF Generation: Puppeteer (Headless Chrome) for HTML-to-PDF rendering.
7.2. Critical Integrations
- Financial Data: Open Exchange Rates API (with SWR caching strategy).
- Payments & Tax: Stripe API (2026 version) using "Multi-currency Settlement" and "Payment Records API."
- Email: SendGrid for localized invoice delivery.
8. Data Model
8.1. Entities
- Organization:
id (uuidv7),name,base_currency (char3),tax_id. - Client:
id (uuidv7),org_id,name,email,default_currency,tax_region (iso_country_code). - ExchangeRate:
id (bigint),pair (char6),rate (numeric 18,8),validity (tstzrange). - Invoice:
id (uuidv7)billed_amount (numeric 19,4)billed_currency (char3)base_amount (numeric 19,4)applied_exchange_rate (numeric 18,8)status (draft, issued, paid, void)
- LineItem:
id,invoice_id,description,quantity,unit_price,tax_rate_applied.
9. API Specification (Key Endpoints)
POST /api/v1/invoices
Request Body:
{
"clientId": "uuid",
"items": [
{ "description": "Consulting", "qty": 10, "unitPrice": 150.00 }
],
"currency": "EUR",
"issueDate": "2026-02-01T10:00:00Z"
}
Response: 201 Created with calculated base_amount and tax_total.
GET /api/v1/reports/fx-impact
Query Params: startDate, endDate, baseCurrency.
Response: Data for waterfall chart (Volume, Price, FX Fluctuation).
10. UI/UX Requirements
- Currency Switcher: A global toggle to view the entire dashboard in "Constant Currency" vs "Actual Rates."
- Invoice Preview: A side-by-side view showing the "Client View" (Localized PDF) and "Accounting View" (Base currency breakdown).
- Data Visualization: Use
Rechartsfor the Revenue Bridge (Waterfall chart).
11. Non-Functional Requirements
- Security: AES-256 encryption for all tax-related identifiers. Implementation of the December 2025 React security patch to mitigate "React2Shell" RCE.
- Performance: <100ms for FX conversion lookups (via L1 memory cache).
- Compliance: Support for Peppol e-invoicing formats required in the EU by 2026.
12. Out of Scope
- Full-scale General Ledger (GL) accounting (Integration with Xero/QuickBooks only).
- Cryptocurrency custody (Payments accepted via Stripe/Crypto.com, but converted to fiat).
- Employee payroll processing.
13. Risks & Mitigations
- Risk: API Downtime for Open Exchange Rates.
- Mitigation: 24-hour fallback to the last successful "Frozen" rate in PostgreSQL and circuit breaker implementation.
- Risk: Rapid Tax Law Changes.
- Mitigation: Outsource calculation logic to Stripe Tax/Anrok rather than hardcoding rates.
- Risk: React2Shell Vulnerability.
- Mitigation: Strict CI/CD linting to ensure no React v20 builds are deployed without the December 2025 security patches.
14. Implementation Tasks
Phase 1: Project Setup
- [ ] Initialize NestJS v11.1.12 with Node.js 22 LTS.
- [ ] Initialize React v20.0.x with Tailwind CSS v4.1.18.
- [ ] Configure PostgreSQL 18 with UUIDv7 extensions.
- [ ] Set up Docker orchestration for local Redis and Postgres instances.
Phase 2: Core FX & Ledger
- [ ] Create
exchange_ratestable withTSTZRANGEtemporal constraints. - [ ] Implement
ExchangeRateServicewith 1-hour Redis caching. - [ ] Build the "Three-Currency" ledger logic in the Invoice Creation service.
- [ ] Implement the calculation for Realized vs. Unrealized gains on payment settlement.
Phase 3: Tax & Document Generation
- [ ] Integrate Stripe Tax API for real-time VAT/GST calculation.
- [ ] Build HTML invoice templates using Tailwind CSS.
- [ ] Implement Puppeteer service for localized PDF generation with i18next support.
- [ ] Add font subsetting for global scripts (CJK, Arabic).
Phase 4: Reporting & UI
- [ ] Create Dashboard UI with Waterfall charts for FX Impact analysis.
- [ ] Build Client Directory with default currency/tax profile settings.
- [ ] Implement "Payment Link" generation using Stripe's dynamic localization.
- [ ] Final security audit for "React2Shell" (CVE-2025-55182) compliance.