—
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 SettingsThemes
Customize dashboard appearance
Current: Dark ModeAPI Keys
Manage integration keys
3 keys activeSync Timing
Configure sync intervals
Every 5 minutesSecurity
Authentication & permissions
2FA enabledCustomers Dashboard
Loyalty & points overview
Quick stats
Customer list
| Name | ID | Nationality | Points | Loyalty |
|---|
Customer profile
Last transaction
View all transactionsLogins & 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 / batchUpload CSV to match items and create batches and price lists locally (ready for future sync to ERPNext).
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) | Source | Actions |
|---|---|---|
| Loading… | ||
Suppliers
| Name | Display name | Type | Phone | Active | |
|---|---|---|---|---|---|
| Loading… | |||||
Batches
| Batch no | Product ID | Supplier ID | Qty remaining | Cost | Expiry |
|---|---|---|---|---|---|
| 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).
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.
Settings — Analytics
Analytics Settings
Settings — API Keys
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>.
| Preview | URL | Size | Actions |
|---|
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 code | Field | Source 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 category | Show | App 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.
final_price per day)Pending requests (first 50)
| ID | Type | Created | Payload | Actions |
|---|
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# | Customer | Package | Window | Status | Rolling | Commitment end | Next | Actions |
|---|
Subscriptions — Deliveries
Operational drops from GET /subscriptions/admin/deliveries (max 300). Use manifest for locked line items; assign staff from Assign.
| Del ID | Sub# | Date | Customer | Package | Window | Status | Lock | ERP inv. | Manifest | Assign |
|---|
Subscriptions — Packages
Create or edit catalog packages; open Structure to configure choice slots, products (search by name), allocations, and fillers.
| ID | Name | Cycle | Commit | Price | Active | Actions |
|---|
Package structure
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 ID | Name | # windows | Actions |
|---|
Time windows
| Slot ID | Area | Label | Window | Cutoff (h) | Max | Actions |
|---|
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.
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… | ||||