Un TPV para bares y restaurantes de Granada, conectado a tu carta, tu web y tu carta QR. Y preparado para VeriFactu antes de que sea obligatorio.
A till for Granada bars and restaurants, wired to your menu, your website and your QR menu. And ready for VeriFactu before it becomes compulsory.
Esto no está a la venta. Se está probando en condiciones reales, y probablemente esté listo en un par de meses. Te lo enseño ahora por una sola razón: para saber si a alguien le interesa de verdad antes de seguir dedicándole tiempo.
This is not for sale. It's being tested in real-world conditions, and it will probably be ready in a couple of months. I'm showing it now for one reason only: to find out whether anyone actually wants it before I put more time into it.
01 · El problema01 · The problem
En la pizarra sí. En la web, cuando te acuerdes. En la carta QR, si sabes cómo. En el TPV, cuando venga el técnico. Y mientras tanto, cada sitio dice un precio distinto.
On the blackboard, yes. On the website, when you remember. On the QR menu, if you know how. On the till, when the technician turns up. Meanwhile every one of them says a different price.
02 · Qué es esto exactamente02 · What this actually is
El TPV es solo una pieza. Tu web, tu carta QR, el plano de mesas y la ficha de tus clientes son las otras. Van conectadas y se pagan con una sola cuota mensual.
The till is only one piece. Your website, your QR menu, the table plan and your customer records are the others. They're connected, and they're one monthly fee.
Dos cosas que conviene decir claras:
Todavía no hay precio. Es una cuota mensual, no una compra ni una licencia, y sabrás el número antes que nadie si te interesa.
Two things worth saying plainly:
There is no price yet. It's a monthly fee, not a purchase and not a licence, and you'd know the number before anyone else if you're interested.
03 · Cómo funciona03 · How it works
Editas desde el móvil, en español, con las palabras de tu carta. Todo lo demás se actualiza solo: la web, la carta QR y el TPV.
You edit from your phone, in Spanish, using your own menu's words. Everything else updates itself: the website, the QR menu and the till.
Cómo está hechoHow it's built
La carta vive en una base de datos Postgres y se publica como un JSON público que consumen tu web y tu carta QR. El TPV se sincroniza por JSON-RPC contra Odoo, que es el motor del punto de venta.
The menu lives in a Postgres database and is published as a public JSON feed consumed by your website and QR menu. The till syncs over JSON-RPC against Odoo, which is the point-of-sale engine.
04 · El TPV04 · The till
Pestañas con tus categorías, botones con tus platos y tus precios, plano de mesas con tu sala. Funciona en cualquier tablet.
Tabs for your categories, buttons for your dishes and your prices, a floor plan of your actual room. Runs on any tablet.
Qué hay debajoWhat's underneath
El TPV es Odoo 18 Community con el módulo pos_restaurant. Es software libre, sin coste de licencia por terminal, y con una empresa real detrás. Cada local tiene su propia base de datos, aislada del resto — un NIF, una base de datos.
Corre en un servidor en Europa detrás de Cloudflare, y se abre en el navegador de cualquier tablet. No hay que instalar nada ni comprar hardware propietario.
Documentación: Odoo Point of Sale.
The till is Odoo 18 Community with the pos_restaurant module. Free software, no per-terminal licence cost, and a real company behind it. Each venue gets its own database, isolated from every other — one tax number, one database.
It runs on a server in Europe behind Cloudflare and opens in any tablet's browser. Nothing to install, no proprietary hardware to buy.
Documentation: Odoo Point of Sale.
05 · Sin internet05 · No internet
El TPV sigue tomando comandas y cobrando. Cuando vuelve la conexión, se pone al día solo. No se pierde ni un ticket.
The till keeps taking orders and taking money. When the connection returns it catches up by itself. Not one ticket is lost.
Apagamos el servidor a propósito en mitad de una comanda. El TPV siguió añadiendo platos, completó un cobro en efectivo, imprimió el ticket y guardó el pedido. Al encender el servidor otra vez, el pedido subió solo y apareció completo: 25,42 €, pagado.
We killed the server on purpose in the middle of an order. The till carried on adding dishes, completed a cash payment, printed the receipt and stored the order. When the server came back, the order uploaded by itself and appeared complete: €25.42, paid.
Detalle técnicoTechnical detail
El punto de venta de Odoo es una aplicación de navegador que guarda los pedidos en IndexedDB mientras no hay red y los reenvía al recuperarla. La prueba se hizo matando el contenedor del servidor a mitad de pedido; el pedido reapareció como pos_order 00005-001-0001, estado paid, importe 25,42 €.
Un matiz importante: con VeriFactu activo, el registro fiscal se firma y encadena en el servidor, no en la tablet. Eso significa que un ticket cobrado sin conexión queda en cola y se registra en cuanto vuelve la red — es el comportamiento previsto por la norma, no una excepción.
Odoo's point of sale is a browser application that stores orders in IndexedDB while the network is down and replays them when it returns. The test was run by killing the server container mid-order; the order reappeared as pos_order 00005-001-0001, state paid, amount €25.42.
One important nuance: with VeriFactu live, the fiscal record is signed and chained on the server, not on the tablet. So a ticket taken offline is queued and registered as soon as the network returns — that is the behaviour the regulation anticipates, not an exception to it.
06 · VeriFactu06 · VeriFactu
Hacienda va a exigir que cada ticket quede registrado, firmado, encadenado con el anterior y con un QR impreso. No es opcional y no se puede tocar después. Pero no es para mañana.
The tax agency will require every ticket to be recorded, signed, chained to the one before it and printed with a QR code. It isn't optional and it can't be edited afterwards. But it isn't for tomorrow.
Lo que importa para ti, en tres frases:
What matters for you, in three sentences:
Fuentes y detalle normativoSources and regulatory detail
El marco es la Ley 11/2021 (antifraude), desarrollada por el Real Decreto 1007/2023 y la Orden HAC/1177/2024. Los plazos actuales vienen de una prórroga posterior (RDL 15/2025): grandes empresas desde enero de 2026, resto de sociedades enero de 2027, autónomos julio de 2027.
Información oficial de la Agencia Tributaria: Sistemas informáticos de facturación y VeriFactu.
Quién responde de qué. No existe homologación previa del Estado: el fabricante del sistema firma una declaración responsable. Aquí el sistema de facturación es Odoo con sus propios módulos l10n_es_edi_verifactu y l10n_es_edi_verifactu_pos, publicados bajo licencia libre LGPL-3 dentro de Odoo 18 Community — no son un añadido de terceros ni míos. Odoo presentó su declaración responsable ante la AEAT en junio de 2025.
Eso importa porque significa que yo no escribo código fiscal: la parte que genera, firma, encadena y envía el registro es de Odoo. Mi parte es la carta, la web y el enlace entre las dos cosas.
Documentación de la localización española: Odoo · Spain fiscal localization.
The framework is Ley 11/2021 (the anti-fraud act), developed by Royal Decree 1007/2023 and Orden HAC/1177/2024. The current deadlines come from a later extension (RDL 15/2025): large companies from January 2026, other companies January 2027, sole traders July 2027.
Official tax agency information: Sistemas informáticos de facturación y VeriFactu.
Who is responsible for what. There is no state pre-approval scheme: the maker of the system signs a declaración responsable. Here the invoicing system is Odoo with its own l10n_es_edi_verifactu and l10n_es_edi_verifactu_pos modules, published under the free LGPL-3 licence inside Odoo 18 Community — not a third-party add-on and not mine. Odoo filed its declaración responsable with the AEAT in June 2025.
That matters because it means I write no fiscal code: the part that generates, signs, chains and submits the record is Odoo's. My part is the menu, the website, and the link between them.
Spanish localization documentation: Odoo · Spain fiscal localization.
07 · El ticket07 · The receipt
Lleva datos fiscales: tu NIF, el número de ticket, el importe y el código de verificación. Ni los platos, ni la mesa, ni cuántos eran.
It carries fiscal data: your tax number, the ticket number, the amount and a verification code. Not the dishes, not the table, not how many were sitting at it.
DetalleDetail
El ticket de bar es una factura simplificada. Es válida hasta 3.000 € con IVA incluido en hostelería; por encima de eso hace falta factura completa con los datos del cliente. El propio TPV bloquea el cobro si un ticket sin factura supera ese límite, así que no depende de que alguien se acuerde.
Cada registro se encadena con el anterior mediante un hash, de forma que borrar o modificar uno rompe la cadena de manera detectable. Las correcciones y anulaciones se hacen con un registro rectificativo, nunca borrando: eso también está resuelto en el módulo (motivos R1 a R5, incluido el R5 para rectificar simplificadas).
El cliente puede cotejar el ticket escaneando el QR contra la sede de la AEAT.
A bar receipt is a simplified invoice. It is valid up to €3,000 including VAT in hospitality; above that a full invoice with the customer's details is required. The till itself blocks the payment if a non-invoiced ticket exceeds that limit, so it doesn't depend on anyone remembering.
Each record is chained to the previous one by a hash, so deleting or altering one breaks the chain detectably. Corrections and cancellations are done with a corrective record, never by deleting: that is handled in the module too (reasons R1 to R5, including R5 for correcting simplified invoices).
The customer can check the receipt by scanning the QR against the tax agency's site.
08 · El IVA08 · VAT
Es la confusión más cara de la hostelería. La misma caña lleva un IVA distinto según si se la toma en la barra o se la lleva.
The most expensive confusion in hospitality. The same beer carries different VAT depending on whether it's drunk at the bar or taken away.
Esta parte todavía se está terminando. Hoy el TPV aplica correctamente el 10% de barra y mesa, que es el 95% de lo que factura un bar de Granada. El cambio automático para llevar está a medio hacer, y lo revisa un asesor fiscal antes de tocar una sola factura real. No soy tu gestor y no pretendo serlo.
This part is still being finished. Today the till correctly applies the 10% for eat-in, which is 95% of what a Granada bar invoices. The automatic takeaway switch is half-built, and a tax adviser reviews it before it touches a single real invoice. I'm not your accountant and I'm not pretending to be.
Base legalLegal basis
La distinción está en la Ley 37/1992 del IVA: el artículo 91 aplica el tipo reducido a los servicios de hostelería «para consumir en el acto», que se tratan como una sola prestación — por eso la copa de vino servida en mesa va al 10% igual que la comida. Para llevar es una entrega de bienes y cada producto tributa por lo suyo; los refrescos azucarados pasaron al 21% en 2021.
Un caso concreto: un envase cobrado aparte para llevarse las sobras tributa al 21% (consulta vinculante DGT V2928-23). Eso no convierte en 21% todo el embalaje incluido en el precio del plato.
Técnicamente se implementa como posiciones fiscales de Odoo: cada producto lleva un tipo por defecto y el contexto del pedido — barra, mesa, para llevar, reparto — lo sustituye cuando toca. En el ticket cerrado quedan guardados el tipo, la base y el importe de IVA, de modo que una revisión posterior puede reconstruir por qué se aplicó lo que se aplicó.
The distinction sits in Spain's VAT act, Ley 37/1992: article 91 applies the reduced rate to hospitality services "for immediate consumption", treated as a single supply — which is why a glass of wine served at a table is 10% just like the food. Takeaway is a supply of goods and each product is taxed on its own merits; sweetened soft drinks moved to 21% in 2021.
One concrete case: a separately charged container for taking leftovers home is taxed at 21% (binding consultation DGT V2928-23). That does not turn all packaging included in a dish's price into a 21% line.
Technically this is implemented as Odoo fiscal positions: each product carries a default rate and the order's context — bar, table, takeaway, delivery — overrides it when it should. The completed ticket stores the rate, the base and the VAT amount, so a later review can reconstruct why a line was taxed the way it was.
09 · La tapa09 · The free tapa
En Granada la tapa va con la bebida. Eso no es un problema que resolver: es cómo funciona esto. Pero hasta ahora era invisible.
Una tapa a 0,00 € es una línea normal del ticket. Si el camarero la pulsa después de la caña, pasan tres cosas: la cocina la ve, tú la cuentas, y no cambia absolutamente nada de lo que cobras ni del IVA que pagas — una línea a cero no suma base imponible, y el 10% de la caña ya cubre el servicio entero del que la tapa forma parte.
Al final del mes puedes ver que salieron 340 tortillas y 41 remojones, y decidir qué compras. O no pulsarlas nunca y que todo siga exactamente como está. No te obliga a nada.
In Granada the tapa comes with the drink. That isn't a problem to solve — it's how this works. But until now it was invisible.
A tapa at €0.00 is an ordinary line on the ticket. If the waiter taps it after the beer, three things happen: the kitchen sees it, you can count it, and absolutely nothing changes about what you charge or the VAT you pay — a zero line adds no taxable base, and the 10% on the beer already covers the whole service the tapa is part of.
At the end of the month you can see that 340 tortillas and 41 remojones went out, and buy accordingly. Or never tap them and leave everything exactly as it is. It forces nothing on you.
Aquí no hay que construir nada nuevo: ya funciona. Lo único que hay que decidir es si tu gente va a pulsarla en pleno servicio, y eso lo sabes tú mucho mejor que yo.
Nothing new needs building here: it already works. The only thing to decide is whether your staff will actually tap it mid-service, and you know that far better than I do.
10 · Sin quedarte atrapado10 · No lock-in
El TPV de debajo es software libre que usan miles de empresas en todo el mundo. No es un invento mío que solo yo sé arreglar. Y eso cambia lo que pasa el día que ya no quieras trabajar conmigo.
The till underneath is free software used by thousands of businesses worldwide. It isn't something I invented that only I can fix. And that changes what happens the day you no longer want to work with me.
Con la mayoría de los TPV del mercado, irte significa empezar de cero: vuelves a teclear la carta entera, pierdes el histórico de ventas y a veces ni siquiera puedes sacar tus datos. Eso no es un accidente, es el modelo de negocio.
Aquí no puede pasar, porque la parte importante no es mía. Odoo lo mantiene una empresa belga con miles de clientes; el módulo fiscal lo hace la misma empresa. Si mañana desaparezco, hay cientos de integradores en España que trabajan con esto todos los días y pueden coger tu base de datos y seguir.
Y ahora la parte honesta, porque "portable" no quiere decir "gratis" ni "automático". La base de datos es tuya, pero el servidor lo pago yo. Si te vas, no puedes simplemente cogerla y ponerla a funcionar: necesitas dónde alojarla — otro proveedor que trabaje con Odoo, o tu propio servidor. Alguien tiene que montarlo y restaurar la copia, y eso es trabajo de un día para un integrador, no un clic. Tendrás que pagar ese alojamiento a alguien, igual que ahora me lo pagas a mí.
Lo que te ahorras es lo caro de verdad: volver a teclear la carta entera, perder el histórico de ventas y empezar de nuevo con los clientes. Y lo que no te llevas es el panel de gestión, la web y la sincronización — eso lo he construido yo y es justo lo que pagas cada mes. Me parece un trato limpio, y prefiero decirlo antes que después.
With most tills on the market, leaving means starting over: you retype the whole menu, you lose the sales history, and sometimes you can't even export your own data. That isn't an accident — it's the business model.
That can't happen here, because the important part isn't mine. Odoo is maintained by a Belgian company with thousands of customers; the fiscal module is made by that same company. If I vanished tomorrow, there are hundreds of integrators in Spain who work with this every day and could pick up your database and carry on.
Now the honest part, because "portable" doesn't mean "free" or "automatic". The database is yours, but I pay for the server. If you leave, you can't simply pick it up and run it: you need somewhere to put it — another provider who works with Odoo, or your own server. Someone has to set that up and restore the backup, and that's a day's work for an integrator, not a click. You'll be paying someone for that hosting, just as you'd have been paying me.
What you're spared is the genuinely expensive part: retyping the entire menu, losing your sales history and starting over with your customers. And what you don't take is the management panel, the website and the sync — I built those, and they're exactly what the monthly fee is for. That seems a fair deal to me, and I'd rather say it upfront than afterwards.
Qué significa "libre" aquí, en concretoWhat "free software" means here, concretely
Odoo Community se publica bajo LGPL-3, y sus módulos de VeriFactu (l10n_es_edi_verifactu y l10n_es_edi_verifactu_pos) vienen incluidos en la propia edición gratuita, con la misma licencia. No hay coste de licencia ni por terminal ni por local.
"Libre" no significa "sin coste para ti": un servidor cuesta dinero, mantenerlo cuesta tiempo, y las copias de seguridad y las actualizaciones no se hacen solas. La cuota mensual paga eso y el trabajo de tener las cinco piezas conectadas — no paga la licencia del TPV, porque no existe.
Cada local tiene su propia base de datos, en Postgres, un formato estándar. Un volcado de esa base de datos es portable: se lo puedes dar a cualquier integrador de Odoo y arranca — siempre que tenga un servidor donde levantarlo. Eso es lo que hay que contratar en otro sitio; el volcado por sí solo no es un TPV en marcha. Documentación: localización española de Odoo.
Odoo Community is published under LGPL-3, and its VeriFactu modules (l10n_es_edi_verifactu and l10n_es_edi_verifactu_pos) ship inside the free edition under that same licence. There is no licence cost per terminal or per venue.
"Free software" doesn't mean "free for you": a server costs money, keeping it running costs time, and backups and updates don't happen by themselves. The monthly fee pays for that and for the work of keeping the five pieces connected — it doesn't pay for a till licence, because there isn't one.
Each venue has its own database, in Postgres, a standard format. A dump of that database is portable: hand it to any Odoo integrator and it starts up — provided they have a server to start it on. That's the thing you'd be contracting elsewhere; a dump on its own is not a running till. Documentation: Odoo's Spanish localization.
11 · Lo que todavía no es11 · What it isn't yet
Si te enseño solo lo bueno, la primera sorpresa te la llevas cuando ya sea tarde. Esto es lo que falta.
If I only show you the good parts, your first surprise arrives when it's too late. Here's what's missing.
No hay precio, no hay contrato y no hay fecha cerrada. Un par de meses es una estimación honesta, no una promesa.
No price, no contract, no fixed date. A couple of months is an honest estimate, not a promise.
Se está probando en condiciones reales de servicio: carta real, precios reales, cobros de prueba. Todavía no hay ningún negocio facturando con él, así que serías de los primeros en usarlo de verdad.
It's being tested under real service conditions: a real menu, real prices, test transactions. No business is invoicing through it yet, so you'd be among the first to really use it.
El cobro con tarjeta integrado se está montando ahora y el terminal está pedido. Hasta que esté, el TPV convive sin problema con tu datáfono actual.
Integrated card payment is being set up now and the terminal is on order. Until it's ready, the till works fine alongside your existing card machine.
El 10% de barra y mesa está bien resuelto. El cambio automático al 21% para llevar no, y lo tiene que firmar un asesor fiscal.
The 10% for eat-in is properly handled. The automatic 21% switch for takeaway is not, and a tax adviser has to sign it off.
Los módulos están, pero nadie ha enviado todavía un registro real a Hacienda. Eso necesita tu certificado y el visto bueno de tu gestor.
The modules are there, but nobody has yet sent a real record to the tax agency. That needs your certificate and your accountant's sign-off.
Monto el sistema, no te asesoro fiscalmente. Las fechas y los tipos de IVA los confirmas con quien te lleva las cuentas.
I build the system, I don't give you tax advice. Confirm the dates and the VAT rates with whoever does your books.
12 · Qué pasa ahora
Solo quiero saber una cosa: ¿esto te resolvería algo, o no?
No te estoy vendiendo nada y no hay nada que firmar. Estoy decidiendo cuánto tiempo más le dedico, y esa decisión es mucho mejor si sé si a alguien le sirve de verdad.
Un «no me hace falta» me vale igual que un sí, y me ahorra meses. Si te parece útil, dímelo y te aviso cuando esté. Si ves algo que le falta o algo que en tu barra no funcionaría, eso es lo más valioso que me puedes decir.
Y si algún día siguiéramos adelante, sería sin prisa: montamos tu carta, lo pruebas en paralelo con lo que ya tienes, y sigues solo si te convence.
12 · What happens now
I only want to know one thing: would this solve something for you, or not?
I'm not selling you anything and there's nothing to sign. I'm deciding how much more time to put into it, and that decision is much better if I know whether it's genuinely useful to anyone.
A "don't need it" is as useful to me as a yes, and it saves me months. If it looks useful, tell me and I'll let you know when it's ready. If you see something missing, or something that wouldn't work in your bar, that's the most valuable thing you can tell me.
And if we ever did go ahead, there'd be no rush: we set up your menu, you run it alongside what you already have, and you carry on only if it convinces you.