Multi-tenant SaaS · built & operated solo · 2025–2026

My-Negocio: one platform to run a small business.

Clients, appointments, point of sale, inventory, restaurant tables, WhatsApp reminders and Ecuador SRI e-invoicing. Four business models served from one ASP.NET Core 9 codebase, with every business-scoped query filtered by its tenant.

Offline since 2026 · all screenshots use fictional sample data

Gym dashboard (Resumen): monthly income, expenses and net profit cards, client counters, an income-versus-expenses bar chart and a list of memberships about to expire.
The same dashboard on a phone, with stacked cards and a hamburger menu.

Built with

  • C#
  • ASP.NET Core 9 MVC
  • EF Core 9
  • SQL Server
  • Bootstrap 5 · Metronic
  • WhatsApp Cloud API
  • SRI XAdES-BES
  • GitHub Actions
  • AWS Lightsail · Nginx

Product tour

Four business models, one codebase.

Each tenant picks a model when it signs up, and the dashboard reshapes itself around it: its own sidebar, its own home screen, and its own workflows, all on shared services and one database.

Memberships

Gym client list (Clientes): a sortable table with price, start date, expiry date, colored days-left badges, and per-row WhatsApp, renew, edit and delete actions.

Real UI · sample data · Clientes

Memberships that renew themselves Membresías

  • Tracks every membership's end date and flags clients who are about to expire or already expired.
  • Background jobs send WhatsApp membership and payment reminders, so owners don't have to chase anyone.
  • Supports daily passes, Excel import/export (ClosedXML) and one-click promotional broadcasts.

Appointments

Barbershop agenda (Agenda): a weekly FullCalendar view with appointments color-coded by barber, employee filter tabs, and counters for today's appointments.

Real UI · sample data · Agenda

A calendar that runs the shop Citas

  • Weekly and daily FullCalendar views with a per-employee filter, schedules and days off.
  • Available slots are computed from each employee's hours and existing bookings, so appointments can't overlap.
  • Services and combos with duration and price; automatic WhatsApp reminders to the client, the employee and the owner.

Retail POS

Minimarket point of sale (POS): a product grid filtered by category on the left and a receipt with quantities, subtotal, VAT and total on the right.

Real UI · sample data · POS

Point of sale with live inventory Tienda

  • Category-filtered POS with VAT, discounts, extra charges and several payment methods.
  • Every sale moves stock and writes an inventory movement; low-stock items raise notifications.
  • Generates a public product catalog as HTML or PDF, shareable by link, QR code or WhatsApp.

Restaurants

Café table map (Mesas): ten table cards colored green, yellow or red for free, reserved or occupied, with capacity, above today's reservations.

Real UI · sample data · Mesas

Tables, orders and menus Restaurante

  • Live table map with free, occupied and reserved states, plus a reservations list for the day.
  • Dine-in, take-away and delivery orders from the same POS, with a delivery driver assigned per order.
  • Menu builder with five visual styles; menus render to HTML for preview, download and sharing.

Under every model

The parts small businesses actually use every day.

Reports

Money in, money out, at a glance.

Every income and expense is written to an append-only financial log, and the dashboards are built on top of it: day, week and month views, income-versus-expense charts and new-client trends with ApexCharts.

  • The dashboard exposes no way to edit or delete an entry, which protects the books.
  • Per-payment-method totals and period closing with Excel export.
  • A daily summary goes out by email and WhatsApp.
Services/LogService.cs
Reports tab (Reportes) for the month: income, expenses and net profit cards, then weekly income-versus-expense bars and a new-clients line chart.

Real UI · sample data · Reportes

E-invoicing

Electronic invoices the tax authority accepts.

Ecuador requires invoices to be signed and authorized by the SRI. My-Negocio builds the SRI-compliant XML, signs it with the business's own .p12 certificate (XAdES-BES, enveloped), sends it to the SRI SOAP web services and produces the RIDE PDF.

  • The certificate password is stored encrypted, never in plain text.
  • A hosted service retries invoices that the SRI didn't authorize yet.
  • Test and production environments can be switched per tenant.
Services/FacturacionElectronicaService.cs
SRI electronic invoicing settings (Facturación Electrónica SRI): RUC, legal name, establishment and emission point codes, environment, tax regime and a .p12 certificate upload.

Real UI · empty settings form · Facturación Electrónica SRI

Marketing

A flyer editor inside the dashboard.

Owners design promotions without leaving the app: a canvas editor built on fabric.js with templates, text, shapes, images, layers, undo/redo and export, sized for Instagram posts, stories and more.

  • Designs are saved per tenant with a thumbnail and can be reopened later.
  • Pairs with WhatsApp promotions to send offers to the whole client list.
wwwroot/js/propaganda-editor.js
Flyer editor (Propaganda): a tools panel with text, shapes and background options, a layers list, and a 1080 by 1080 canvas showing a promotion template.

Real UI · built-in template · Propaganda

Inventory

Stock that keeps its own history.

Products live in drag-and-drop category folders, with purchase cost, sale price and minimum stock. Every adjustment, sale and return is recorded as a movement, so the owner can see why a number changed.

  • Low-stock and out-of-stock warnings right on the product cards.
  • Two-sheet Excel export of products and movement history.
Services/InventarioService.cs
Inventory tab (Inventario): totals and low-stock counters, category folders, and product cards with price, stock steppers and low-stock warnings.

Real UI · sample data · Inventario

Mobile

Built for the phone behind the counter.

Every dashboard works on a phone: cards stack, the sidebar becomes a slide-out menu and modals go full-screen.

Gym dashboard on a phone: month filter and stacked income, expense and profit cards.
Gym overviewResumen
Barbershop agenda on a phone: today's counters, a New appointment button and the day view of the calendar.
Day agendaAgenda
Minimarket POS on a phone: sales counters, product search, category pills and product cards.
Point of salePOS
Café table map on a phone: two columns of green, yellow and red table cards.
Table mapMesas

Architecture

A classic, boring-on-purpose monolith.

One ASP.NET Core 9 MVC app, layered Controllers → Services → EF Core, with hosted background services for everything that happens on a schedule. It ran on a single AWS Lightsail instance behind Nginx.

Tenant isolation

Every request proves which business it belongs to.

When an owner signs in, the auth cookie carries a NegocioId claim. Dashboard controllers inherit from NegocioBaseController, which compares the tenant in the URL with the tenant in the claim before running the action. A mismatch is rejected with Forbid() (access denied), and every business-scoped query in the services is filtered by that same id.

Roles are separate: business owners, a platform admin who can impersonate a tenant for support, and sales reps (vendedores) with their own portal and automatic commissions.

Helpers/NegocioBaseController.csexcerpt

[Route("Negocios")]
[Authorize]
public abstract class NegocioBaseController : Controller
{
    protected async Task<IActionResult> Execute(
        Guid negocioId, Func<Guid, Task<IActionResult>> action)
    {
        var nId = AuthService.GetNegocioId(User);
        if (!nId.HasValue || negocioId != nId.Value)
            return Forbid();   // wrong tenant → Forbid()
        return await action(negocioId);
    }
}

About this project

Designed, built, deployed and supported by one developer.

My-Negocio ran in production from 2025 to 2026 and is offline now. The code is public as a portfolio piece, and this page exists so you can see the product without a live server.