Open-source ERP + Qwik storefront ยท MIT

Your ERP and your storefront. One source of truth.

Fincas is a Django back office for quotes, orders, invoicing, a double-entry ledger, inventory and CRM, and a fast Qwik storefront that sells from the same data, live.

pip install fincas

The Fincas back-office dashboard: open orders, revenue this month, pending quotes and recent ordersThe Fincas Qwik storefront home page, selling from the same catalog

Headless storefront, included

A Qwik storefront that runs on your ERP.

Most shops run an ERP and a storefront as two systems and spend their days keeping them in step. Fincas ships both, in one repository, and the store asks the ERP for everything.

The same storefront in four of its 75 themes: a dark tech theme, a light editorial one, a soft pink one and a green terminal one
One storefront, four of its 75 themes
  • One source of truth

    The storefront has no catalog of its own. Products, variants, prices with quantity breaks, stock and SEO text come from the ERP on every request. No feed, no sync job, no second database.

  • Checkout lands in the back office

    A guest checkout becomes a real sales order with an ERP order number, waiting in the order list for your staff.

  • Accounts on the same records

    Signed-in customers see their profile and orders through the customer portal API, from the records your team works with.

  • Nothing secret in the browser

    No API key ships to the client. Visitors get a short-lived, least-privilege token that can read the catalog and place a guest order, and nothing else.

  • Fast by design

    Qwik resumes instead of hydrating, so pages ship almost no JavaScript up front, however big the catalog gets.

  • 75 themes, switched live

    Reskin the whole store at runtime, start from landing-page templates, and keep Playwright journeys with axe accessibility checks in CI.

Live demo

Click around. Break things. It resets every night.

Two public demos run the current release on sample data: the back office your team would use, and the storefront your customers would see.

Back office

Quotes, orders, invoices, the ledger, inventory and the CRM, signed in as a staff user.

Open demo.fincas.dev

Storefront

Browse the catalog, switch between 75 themes, open the landing-page templates and go through checkout.

A product page in the demo store with volume price breaks and stockOpen shop.demo.fincas.dev

Demo data is made up and is restored every night, so anything you change disappears by morning. Outgoing email is switched off.

What's in it

Everything from the first quote to the closed period.

Sales

Quotes with revisions, sales orders with shipment groups and drop-ship lines, invoices, payments, coupons, price lists with tier breaks, tax rates.

Operations

Multi-warehouse stock, purchase orders and receiving, pick tickets, carrier rates and labels, PDF documents for every step.

Accounting

Chart of accounts, fiscal periods, and journal entries posted from documents by rules you configure. Trial balance checks included.

CRM

One record per person or organization, with merge, undo and erasure. Leads, pipelines, tasks, communications, and imports from another CRM.

Qwik storefront

A fast, themeable Qwik City shop that reads the ERP live, plus a REST API with an OpenAPI 3 schema if you would rather build your own.

Built to extend

Plugins add navigation, widgets, payment gateways, carriers and integrations. Signed webhooks, custom fields and renameable nouns, no fork needed.

Screenshots

A real back office, not a mockup.

Every image is a capture of the Fincas back office running with demo data.

The full tour โ†’

A package, not a fork

Install it. Extend it. Keep upgrading.

Fincas ships as a Python package. Your deployment is a small Django project that imports its settings and URLs, so upgrades are a version bump, not a merge. Plugins add what your business needs without touching core files.

  • Python 3.12, Django 6.0, PostgreSQL 17
  • One company per instance
  • A documented migration and deprecation policy
  • Docker Compose, systemd or Fly.io

How packaging works โ†’

# hello_fincas/plugin.py
from core.plugins import BasePlugin


class HelloPlugin(BasePlugin):
    name = "hello"
    verbose_name = "Hello, Fincas"

    def get_nav_items(self):
        return ["type": "link",
            "label": "Hello",
            "section": "analytics",
            "url_name": "erp-dashboard",
        ]

# config/settings.py
GOLDEN_PLUGINS = ["hello_fincas.plugin.HelloPlugin"]

Open source

MIT licensed, developed in the open.

Bug reports, fixes and documentation are welcome. Security issues go through a private report, not a public issue.