El cliente espera en la caja: la facturación no puede añadir segundos a cada venta.
Para quién es esta página
Proveedores de software de punto de venta y equipos técnicos que mantienen un POS propio.
¿Tienes un restaurante, cafetería o gimnasio?
Lo que tendrás que resolver
Mucho volumen en horas pico, con varias cajas vendiendo a la vez.
Cada caja suele tener su propio punto de emisión y su secuencial.
La conexión del local puede ser inestable, y el SRI puede demorar.
Cómo se integra con tu POS
Tu software no necesita generar XML, firmarlo ni hablar con los servicios del SRI.
- 01 Conecta Genera tu API key y úsala solo desde tu backend.
- 02 Engánchate al evento correcto Cuando ocurra en tu sistema, envía los datos a Flashpi.
- 03 Guarda el resultado Registra la
clave_accesoy el estado en tu documento. - 04 Mantén el estado al día Recibe webhooks o consulta el comprobante cuando lo necesites.
En qué momento emitir cada comprobante
| Evento en tu POS | Comprobante |
|---|---|
| Venta cerrada | Factura |
| Devolución | Nota de crédito |
| Cierre de caja | Conciliación de comprobantes pendientes |
Cola local para no bloquear la venta
La clave de un POS es cobrar primero y facturar sin bloquear. Guarda cada venta en una cola local y deja que un proceso en segundo plano la envíe a Flashpi.
CREATE TABLE comprobantes_pendientes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
venta_id TEXT NOT NULL UNIQUE,
payload TEXT NOT NULL,
intentos INTEGER NOT NULL DEFAULT 0,
estado TEXT NOT NULL DEFAULT 'PENDIENTE',
clave_acceso TEXT
);Y un proceso que la vacía:
// worker.mjs: procesa la cola de comprobantes pendientes del POS
const BASE_URL = "https://api.flashpi.ec/v1";
const API_KEY = process.env.FLASHPI_API_KEY;
const MAX_INTENTOS = 8;
async function emitir(pendiente) {
const res = await fetch(`${BASE_URL}/facturas`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: pendiente.payload,
});
const data = await res.json();
if (!res.ok) throw new Error(`Flashpi ${res.status}`);
return data;
}
// Ejecútala cada pocos segundos con tu planificador de tareas
export async function procesarCola(db) {
const pendientes = await db.pendientes(20); // tu capa de acceso a datos
for (const p of pendientes) {
try {
// Si un intento anterior pudo llegar al SRI y perdiste la respuesta,
// consulta el estado antes de reenviar para no duplicar el comprobante.
const r = await emitir(p);
await db.marcarEmitido(p.id, r.clave_acceso, r.estado);
} catch (err) {
const intentos = p.intentos + 1;
const estado = intentos >= MAX_INTENTOS ? "REVISAR" : "PENDIENTE";
await db.registrarFallo(p.id, intentos, estado);
}
}
}Respuesta esperada al emitir:
{
"estado": "AUTORIZADO",
"clave_acceso": "(49 dígitos)",
"numero_autorizacion": "(número de autorización del SRI)",
"fecha_autorizacion": "(fecha y hora)"
}Buenas prácticas para tu POS
- 1 No bloquees la venta Cobra, guarda en la cola y entrega el comprobante cuando esté autorizado.
- 2 Un punto de emisión por caja Con su propio secuencial, para no pelear por números entre cajas.
- 3 Reintenta con espera creciente Y marca para revisión los que fallen demasiadas veces.
- 4 Imprime o envía el comprobante Al cliente apenas esté autorizado.
- 5 Prepara el consumidor final Ten un flujo rápido para ventas sin datos del cliente.
Lo que Flashpi te da
- API REST con JSON Versionada en /v1 y descrita con OpenAPI 3.1. Ver referencia
- Ambiente de pruebas del SRI Valida tu integración antes de producción. Cómo probarlo
- Colección de Postman Para explorar los endpoints.
- SDKs open source en GitHub
- Webhooks Para recibir el estado de cada comprobante.
- Ejemplos por lenguaje y soporte técnico
- Estado del servicio en tiempo real status.flashpi.ec
Preguntas sobre la integración con POS
¿Qué pasa si se cae internet en el local?
Tu POS sigue vendiendo y guarda los comprobantes en la cola local. Cuando vuelve la conexión, se envían en orden.
¿Se puede facturar en horas pico sin que se haga lenta la caja?
Sí, si desacoplas la venta de la emisión con una cola, como en el ejemplo de arriba.
¿Cómo evito duplicar un comprobante si perdí la respuesta?
Antes de reenviar, consulta el estado por clave de acceso. Si el comprobante ya existe, no lo vuelvas a enviar.
¿Funciona con varias cajas?
Sí. Cada caja usa su punto de emisión y envía a la misma API.