Dashboard

Welcome back, Admin • Overview of your business

Not logged in
0
Range:

Total Customers

Products

Active Orders

Revenue

Recent Orders

View All
Order ID Customer Amount Status Source
Loading…

Stock Alert

Manage Stock
Product SKU Stock Status

Analytics Overview

Active Campaigns

Recent Notifications

Quick Settings

All Settings
Themes

Customize dashboard appearance

Current: Dark Mode
API Keys

Manage integration keys

3 keys active
Sync Timing

Configure sync intervals

Every 5 minutes
Security

Authentication & permissions

2FA enabled

Customers Dashboard

Loyalty & points overview
Quick stats

Customer list

Customer profile

Last transaction
View all transactions
Logins & interactions

Logins and app interactions (comments, likes) will appear here when available from Flutter.

All transactions

Add customer

Customer master data is created in ERPNext. Use this form to create login credentials (customer space) so the customer can sign in to the Flutter app or Woo.

Loyalty summary

Activity & logins

Recent customer logins and app interactions (from Flutter) will be listed here when integrated.

Products Dashboard

Data synced one-way from ERPNext. Edits must be done in ERPNext.

Quick actions
Upload supplier invoice / batch

Upload CSV to match items and create batches and price lists locally (ready for future sync to ERPNext).

Product list

Product profile

Select a product from the list.

Data is read-only; sync is one-way from ERPNext.

Item groups

Registry groups require the item_groups table — see docs/scripts/create_item_groups.sql.

Group (category)SourceActions
Loading…

Suppliers

NameDisplay nameTypeEmailPhoneActive
Loading…

Batches

Batch noProduct IDSupplier IDQty remainingCostExpiry
Loading…

Upload supplier invoice / batch

Upload CSV with: Item name, Buy price, Sell price, Qty (quantity received for stock and batch), Supplier part number (optional). Choose supplier and invoice number below (not in the file). We match rows to products by name and supplier part no; pick New item when there is no catalog match yet. Batch numbers look like Acme-009-L0 (supplier prefix + next sequence + line suffix so every line is unique). Data is stored locally (sync to ERPNext when 2-way is enabled).

Required for supplier-scoped matching, batch sequence, and item–supplier links.
Stored on batch records as purchase reference.
Confirm match per row (change if wrong)

Unmatched lines are listed first. Use New item when the product is not in the catalog yet (those lines are skipped on confirm).

Item name Buy Sell Qty Supplier part no Match (Item code)

Settings — API

API Settings

System settings (API category). Admin can edit.

Settings — Sync

Run sync by entity

Data is synced from the ERPNext API. Full = sync all records; Modified = only records changed since last run. Run requires SYNC_POST_ENABLED=true in .env and the entity enabled under Settings → Sync controls.

Entities: Items, Customers, Sales (invoices + items), Loyalty. Batches and Stock can be added when backend sync is implemented.

Auto-sync intervals (hours)

Configure how often each entity is synced (used by scheduled jobs). Set via env: SYNC_INTERVAL_ITEMS_HOURS, SYNC_INTERVAL_CUSTOMERS_HOURS, SYNC_INTERVAL_SALES_HOURS, SYNC_INTERVAL_LOYALTY_HOURS.

Sync status (all entities)

Shows ERPNext job keys only. Legacy rows (orders, order-items, …) are hidden; use Prune legacy once to delete them from the database.

Sync live feed

Recent sync runs. Clear to start fresh.

Settings — Sync controls

Checked = direction allowed; unchecked = API returns 403 for that route. POST triggers also need SYNC_POST_ENABLED=true in server .env. Admin only for Save.

GET — read APIs
POST — pull / run sync

Settings — Analytics

Analytics Settings

Settings — API Keys

Flutter Mobile App (X-App-Key)

Use this key in Flutter as the X-App-Key header. After refresh or leaving the page the value is replaced by *** and cannot be retrieved.

API Keys

Use these keys to authenticate Flutter apps or external integrations.

Settings — Users

Users (Admin only)

Manage dashboard users (data from DB table users). Admin only.

Click a user to open profile. Admin only.

Role permissions (defaults by category)

Set default permissions for each role. Affects new users and can be applied when editing users. Menu:* keys show or hide sidebar items. Clerks have no settings.view by default (Settings hidden). Admin / Super Admin roles are required for user management APIs, not only the is_admin flag.

User profile

Media library

Images uploaded for campaign banners etc. Stored under ui/media/, URL path /media/<file>.

PreviewURLSizeActions

Orders · ERPNext

Order detail

To Do

Items waiting for approval (e.g. clerk-added batches, customers). Click an item to view and Accept, Edit, or Delete.

Pending (0)

    Select an item from the list.

    Translations

    Run docs/scripts/content_translations.sql on Postgres once (includes translation_import_rows.content_field for CSV import). Matrix/CSV include a field column: name for products, categories, packages; for Campaigns / promotions use title, description, or display_text per row (promotion UUID as entity_id). The Item code column matches CSV identifier.

    Verify backend: python -c "from api.main import app" (from core_backend with venv activated — not a raw PowerShell from line).

    Item codeFieldSource name Translation (edit)

    Edit the translation field and press Tab or click outside to save. Clear the field and blur to remove the translation for this language.

    Export (load table, then download CSV)

    Download CSV saves all rows that match the filter (every page), UTF-8 with BOM, same columns as the table.

    Import from file

    No import loaded. Upload a CSV to preview.

    Flutter app

    Backend URLs for mobile apps, category visibility and display names for the customer app, and policy/subscription URLs. Customer apps read the merged config from GET /api/v1/mobile/app-config.

    Customer App

    Mobile app for end customers (orders, loyalty, profile).

    Use an API Key from Settings → API Keys (or the dedicated Flutter app key) in the app.

    Admin App

    Admin/staff app for management and reports.

    Use an API Key from Settings → API Keys in the app.

    Categories are taken from active products in the warehouse. Uncheck to hide a category in the customer app. “App label” is shown in Flutter; leave empty to use the backend name.

    Backend categoryShowApp label (optional)

    General app policy pages (terms, rules, refund, privacy). Returned under urls on GET /api/v1/mobile/app-config for WebView or in-app links.

    Per-locale URLs for subscription terms (Flutter subscription hub and flows). Stored as subscription_terms_urls; merged into app-config as urls.subscription_terms_by_locale.

    Subscriptions — Overview

    Customer subscribe flow uses /api/v1/subscriptions/*. Schedule POST /api/v1/subscriptions/admin/subscription-cron (staff JWT) for locks, rolling deliveries, and in-app notifications.

    Pending requests
    Active subscriptions
    Upcoming deliveries
    Rolling (post-commitment)
    In commitment phase
    Ended (cancelled / completed)
    Locked deliveries (not delivered)
    Delivered subscription revenue (last 30 days, sum of final_price per day)
    Pending requests (first 50)
    IDTypeCreatedPayloadActions

    Staff with admin role can approve or reject here (optional note). API: POST .../admin/requests/{id}/approve / reject. Manage lists by phase in Subscriptions → Customers.

    Subscriptions — Customers

    Lists match docs/subscription.md §13: rolling vs commitment vs ended. Use Manage for timeline, upcoming drops, and requests. Summary KPIs and charts stay on Overview.

    Sub#CustomerPackageWindowStatusRollingCommitment endNextActions

    Subscriptions — Deliveries

    Operational drops from GET /subscriptions/admin/deliveries (max 300). Use manifest for locked line items; assign staff from Assign.

    Del IDSub#DateCustomerPackageWindowStatusLockERP inv.ManifestAssign

    Subscriptions — Packages

    Create or edit catalog packages; open Structure to configure choice slots, products (search by name), allocations, and fillers.

    IDNameCycleCommitPriceActiveActions

    Package structure

    Price per delivery (target)
    Sum of listed allocations + fillers
    Remaining

    Allocation is how much each line counts toward the delivery bundle total (used when building manifests). It is often the same as sale price, but you can change it for bundle pricing. Listed lines are summed for this helper; customer choices may differ. System tolerance is typically ±£1 vs target.

    Open this page from Packages → Structure.

    Subscriptions — Areas & windows

    Areas and slots power customer subscribe windows (GET /subscriptions/delivery-slots).

    Areas

    Delete only when an area has no time windows (or after removing every window that is not referenced).

    Area IDName# windowsActions
    Time windows
    Slot IDAreaLabelWindowCutoff (h)MaxActions

    Create campaign

    Workflow: (1) Save draft — store incomplete work (clerks). (2) Create & activate — full validation, ready for timeline. (3) ERPNext — open ERP payload from list and paste into Pricing Rule. (4) Publish to app — admin uses Publish on a draft to show in Flutter/Woo when dates are active.


    Conditions

        Reward

        Campaigns

        List campaigns and open ERPNext payload for manual copy/paste. Double-click a row (outside buttons) to edit, including active campaigns.

        Title Type Valid Status ERP Actions
        Loading…

        Campaign analytics

        Overview (last 7 days): impressions, clicks, CTR, average time spent.

        Campaign Impressions Clicks CTR Avg time
        Loading…