Build with Gemini XPRIZE · Small Business Services
OjoLote: public evidence
Every number a judge needs, on one page, without an account. AI agents that take office work off small Spanish businesses: invoices from email, clothing orders, lead discovery, records over WhatsApp.
Last updated: 17 August 2026
These figures are static, copied by hand from our submission documents. They are not computed live against the production database. That is deliberate: a self-updating number can drift out of sync in silence, and this page is meant to be checkable rather than impressive.
Sources, with their own dates: docs/submission/BUSINESS_EVIDENCE.md (last corrected 2026-08-16), docs/submission/REVENUE_AND_COSTS.md and docs/submission/METRIC_METHODOLOGY.md (rewritten 2026-08-16, reading range added 2026-08-17).
No customer data appears here. Only aggregates already published in our submission. No individual invoice, no sender, no single amount, no named person, no email address, no phone number, no tax ID. The two company names already appear in our submission, which is why they appear here.
1. Revenue by month, in EUR and USD
Counted when Stripe charged the customer and the charge was not refunded. Amounts are net of the 21% Spanish VAT, which is not revenue.
| Month | EUR (net of VAT) | USD | Why |
|---|---|---|---|
| May 2026 (from 19 May) | 0.00 | 0.00 | No customer was charged. The product was pre-revenue and Stripe was in test mode. |
| June 2026 | 0.00 | 0.00 | No customer was charged. Stripe still in test mode. |
| July 2026 | 0.00 | 0.00 | Live charging was enabled on 28 July, but the only real charge was a 6.05 EUR proof charge, refunded the same day. Net zero. No customer was billed in July. |
| August 2026 (1 to 17 Aug) | 422.00 | 487.58 | Four charges on 2026-08-05 (510.62 EUR gross, 88.62 EUR of VAT). Verified against the Stripe unified payments export and the four receipts, archived in the private dossier. |
| Total (19 May to 17 Aug 2026) | 422.00 | 487.58 | 100% arms-length. The three earlier months are zero, so nothing else adds to it. |
The three zeros are a declaration, not missing data. No arms-length customer was charged in May, June or July, so no exchange rate applies to those rows and no cell is pending.
The exchange rate, so the arithmetic can be redone
- Revenue is converted at the European Central Bank EUR/USD reference rate of the charge date itself, 2026-08-05: 1.1554. So 422.00 EUR × 1.1554 = 487.58 USD.
- Costs use the submission cut-off rate of 2026-08-13: 1.1534, because our euro costs are metered consumption rather than dated invoices, and a single aggregate takes a single rate.
- Source: European Central Bank, series
D.USD.EUR.SP00.A, downloaded 2026-08-13. The method was fixed in writing before the arithmetic was done, so the rate could not be chosen to flatter the result — and neither rate is the most favourable one in the window (that would be 1.1555, on 10 August).
2. The two paying customers
Two unrelated companies, in two different sectors, pay monthly subscriptions through Stripe in live mode, contracted by themselves from inside the application through our own Checkout, with Spanish VAT applied. First charges on 2026-08-05.
| Customer | Sector | What they pay for (EUR/month per module) | Net EUR/month | With 21% VAT | Relationship |
|---|---|---|---|---|---|
| Cyan Publicidad | Screen printing (logos on workwear), Seville | Invoices from email (75) + Clothing orders (99, founder tier) + Lead discovery (99, founder tier) | 273.00 | 330.33 | arms_length |
| Connect Alcalá | Housing and property records management, 5 employees | Records over WhatsApp (149, negotiated closed price) | 149.00 | 180.29 | arms_length |
| Total | Two companies | Four subscriptions, four Stripe lines, no proration | 422.00 | 510.62 | All arms-length |
- VAT is not revenue. Of the 510.62 EUR charged per month, 88.62 EUR belongs to the Spanish tax authority and is set aside for the quarterly return. The business figure is 422.00 EUR/month.
- One module = one Stripe subscription line, quantity 1, no proration. The revenue evidence is meant to be a trivial table, and it is: four lines.
- The prices are the ones declared in code, not invented for this page. Cyan is on the founder tier for two of its three modules (clothing orders 199 → 99, lead discovery 149 → 99); invoices from email has no founder discount. Connect Alcalá’s 149 EUR is a negotiated closed price, so there is no discount to apply.
- Photo quality control was offered and not bought. Cyan’s QC module stayed locked with its price visible and unpaid. We leave that in the record because it is the cleanest proof that customers buy what they asked for, not what we would like to sell.
3. Related parties: zero, declared
422.00 EUR/month arms-length. 0.00 EUR related-party. No exceptions, no rounding.
Neither customer is a related party. No shareholding, family or employment link exists between OjoLote’s owner and either company. Both are third-party market transactions and both are recorded in our own systems as arms_length.
One-off charges: none. No one-off charge was collected during the contest period. A 400 EUR setup fee that appears in one July agreement was never charged in money, and zero payments outside Stripe is separately confirmed against the payments export. Nothing from that fee appears anywhere in the figures above.
4. Costs, excluding marketing — and marketing is zero
| Line | Amount | Detail |
|---|---|---|
| Google Cloud + Gemini API — Cloud Run, Cloud SQL, Cloud Storage, Secret Manager, Cloud Build, Speech-to-Text and every Gemini call, all on billing account 01C223-B26AEA-2A4B36 | 22.62 EUR | May 0.00 · June 0.16 · July 2.95 · August to the 16th 19.51. Read from the billing console on 2026-08-16, net of free-tier and savings. |
| Stripe fees for the whole period | 13.34 EUR | 12.96 EUR on the four live charges (2.54%) plus the 0.34 EUR fee that was not returned with the refunded July test charge. |
| Resend (transactional email: magic-link access and inbound invoices) | 20.00 USD | Invoiced in dollars. Carried across untouched, with no exchange rate applied. |
| ojolote.com domain, one full year | 10.46 USD | Invoiced in dollars. Carried across untouched. |
| Subtotal, euro side | 35.96 EUR | Converted once at 1.1534 (ECB, 2026-08-13) = 41.48 USD. |
| Subtotal, dollar side | 30.46 USD | Two supplier invoices issued in dollars, carried across with no conversion. |
| Total costs excluding marketing | 71.94 USD | 41.48 + 30.46. Also the total including marketing, because marketing is 0. |
Marketing and customer acquisition: 0.00 on every line
The rules ask for this figure even when it is zero, so here it is, itemised:
| Line | Amount |
|---|---|
| Paid advertising (Google, Meta, LinkedIn, print) | 0.00 EUR |
| Lead databases and prospecting tools (Apollo, ZoomInfo, Lusha and similar) | 0.00 EUR |
| Sales commissions, referral fees, affiliate payments | 0.00 EUR |
| Cold-email secondary domain and mailbox | 0.00 EUR |
| Travel and meals to visit or close customers | 0.00 EUR |
| Events, sponsorships, content production | 0.00 EUR |
| Total marketing and customer acquisition | 0.00 EUR / 0.00 USD |
Customer acquisition cost: 0.00 EUR per customer. Both customers came through direct founder-led contact. No advertising, prospecting tool, commission or referral fee was ever paid.
There are no contractor fees, no salaries and no consultant invoices: 0.00. The three team members are founders working unpaid. Cloudflare DNS, Zoho mailboxes, the WhatsApp Business API (no paid template was ever sent), GitHub, the SIM lines and the self-hosted CRM are each declared at 0.00, on a free tier.
5. Reconciliation to the cent against the Stripe balance
This is the subtraction anyone can redo. The Stripe fee measured on the four real charges is 2.54% — 12.96 EUR on 510.62 EUR. An earlier version of our own documents said 1.84%, counting only the per-charge fees and missing the Billing usage fee. We corrected it upwards, against ourselves, on 2026-08-16.
510.62 − 9.39 − 0.34 − 3.61 = 497.28 EUR, which is exactly the available balance the live Stripe account reports. Two different figures for Stripe fees appear above and they are not the same thing: 12.96 EUR is the fee on the four August charges (the one the 2.54% is calculated from), and 13.34 EUR is the fee for the whole contest period (it also carries the 0.34 EUR left behind by the refunded July test charge). The cost table in section 4 uses the period figure.
6. What the invoice agent actually does, with honest ranges
Measured on 2026-08-16 against the production register of the customer who pays, using a read-only script that travels in the repository (scripts/medir-facturas.ts) and prints the denominator next to every percentage.
| Stage of the chain | Figure | Rate |
|---|---|---|
| Documents that arrive and are stored, original downloadable exactly as it came | 141 of 141 | 100% |
| Documents the system manages to read | 126 to 137 of 141 | 89.4% to 97.2% |
| Documents that complete the chain with nobody touching them | 9 of 64 | 14.1% |
Why the reading figure is a range and not a number
Three fields in the database answer the question “did we read it?” and they disagree. By one field four documents failed, by another six. The strictest reading is stricter still: 126 are fully read by the model, because eight were filtered out as email-signature images before they ever reached it, which is the system working rather than the system reading.
We had published 97.2%, the loosest of the three, without saying it was a choice. So we publish the whole range and name the strictest number: 89.4% is the floor, 97.2% is the ceiling.
The unattended rate, with every denominator we could find
Any single ratio here is a choice of denominator, so here are all four. We publish 9 of 64, and we publish 6 of 48 right next to it — and 6 of 48 is the lower of the two.
| Yardstick | Fraction | Rate | Published? |
|---|---|---|---|
| scripts/medir-facturas.ts — the floor the script itself tells us to publish | 9 of 64 | 14.1% | Yes, published |
| Same script, judgeable documents only | 9 of 56 | 16.1% | Shown for completeness |
| The product's own rule, on the customer's home screen | 6 of 48 | 12.5% | Yes, published |
| The Invoices tab the customer actually sees | 6 of 52 | 11.5% | Shown for completeness |
The number we could have published and did not. 38 of those documents carry the agent’s own “this may not be an invoice” flag — email-signature logos, business cards, flyers, delivery notes. Dropping them would give 9 of 14, or 64%.
We are not publishing that, and the reason is written in our own script’s README, from July: taking out of the denominator what you could not classify raises the percentage without getting anything right. It would also be circular, because that same flag is shown to the person reviewing, so the manual discards that agree with it are anchored by it rather than independent of it.
The correction went the other way too. Until 2026-08-16 this figure was published as 9 of 61. 61 is not a denominator any tool in the repository produces. The script prints three, and 64 is the strictest of them: it counts as a failure everything still queued and everything the agent could not classify. The corrected number is lower than the one it replaced.
7. What we deliberately do not claim
This section is here because a metric that survives a question is worth more than a large one that does not.
- “Goes through on its own” does not mean it was read correctly. What is checked is internal consistency: taxable base plus VAT equals the total, to the cent. A wrong but self-consistent reading passes just the same. Field-by-field accuracy against the paper document has not been measured on this corpus, so no figure on this page claims it.
- A 77% figure that used to be our headline has been retracted. It was measured on a synthetic corpus that was not preserved as an artefact, so it cannot be reproduced against the database. What replaces it is the production rate on the paying customer, which is a fraction of it and which anyone with access can re-run.
- Small sample, single customer, short window. The register is nine days long. There is no reason to assume the same percentage repeats with another set of suppliers, other formats or another sector.
- 100% is unreachable by design. The denominator is everything that came in, not a cleaned-up selection. It contains at least one bank receipt, which is not an invoice, and one invoice denominated in pounds, which the system rejects by construction because the currency is not the euro.
- Nothing is ever lost. Every one of the 141 documents has its original file in Cloud Storage, retrievable by a person who wants to check our reading against the paper. The low unattended rate is not “the system only handles 14% of invoices”; it is “14% need no human at all”. The rest arrive pre-read, with the doubt already named. The agent never invents a figure.
- No projection is submitted. The revenue claim is 422 EUR/month and nothing else. Nothing unpaid is counted, and conversations in progress are worth 0.00 EUR until they are charged.
- This is a pre-audit with a human in the loop, not a certification. We do not promise guaranteed or certified quality control.
8. How a judge can verify this
- Payment mechanism, in the repository: the in-app Checkout Session, the signature-verified Stripe webhook that syncs the subscription, and the module lock that shows the price and opens payment. That is the mechanism that carried the first real charges.
- Stripe references, sanitised: four subscriptions and four receipts, with truncated identifiers in the repository and full identifiers in the private dossier held by the founder.
- The measuring script travels in the repository and is read-only, with mutually exclusive categories that always add up to the total.
- Contact details, receipts and proof documents are deliberately outside Git, in a private evidence dossier. That is a privacy decision, not an evasion: the aggregates are all here, and the underlying documents belong to our customers.
- Both customers have given a verbal yes to confirming to judges. The written confirmation is being collected during the judging window; both contacts are on holiday. We declare it as that, not as a written permission we do not yet hold.