La Hoja ERP (hoja.redbroomsoftware.com)
Full-featured restaurant ERP covering POS, table management, production planning, inventory, recipes, delivery integrations, and consumer-facing ordering — all in a single vertical primitive.
URL: https://hoja.redbroomsoftware.comStatus: LIVE Tier: T2 (vertical SaaS primitive)
T1 apps are indispensable horizontal primitives. T2 apps are vertical SaaS or single-domain primitives — primitive-like in their domain but not universal dependencies.
What you can integrate
- Order lifecycle — receive
sale.completedevents when a POS or online order is finalized; subscribe to order status transitions - Delivery aggregator bridge — La Hoja connects to third-party delivery platforms; order events flow back as standard
sale.completedregardless of originating platform - Consumer-facing storefront — public menu and QR table-session endpoints expose live menu data and enable cart/checkout for dine-in or to-go
- Reservation ingestion — La Hoja consumes
reservation.createdfrom Mancha to pre-stage tables and alert kitchen - Fiscal sync — receives
cfdi.stamped/cfdi.cancelledfrom Constanza; emitssale.completedfor Constanza to trigger CFDI generation
Authentication
Authorization: Bearer <api_key>
Content-Type: application/jsonUser identity flows through Camino SSO. Server-to-server partners use per-tenant API keys issued from the La Hoja admin console. Public storefront endpoints (/api/public/*) are unauthenticated by design.
Endpoints
| Method | Path |
|---|---|
| DELETE | /api/account/delete |
| POST | /api/address/validate |
| GET | /api/analytics/orders |
| GET, POST | /api/auth/forgot-password |
| GET, POST | /api/auth/login |
| GET, POST | /api/auth/logout |
| PATCH | /api/auth/profile |
| GET, POST | /api/auth/register |
| GET, POST, PUT, PATCH, DELETE | /api/auth/verify |
| GET | /api/business/labor-costs |
114 total — 10 admin/cron/internal (hidden) — +94 more primary endpoints not shown. Source: src/app/api/**/route.ts in the la-hoja repo.
Events emitted
| Event | Receivers | Description |
|---|---|---|
inventory.low | camino, colectiva | A product inventory fell below the low-stock threshold — Colectiva records the alert for analytics; Camino logs it as a TenantIntelligence signal in organization_activity_log. |
sale.completed | colectiva, constanza | A POS sale has been completed |
Events consumed
| Event | Senders | Description |
|---|---|---|
cfdi.cancelled | constanza | A CFDI invoice has been cancelled |
cfdi.stamped | constanza | A CFDI invoice has been stamped by the SAT via Constanza — receiver apps attach the UUID to their local invoice record and update status. |
customer.merged | camino | Two duplicate customer records were merged in Camino — receiver apps update their local foreign keys to the canonical customer ID. |
customer.updated | camino, constanza, caracol | A customer/contact record was updated in Camino — receiver apps sync the changed fields to their local customer records for display and invoicing accuracy. |
employee.created | colectiva | [auto-derived] employee.created event |
employee.missing_data | constanza | Constanza detected an employee with missing fiscal data (RFC/CURP/etc.) — routed back to the source app that created the employee so the missing fields can be completed. |
employee.terminated | colectiva | [auto-derived] employee.terminated event |
employee.updated | colectiva | [auto-derived] employee.updated event |
fiscal.resico_warning | constanza | Constanza detected an organization whose RESICO income utilization crossed the warning threshold (>=90%). Routed to accounting-sensitive apps so they can surface limit warnings in POS/invoice flows. |
insights.available | camino | Camino's AI engine generated new business insights for a tenant — receiver apps surface the insights in their dashboards for operator review. |
invoice.compliance_issue | constanza | Constanza detected an invoice compliance issue (missing/invalid RFC, duplicate, format error) — routed back to the source app for review. |
labor_costs.monthly_report | colectiva | [auto-derived] labor_costs.monthly_report event |
labor_costs.updated | colectiva, constanza | [auto-derived] labor_costs.updated event |
payment.received | colectiva, constanza | A payment has been processed via Colectiva |
payment.reconciled | constanza | Constanza completed bank reconciliation for a payment — receiver apps update their local payment records to mark the payment as reconciled against the bank statement. |
payroll.calculated | colectiva | [auto-derived] payroll.calculated event |
reservation.arrived | mancha | A reservation party arrived at the restaurant — Caracol POS updates the table status from waiting to arrived, La Hoja POS mirrors the reservation timeline. |
reservation.completed | mancha | A restaurant reservation was completed (the party finished dining) — Colectiva records for revenue analytics, Caracol POS releases the table, La Hoja POS mirrors the timeline. |
reservation.created | madriguera, mancha | A restaurant reservation has been created |
reservation.seated | mancha | A reservation party was seated at the restaurant — Caracol POS starts the table timer, La Hoja POS mirrors the seating event. |
reservation.updated | mancha | Reservation details changed in Mancha (time/party size/contact) — Caracol POS and La Hoja POS update their mirrors. |
shipment.status_changed | agente | Agente updated shipment status (assigned, in_transit, delivered, exception) — notifies source apps (baul, la-hoja) to update tracking in their dashboards. |
subscription.activated | camino, colectiva | A subscription plan has been activated for a tenant — all apps that gate features behind the subscription tier update their local tier state. |
subscription.cancelled | camino, colectiva | A subscription has been cancelled — all apps that gate features behind the subscription tier update their local tier state to free/cancelled. |
subscription.changed | camino | A subscription plan has been upgraded or downgraded — receiver apps update their tier gates and feature access accordingly. |
subscription.limit_approaching | camino | A tenant's subscription usage is approaching the plan limit — Camino notifies subscriber apps to surface a plan-upgrade prompt to the tenant operator. |
subscription.trial_expiring | camino | A trial subscription is expiring soon — receiver apps surface an upgrade prompt to the tenant operator. |
subscription.trial_started | camino | A trial subscription was started — receiver apps activate trial-tier features for the new tenant. |
workflow.action | colectiva | Colectiva dispatches a workflow action to a target app — instructs the receiver to perform a specific operation (create employee, generate poliza, update record). Payload includes the action type and data needed by the receiver. |
Webhook signature
Standard ecosystem HMAC-SHA256 over the raw body with a 5-minute timestamp window. See Webhooks.
OpenAPI
Coming in the OpenAPI generator phase — see /reference/openapi.
SDK
See /sdk/ for @r-bsoftware/ecosystem-sdk helpers.
Gotchas
- La Hoja is the only ecosystem app built on Next.js (App Router,
src/app/api/**/route.ts). All other apps are SvelteKit. Route shape is otherwise identical for integration purposes. - Delivery order events and POS order events both emit the standard
sale.completedevent. Differentiate by thechannelfield (pos|delivery_<platform_slug>), not by endpoint. - The public storefront endpoints (
/api/public/*) require no auth and are designed for consumer-facing surfaces — do not add auth middleware in front of them.