MartínGonzález, AI Automation Engineer.

Low-poly portrait of Martín González

AI Automation Engineer

Argentina · UTC-3

Open to a full-time remote role

Now: AI Automation Engineer @ Immigration Finder

I build voice agents and LLM systems that run in production.

Voice agents

LLM pipelines

Integrations

Production

  • 26+voice agents running in production
  • 15+law firms served through my work
  • 10+production bugs found and fixed
  • 3+years automating, since 2023
01About

Hi, I'mMartín.

I build voice agents, LLM pipelines and the integrations around them, and I keep them running after launch. Today I do it for a consultancy that runs CRM and automation systems for 15+ US immigration law firms.

I started automating in 2023, with Bash and PowerShell, as a sysadmin. That is why what I build holds up in production: I have always been the one who keeps it alive afterwards.

I am looking for a full-time remote role. Somos MGZ, further down this page, is where I build independently.

Quick facts

Location
Argentina
Time zone
UTC-3 · 1 to 2 h from US Eastern
Now
AI Automation Engineer · Immigration Finder (contractor)
Languages
Spanish (native) · English (professional working)

How I work

I test against real data, not mocks.

A test row proves the happy path. Real rows prove the system. That habit is how I found 10+ production bugs, a cross-client security hole and two compliance gaps, most of them before the client did.

02Selected work

Things I'vebuilt.

Six systems in production. No client names and no screenshots: the interfaces next to each case are illustrative sketches, not captures of real systems.

01 Editorial agency · book translation QA · 2026

Reviewing whole books, not paragraphs

  • Python
  • python-docx
  • Claude Code
  • Git
books / chapter-pipeline
repair ≤ 3INTEGRITYcode, no LLMREVIEW8 dimensions✓ APPROVEDapply · .docx? 2ND OPINIONvs bible only✕ HUMAN QUEUEquality✕ ESCALATEDafter 3 repairsch.14BOOK BIBLE+1 per chaptercharacterMara Ilvesch.14: "Marah"termthe Covenantch.14: "the Pact"stylepast tense, 3rd personok
Illustrative UI
The problem
An in-house tool machine-translates entire books. Page by page the output looks fine. Across the book it breaks: a character's name changes between chapters, terms drift, and paragraphs get invented, merged or silently dropped.
What I built
A review system that splits the original and the translation into chapters and runs each one through a resumable state machine in Python: integrity checks in plain code first, then an LLM review across 8 dimensions, then reassembly into the final .docx. Every book keeps a bible of characters, terminology and style that each later chapter is checked against.
The hard part
Telling a bad translation from a broken pipeline. Integrity failures (leaked prompt text, truncation, duplicated or untranslated blocks) go to a repair loop with 3 attempts, then to a human. A doubtful verdict never reruns the full review: it gets a narrow second opinion that only asks whether the chapter contradicts the bible. The model never decides the order. The state machine does.
The result
51 books, 1,472 chapters approved, 72 of them settled by second opinion. Along the way, 24 bugs in the upstream translation tool, documented with evidence for IT.

02 Somos MGZ · own product · 2026

Answering five messages as one

  • n8n
  • Redis
  • Chatwoot
  • OpenAI
  • PostgreSQL
whatsapp / burst-buffer
holaquería consultarpor un turnopara mañanaa la tarde?REDIS LISTwa:54929…exec #1last? no → exitexec #2last? no → exitexec #3last? no → exitexec #4last? no → exitexec #5last? yes → reply¡Hola! Sí, mañana a la tardetengo turnos. ¿A qué hora?
Illustrative UI
The problem
People don't send one message. They send five in a row. A bot that answers each one replies five times, out of context, and looks broken.
What I built
A multimodal WhatsApp agent on Chatwoot and n8n, 57 nodes in production. Every incoming message is pushed to a Redis list keyed by phone number. The execution waits, then checks one thing: is the last message in the list still mine?
The hard part
Waiting is not the fix. Five messages start five executions in parallel, and they race to reply. The 'am I still the last one?' check lets exactly one survive and answer the whole burst, with no locks and no external queue.
The result
One answer per burst, with full context. Audio, images and PDFs get their own branch, webhooks older than 60 seconds are dropped, and a human handoff silences the bot by label.

03 Immigration Finder · several law firms · 2026

One deployment, any number of clients

  • Python
  • LiveKit Agents
  • OpenAI
  • ElevenLabs
  • AssemblyAI
  • Docker
livekit / dispatch
call · firm_ccall · firm_acall · firm_d1 DEPLOYMENTjob.metadata→ CLIENTS[key]agent_name=intakefirm_afirm_bfirm_cfirm_d+ firm_e: 1 entrybefore: 1 deployment per clientceiling: 2 clients
Illustrative UI
The problem
Intake voice agents for several US immigration law firms. The original brief was one deployment per client.
What I built
A LiveKit Agents platform in Python. A single deployment reads the job metadata on every call and builds the session from that firm's config: prompt, tools and calendar. Adding a firm is one dictionary entry.
The hard part
I built it the way it was asked first, and found the limit: on LiveKit Cloud a deployment is a real, always-warm process, not a config row. One per client meant a ceiling of two clients. I reverted my own design with that evidence and rebuilt it multi-tenant.
The result
No ceiling on clients. Tool factories with closures (one implementation, N firms), no interruptions while a booking is written, and no post-call error can cut a live conversation.

04 A US immigration law firm · 2026

The bug only real data shows

  • n8n
  • USCIS API
  • Google Sheets
  • Gmail
  • OpenAI
sheets / case-status
case-status.sheetRECEIPTNAMESTATUSIOE•••0412Applicant 1ApprovedIOE•••7731Applicant 1Applicant 2ReceivedIOE•••1958Applicant 1Applicant 3RFE sentIOE•••3304Applicant 1Applicant 4Interviewitems[0].json.nameevery row inherits row 1$json.name (per item)verified on a real I-589 caseGmail · sent
Illustrative UI
The problem
The firm had no automatic way to know when a case changed status at USCIS. Staff checked receipt numbers by hand, one by one.
What I built
A 27-node n8n workflow that tracks cases by receipt number, writes to Google Sheets, translates updates with OpenAI and emails each client. Reviewed in 3 adversarial rounds before going live.
The hard part
Running it on real rows exposed 4 bugs no design review would catch. The worst: a flat array index made every row after the first silently inherit the first person's identity. In immigration, that means sending one person the status of someone else's case.
The result
Verified end to end with a real I-589 case: a real Sheets write and a real Gmail send, both confirmed by the APIs. Zero to production in one session.

05 Immigration Finder · internal · 2026

Telling 'not out yet' from 'broken'

  • n8n
  • ScraperAPI
  • GPT-5-mini
bulletin / extract
PDFGPT-5-miniJSON150 rows · June 2026fetch result0 items: not out yetwait, no alertHTTP 500: brokenalert the team
Illustrative UI
The problem
The scraper that watched the monthly Visa Bulletin was dead, blocked by Cloudflare.
What I built
A scheduled workflow that fetches the predictable PDF URL through ScraperAPI, extracts the text natively (no OCR), structures it with GPT-5-mini and posts to an internal channel, deduplicated by month.
The hard part
Two silent failures. n8n nodes that return zero items stop the whole chain, which broke the normal 'not published yet' case. Later, a 500 from the proxy was being read as 'not published'. I traced that one straight through the n8n REST API.
The result
Validated twice against the real June 2026 bulletin: 150 rows, structured. The source is a public document, so this case can be shown almost in full.

06 Immigration Finder · internal · 2026

A password that opened the wrong door

  • Supabase
  • n8n
  • Next.js
  • Vercel
  • Retell API
dashboard / auth
/client-a/client-bcookie · client-a401 · rejectedsecret = derive(master, client_id)one password, one dashboard
Illustrative UI
The problem
Nobody could see what each client's voice agents were costing.
What I built
A Supabase schema, a weekly n8n usage report and a Next.js app on Vercel, with a separate password per client. Built in a single session.
The hard part
While building it I found a real vulnerability: the password-gate library did not record which client a session cookie belonged to, so with a shared secret one client's password unlocked another client's dashboard. I fixed it with a secret derived per client.
The result
Verified live: one client's cookie was rejected on another client's route. In production, with real data.
03Path

The pathso far.

Oldest first. The line draws itself as you scroll.

  1. 2019May - Nov 2019
    Internships

    IT support and infrastructure

    Hospital Interzonal Dr. José Penna · Escuela Técnica n°2

    • Deployed a Moodle server on Ubuntu Server for students and teachers
    • Set up a ticketing system that made support requests trackable
  2. 2023May 2023 - Jan 2026
    Experience

    System Administrator

    Copeviajes · travel agency

    • Took domain reputation from 3.7 to 10, with 100% email deliverability
    • Built the backup infrastructure with Veeam
    • Automated IT operations with Bash and PowerShell: where the automation started
  3. 2026Jan 2026 - Present
    Experience

    AI Automation Engineer

    Immigration Finder · US, remote · contractor

    • Voice agents, LLM pipelines and integrations for 15+ US immigration law firms
    • Run 26-30 Retell voice agents in an agency account, with cost reporting per client
    • 10+ production bugs found and fixed, including a security vulnerability
  4. 20262026 - Present
    Independent

    Builder

    Somos MGZ · own products

    • A WhatsApp agent in production, built around the burst-buffering pattern
    • Voice agent demo, booking system for sports venues, custom sites for travel agencies

Open to work · next stop

Your team?

Let's talk
04Products · Somos MGZ

Built forlocal businesses.

Somos MGZ is my own product line: software for small businesses in Argentina, sold and supported in Spanish. Hover or tap a window to scroll through it.

  • demo.somosmgz.com
    Live demo01 / 03

    MGZ. Agentes

    Calls answered after hours

    A voice agent that answers, replies and books appointments when you cannot pick up. Try it live, straight from the browser.

    demo.somosmgz.com
  • mgz canchas · esquema
    MGZ. CanchasReservar
    Reservá tu cancha
    Cancha 1Cancha 2Cancha 3Cancha 4
    17:00
    18:00
    19:00
    20:00
    21:00
    22:00
    23:00
    Seña
    Pagar con Mercado Pago
    Recordatorio por WhatsApp
    Panel del complejo
    In production02 / 03

    MGZ. Canchas

    Bookings without the spreadsheet

    Online booking for sports venues, with deposits through Mercado Pago and reminders over WhatsApp.

    somosmgz.com/canchas
  • tu-agencia.com.ar
    Tu agenciaWhatsApp
    Tu próximo viaje
    Paquetes
    Panel: cargar un paquete
    Publicar
    In development03 / 03

    MGZ. Turismo

    A site of your own, for your agency

    Custom websites for travel agencies, with a panel to load packages and destinations without depending on anyone.

    Ask for an example

Sites and systems for your business

Want something like this for your business?

05Contact

Let's buildsomething that runs.

Hiring for an AI, voice or automation role? Write to me, or find me on LinkedIn.