<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Santiago Garcia</title>
    <description>The latest articles on DEV Community by Santiago Garcia (@santiago_garcia_74ccf8b85).</description>
    <link>https://dev.to/santiago_garcia_74ccf8b85</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3743679%2F5a76aaac-44aa-446a-8762-e0dbc462acaf.jpg</url>
      <title>DEV Community: Santiago Garcia</title>
      <link>https://dev.to/santiago_garcia_74ccf8b85</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/santiago_garcia_74ccf8b85"/>
    <language>en</language>
    <item>
      <title>How to Enrich Transaction Data with One API Call (and Why Your App Needs It)</title>
      <dc:creator>Santiago Garcia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 19:17:02 +0000</pubDate>
      <link>https://dev.to/santiago_garcia_74ccf8b85/how-to-enrich-transaction-data-with-one-api-call-and-why-your-app-needs-it-12en</link>
      <guid>https://dev.to/santiago_garcia_74ccf8b85/how-to-enrich-transaction-data-with-one-api-call-and-why-your-app-needs-it-12en</guid>
      <description>&lt;p&gt;If you've ever built a fintech app, a personal finance dashboard, or any product that deals with bank transactions, you know the pain: raw transaction strings like &lt;code&gt;NFLX*NETFLIX.COM&lt;/code&gt;, &lt;code&gt;AMZN MKTP US&lt;/code&gt;, or &lt;code&gt;SQ *BLUE BOTTLE&lt;/code&gt; are completely useless to end users.&lt;/p&gt;

&lt;p&gt;Decoding those strings manually — matching them to real merchant names, categories, logos, and contact info — is a rabbit hole that costs weeks of engineering time and never quite works well enough.&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;transaction data enrichment&lt;/strong&gt; APIs come in. And in this post, I'll walk you through how to integrate one in literally three steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Enrich Transaction Data?
&lt;/h2&gt;

&lt;p&gt;Before we get into the code, let's think about what enriched data unlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better UX&lt;/strong&gt;: Show "Netflix" with a logo instead of "NFLX*NETFLIX.COM 866-579-7172 CA"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smarter categorization&lt;/strong&gt;: Automatically tag spending as "Streaming", "Food &amp;amp; Drink", "Travel", etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription detection&lt;/strong&gt;: Know which charges are recurring without building your own ML model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact info on demand&lt;/strong&gt;: Let users reach out to merchants directly from your app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carbon footprint insights&lt;/strong&gt;: Some APIs even return CO2 impact data per merchant category&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this becomes possible when you stop treating transaction data as a raw string and start treating it as structured, enrichable information.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API Approach
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://easyenrichment.com/" rel="noopener noreferrer"&gt;Easy Enrichment&lt;/a&gt; is a transaction data intelligence platform that takes a raw bank transaction description and returns 20+ structured fields in a single API call. Let's see how it works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Get Your API Key
&lt;/h3&gt;

&lt;p&gt;Sign up at &lt;a href="https://easyenrichment.com/" rel="noopener noreferrer"&gt;easyenrichment.com&lt;/a&gt; — it's free to start, no credit card required. You'll get an API key instantly from the dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Make Your First Request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.easyenrichment.com/enrich &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer enrich_YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"merchantName": "AMZN MKTP US"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Use the Response
&lt;/h3&gt;

&lt;p&gt;The response comes back with everything you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"merchant_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Amazon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shopping"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subcategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"marketplace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logo_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://img.logo.dev/amazon.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amazon.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcc_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5999"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"is_subscription"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"is_online_only"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contact_phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1 888-280-4331"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contact_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cs-reply@amazon.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. One API call. 20+ fields. No complex setup, no training your own model, no maintaining merchant databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript Integration Example
&lt;/h2&gt;

&lt;p&gt;Here's how you'd integrate this in a Node.js backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;enrichTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawDescription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.easyenrichment.com/enrich&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ENRICHMENT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;merchantName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rawDescription&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Enrichment failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;txData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;enrichTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NFLX*NETFLIX.COM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;merchant_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "Netflix"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// "streaming"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logo_url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// "https://img.logo.dev/netflix.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The 5 Endpoints You Get
&lt;/h2&gt;

&lt;p&gt;Easy Enrichment isn't just for bank transactions. The API covers five data types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;POST /enrich&lt;/code&gt;&lt;/strong&gt; — Bank transaction codes → merchant data (1¢/req)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;POST /enrich/company&lt;/code&gt;&lt;/strong&gt; — Company name → industry, size, HQ, social profiles (2¢/req)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;POST /enrich/domain&lt;/code&gt;&lt;/strong&gt; — Website URL → company info, tech stack, contacts (1¢/req)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;POST /enrich/social&lt;/code&gt;&lt;/strong&gt; — Person name → LinkedIn, Twitter, Instagram, YouTube (1¢/req)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;POST /enrich/person&lt;/code&gt;&lt;/strong&gt; — Person name → job title, company, location (2¢/req)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For most fintech use cases, &lt;code&gt;/enrich&lt;/code&gt; is your primary endpoint. But if you're building something like a CRM or a B2B tool, the company and person endpoints are incredibly useful too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing: Pay Per Request, No Subscriptions
&lt;/h2&gt;

&lt;p&gt;One thing I appreciate about this model: &lt;strong&gt;no monthly minimums, no commitments&lt;/strong&gt;. You top up your balance (starting from $10) and pay per request. For most apps at early stages, you're looking at pennies per day.&lt;/p&gt;

&lt;p&gt;Compared to building and maintaining your own merchant recognition system — which could easily be a 3-6 month engineering project — this is a no-brainer.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Data Enrichment
&lt;/h2&gt;

&lt;p&gt;Here are some concrete use cases where this API shines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personal finance apps&lt;/strong&gt;: Categorize and display transactions with merchant logos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expense management tools&lt;/strong&gt;: Auto-classify business expenses by MCC code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Banking apps&lt;/strong&gt;: Give users clear merchant names and contact info when they dispute charges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounting software&lt;/strong&gt;: Link transactions to company profiles and invoice data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription trackers&lt;/strong&gt;: Identify recurring charges automatically using &lt;code&gt;is_subscription&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Transaction data enrichment is one of those things that seems like a small UX improvement but actually unlocks a huge amount of product functionality. Instead of showing users cryptic bank codes, you can show them real merchant names, logos, categories, and contact info.&lt;/p&gt;

&lt;p&gt;If you're building in the fintech space and want to skip the months of work required to build this yourself, give &lt;a href="https://easyenrichment.com/" rel="noopener noreferrer"&gt;Easy Enrichment&lt;/a&gt; a try — the free tier is generous and the API is straightforward to integrate.&lt;/p&gt;

&lt;p&gt;Have questions or built something cool with transaction enrichment? Drop a comment below!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: I'm sharing this tool because I found it useful for a project. Always evaluate APIs based on your own use case and requirements.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>fintech</category>
    </item>
    <item>
      <title>I built a free invoicing tool that lets AI create invoices for you (and why I almost didn't)</title>
      <dc:creator>Santiago Garcia</dc:creator>
      <pubDate>Tue, 17 Mar 2026 09:47:00 +0000</pubDate>
      <link>https://dev.to/santiago_garcia_74ccf8b85/i-built-a-free-invoicing-tool-that-lets-ai-create-invoices-for-you-and-why-i-almost-didnt-5fc5</link>
      <guid>https://dev.to/santiago_garcia_74ccf8b85/i-built-a-free-invoicing-tool-that-lets-ai-create-invoices-for-you-and-why-i-almost-didnt-5fc5</guid>
      <description>&lt;p&gt;Hi, I'm Santiago García — freelance developer based in Haarlem, Netherlands, originally from Argentina.&lt;br&gt;
Like most freelancers, I hate invoicing. Not the money part — the process. Open Excel, copy the template, fill in the client, calculate VAT, export PDF, attach to email, pray they pay. Every. Single. Time.&lt;br&gt;
I built FacturaHub to fix that for myself. Then I realized it could fix it for a lot of people.&lt;br&gt;
What it is&lt;br&gt;
FacturaHub is an MCP server that connects AI assistants like Claude or Cursor directly to your invoicing. Instead of clicking through a UI, you just tell your AI:&lt;/p&gt;

&lt;p&gt;"Create an invoice for Acme for €2,500 for web development"&lt;/p&gt;

&lt;p&gt;And it's done. Client created if new, VAT applied, PDF generated, ready to send.&lt;br&gt;
That's it. No forms. No clicking. No context switching.&lt;br&gt;
Why MCP and not just an API?&lt;br&gt;
I could have built a regular REST API. But MCP (Model Context Protocol) changes the dynamic completely — instead of you calling the tool, your AI calls it on your behalf, with full context of the conversation. It's the difference between a calculator and an accountant.&lt;br&gt;
The moment I saw Claude use create_invoice mid-conversation, without me touching anything, I knew this was the right approach.&lt;br&gt;
What it does today (all free, no limits)&lt;/p&gt;

&lt;p&gt;Invoices, expenses, clients — unlimited&lt;br&gt;
Profit &amp;amp; Loss reports, VAT balance, cash flow projections&lt;br&gt;
Professional PDF with IBAN and SWIFT&lt;br&gt;
Electronic invoicing: Spain (Verifactu + Facturae 3.2.2), Mexico (CFDI 4.0), Argentina (AFIP/ARCA), Colombia (DIAN), Panama (DGI)&lt;br&gt;
20 MCP tools, compatible with Claude Desktop and Cursor&lt;br&gt;
One command to install: npx -y facturahub setup --api-key=YOUR_KEY&lt;/p&gt;

&lt;p&gt;The compliance part (the boring but important bit)&lt;br&gt;
Spain's invoicing law changed in 2024 (Orden HAC/1177/2024 + RD 1007/2023). Verifactu is now mandatory for new software. FacturaHub generates the QR code, the Facturae 3.2.2 XML, validates NIF/CIF checksum, finds your .p12 certificate automatically and submits to AEAT. No third party. No extra fees.&lt;br&gt;
Why free?&lt;br&gt;
Because the real problem isn't the invoice — it's the accounting that comes after. Entries, quarterly VAT, annual income tax. That's where freelancers drown. That's where the next tier (Gestor+) comes in: a certified accountant assigned to you, directly inside the app, starting at €29/month. The invoicing software opens the door. The accountant closes the deal.&lt;br&gt;
Numbers so far&lt;/p&gt;

&lt;p&gt;613 weekly npm downloads (and growing — because npx -y facturahub@latest re-downloads on every Claude Desktop launch)&lt;br&gt;
20+ countries supported&lt;br&gt;
Built solo, launched in production&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
→ facturahub.com&lt;br&gt;
→ npx -y facturahub setup --api-key=YOUR_KEY&lt;br&gt;
Happy to answer questions — especially about MCP integration, Verifactu, or the AFIP/AEAT submission flow.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>fintech</category>
    </item>
  </channel>
</rss>
