{{ allMenuItems.find(item => item.id === currentView)?.name || 'Dashboard' }}
{{ currentEnvironment }}⚠️ Production Environment
You are managing the PRODUCTION environment. Changes will affect live data. Please be careful!
Total Products
{{ stats.products }}
Total Doctors
{{ stats.doctors }}
Total Pharmacies
{{ stats.pharmacies }}
Total Orders
{{ stats.orders }}
Total Users
{{ stats.users }}
Quick Actions
Slack Error Logging Test
Developer Tools
Test that Slack error notifications are working correctly. Messages will be sent to #soos-errors.
{{ slackTestResult.message }}
| Image | Name / Abbreviation | THC / CBD | Price / Stock | Category | CannaFlow | Status | Actions |
|---|---|---|---|---|---|---|---|
|
|
{{ product.name }}
{{ product.abbreviation || '-' }}
|
THC: {{ product.syncedFields?.thc || '-' }}%
CBD: {{ product.syncedFields?.cbd || '-' }}%
|
€{{ (product.syncedFields?.price / 100).toFixed(2) || '0.00' }}
Stock: {{ product.syncedFields?.stock || 0 }}
|
{{ product.category || '-' }} | {{ product.cannaflowId }} Not linked | {{ product.active !== false ? 'Active' : 'Inactive' }} |
| Image | Product Name | Category | Manufacturer | Variants | Status | Actions |
|---|---|---|---|---|---|---|
|
|
{{ template.displayName }}
{{ template.cultivar || '-' }}
|
{{ template.category || '-' }} | {{ template.manufacturer || '-' }} |
{{ template.cannaflowIds?.length || 0 }}
({{ getAvailableVariantCount(template) }} available)
|
{{ template.active !== false ? 'Active' : 'Inactive' }} |
{{ selectedTemplate.displayName }}
{{ selectedTemplate.cannaflowIds?.length || 0 }} variants
No variants found for this template
| Name | Specialty | Phone | Actions | |
|---|---|---|---|---|
|
{{ doctor.name }}
|
{{ doctor.specialty }} | {{ doctor.email }} | {{ doctor.phone }} |
| Name | Phone | Address | Actions | |
|---|---|---|---|---|
|
{{ pharmacy.name }}
|
{{ pharmacy.email }} | {{ pharmacy.phone }} | {{ pharmacy.street }}, {{ pharmacy.city }} {{ pharmacy.zip }} |
Catalog Sync
Updates prices & availability from pharmacy catalog
{{ catalogSyncResult.stats?.variantsUpdated || 0 }}
Updated
{{ catalogSyncResult.stats?.variantsCreated || 0 }}
Created
{{ catalogSyncResult.stats?.variantsUnavailable || 0 }}
Unavailable
Registry Sync
Scans full Cannaflow registry for new variants
{{ registrySyncResult.stats?.registryProductsScanned || 0 }}
Products Scanned
{{ registrySyncResult.stats?.newVariantsDetected || 0 }}
New Variants Found
⚠️ Broken products skipped:
{{ registrySyncResult.stats.brokenProducts.join(', ') }}
Google Sheet Import
Import templates & variants from the product spreadsheet
{{ sheetImportResult.stats?.totalRows || 0 }}
Rows
{{ sheetImportResult.stats?.templatesCreated || 0 }}
Templates Created
{{ sheetImportResult.stats?.templatesUpdated || 0 }}
Templates Updated
{{ sheetImportResult.stats?.variantsCreated || 0 }}
Variants Created
{{ sheetImportResult.stats?.skipped || 0 }}
Skipped
⚠️ {{ sheetImportResult.stats.errors.length }} errors:
Sync Status
Templates
{{ variantSyncStatus.templatesCount || 0 }}
Active Variants
{{ variantSyncStatus.activeVariantsCount || 0 }}
Last Catalog Sync
{{ variantSyncStatus.lastCatalogSync ? formatDateTime(variantSyncStatus.lastCatalogSync) : 'Never' }}
Last Registry Scan
{{ variantSyncStatus.lastRegistryScan ? formatDateTime(variantSyncStatus.lastRegistryScan) : 'Never' }}
Last Sheet Import
{{ variantSyncStatus.lastSheetImport ? formatDateTime(variantSyncStatus.lastSheetImport) : 'Never' }}
Click refresh to load sync status
Catalog Sync
- • Fetches products from pharmacy catalog
- • Updates prices, availability, stock
- • Runs automatically every 6 hours
- • Only updates existing variants
Registry Sync
- • Scans full Cannaflow registry
- • Detects new variants for templates
- • Sends email notifications
- • Handles broken products gracefully
Sheet Import
- • Imports from Google Spreadsheet
- • Creates templates & variants
- • Use "Dry Run" to preview
- • Run after updating the sheet
| Order ID | Doctor | User | Status | Items | Created | Invoice | Actions | |
|---|---|---|---|---|---|---|---|---|
|
{{ order.id.substring(0, 8) }}...
|
{{ getDoctorName(order.doctorId) }} | {{ getUserDisplayName(order.userId) }} |
{{ getOrderStatusLabel(order.status) }}
⚠️
|
{{ order.items?.length || 0 }} items | {{ formatDate(order.createdAt) }} | - |
| ID | Name | Phone | Birthdate | Actions | |
|---|---|---|---|---|---|
|
{{ user.id }}
|
{{ user.fullName || `${user.firstName || ''} ${user.lastName || ''}`.trim() || 'N/A' }}
|
{{ user.email || 'N/A' }} | {{ user.phoneNumber || 'N/A' }} | {{ user.birthdate || 'N/A' }} |
Bulk Invoice Generation
Generate and download invoices for all orders within a specified date range.
This will generate invoices for all orders created between {{ new Date(invoiceStartDate).toLocaleDateString() }} and {{ new Date(invoiceEndDate).toLocaleDateString() }}. All invoices will be downloaded as a ZIP file.
Total Vouchers
{{ voucherAnalytics?.totalVouchers || 0 }}
Active Vouchers
{{ voucherAnalytics?.activeVouchers || 0 }}
Total Redemptions
{{ voucherAnalytics?.totalRedemptions || 0 }}
Total Discount Given
€{{ ((voucherAnalytics?.totalDiscountGiven || 0) / 100).toFixed(2) }}
Manage Vouchers
| Code | Type | Value | Applies To | Usage | Status | Actions |
|---|---|---|---|---|---|---|
|
{{ voucher.code }}
{{ voucher.description }}
|
{{ voucher.type }} | {{ voucher.value }}% €{{ (voucher.value / 100).toFixed(2) }} | {{ voucher.appliesTo }} | {{ voucher.usageCount || 0 }} / {{ voucher.usageLimit }} / ∞ | {{ voucher.active ? 'Active' : 'Inactive' }} |
Redemption Statistics
| Voucher Code | Redemptions | Total Discount | Status |
|---|---|---|---|
| {{ stat.code }} | {{ stat.redemptions }} | €{{ (stat.totalDiscount / 100).toFixed(2) }} | {{ stat.active ? 'Active' : 'Inactive' }} |
Loading report data...
{{ reportingError }}
Total Orders
{{ reportingData.summary?.totalOrders || 0 }}
Paid Orders
{{ reportingData.summary?.paidOrders || 0 }}
Revenue
€{{ Math.round((reportingData.summary?.totalRevenue || 0) / 100) }}
Total Grams
{{ reportingData.summary?.totalGrams || 0 }}g
Active Users
{{ reportingData.summary?.activeUsers || 0 }}
KPIs
{{ reportingData.summary?.totalKPIs || 0 }}
Top 5 Brands by Grams
Top 5 Strains by Grams
Revenue by Category
User Age Distribution
Order Status
Top 10 Pharmacies
| Rank | Pharmacy | Orders | Grams | Revenue | % Share |
|---|---|---|---|---|---|
| {{ index + 1 }} | {{ pharmacy.name }} | {{ pharmacy.orders }} | {{ pharmacy.grams }}g | €{{ Math.round(pharmacy.revenue / 100) }} | {{ pharmacy.percentage?.toFixed(1) }}% |
User Behavior Metrics
Product Categories
No Report Data
Select a week and click Refresh to load the report.