Access denied
Staff Management
Invite staff, permissions, and structured audit history.
| Name | Role | Status | Last login | Actions |
|---|
| Actor | Action | Target | Date |
|---|
Log detail
Dashboard
Track growth, usage, revenue, and platform health.
Growth overview
Daily trend for the selected range.
What needs attention
Live summaryLive user activity
See where users are active right now · UK focus
Active now
—
Connecting…
Top city
—
Sessions (1h)
—
Unique devices
No live activity
When users open the app in the foreground, they appear here with approximate location.
Most active cities
Live product mix
Share of current sessions by app area (updates in real time).
Popular venues
By menu items indexed
Referral pulse
Codes, clicks, and signups
Challenges
Community engagement
Revenue & subscriptions
Revenue when Stripe / billing telemetry is connected; subscription counts are live from Firestore.
Subscription mix
Billable states across all users
Operations
Platform
Live session devices · updates continuously
Wellness volume
Daily water (bars) and steps (line) for the selected range — click a day to open the monthly leaderboard.
Founder view
Founder Analytics
Behavioral growth, retention, monetization and AI quality — the four signals that actually decide whether the business is working.
Pillar 1 — Growth
How fast are we adding humans?
Pillar 2 — Retention
Are people coming back?
Pillar 3 — Monetization
What's left after the cloud bill?
Pillar 4 — AI IQ
Is the AI actually adding value?
Financial correction
Paste real invoice numbers to override the OpEx estimate. Affects this calendar month only.
Methodology
Where these numbers come from
Show
Methodology
Where these numbers come from
Command centre
System is quiet. Waiting for users...
Active sessions
Foreground sessions in the last 5 minute window
| User | Platform | Location | Current screen | Intent | Active |
|---|
Notifications
Venue (place) requests, pending venue menus, meal deal submissions, GDPR / data requests, and open support tickets. Open an item to go to the right admin screen.
—
| Type | Summary | Status | When |
|---|
Subscriptions
Premium customers · synced from RevenueCat webhooks and manual grants
Customers
Click any row to select and manage
Recent events
Latest webhook payloads · 50 rows
All Users
Last sign-in within 5 minutes
registrations
Points & Rewards
Restaurant Management
Click a restaurant to edit. Use the Settings (logo & banner) tab to set the venue card image.
Place requests
Restaurant/place requests from the app (Request a place). Use these to add new venues in Restaurant Management.
| Place name | Address | Chain | Message | Requested | Status | Actions |
|---|
—
Place request
Import source
Scrape a URL or upload a PDF menu to extract itemsMenu URL
Fetch page → AI extraction
Working…
PDF menu
Upload → OCR + AI extraction
Working…
Extraction result
—
Items extracted
—
High confidence
—
Needs review
Review items
| Name | Category | Description | Price | kcal | P (g) | C (g) | F (g) | Confidence | Source |
|---|
📋
No menu items yet
Import from a URL or PDF above to auto-generate the draft menu.
Venue & publish
Linked venue
Publish checklist
Internal notes & audit log
Audit log
Chains
Search allowlist
Chains/restaurants to include in product search even when Open Food Facts has no UK country tag (e.g. Five Guys, Nando's). Used by the data-pipeline ingest.
UK_CHAIN_ALLOWLIST=
Copy into data-pipeline/.env or set when running: UK_CHAIN_ALLOWLIST=term1|term2
- —
When hidden, chain won't appear in the app
- —
Approved deals for this chain (count in KPI above). Edit or delete any deal below.
- —
To change opening times, use the Settings tab.
When hidden, restaurant won't appear in the app
- —
Set the chain logo and banner image shown on venue cards when the venue name matches this chain.
Weekly automated menu scout. Paste at least one URL — official PDF preferred. Captured changes appear below and in (this chain pre-selected) for review.
UK: use the /gb/en-gb/ menu URL (not /us/). The scout merges PDF + this URL + Deliveroo when all are set, so a thin PDF will not block a full site crawl.
Approve writes products (search/Algolia follows your product pipeline) and menus/…/items for the chain menu in the app.
Name, match patterns, menu ID and active flag: edit from the Chains list via Edit (modal).
Coupon Management
Meal Deal Manager
Bundles and common combinations
Community meal deals
Review and approve or reject user submissions. Approving awards the submitter 5 points.
Submission detail
Select a submission to view and edit.
User barcode products
When a barcode is not in the database, members can add nutrition on Scan → Add product. Each save creates product_catalog,
a row in product_submissions (listed here), and indexes Algolia as mmg_{productId}.
Open a user to see email, subscription, and recent diary logs.
Help Center
Articles
These appear in the app under Simple guides (More → Simple guides, or Help → Simple guides). Use short sentences. Status Active means users can read it.
FAQ Editor
Tickets
Manage and respond to support requests
Filters & Search
Customer satisfaction (CSAT)
Referrals
See all users and who they've referred
Copy / Share message
Message shown when users tap Copy or share their referral code. Use {{CODE}} where the referral code should appear.
Referred users
Where users found us
Answers from onboarding (“Where did you hear about us?”). Read from users.<id>.profile.leadSource (and optional detail). Refresh after new signups; existing users only appear once that field exists.
Breakdown
Share of users who recorded a source (denominator = all users in Firestore).
Users with a recorded source
Up to 400 rows, newest updatedAt first.
Legal
Landing page background
Background image for the app welcome/sign-in screen. Supports JPG, PNG and GIF. If no image is set, the default green background is used.
Current background
Coach recommendation products
Products the in-app Nutrition Coach can suggest (e.g. for sleep or energy). Only these appear in coach replies.
Push Notifications
Campaigns are sent to the mobile app (iOS & Android) via Expo Push. Users must have notifications enabled in the app.
| Title | Type | Target Users | Date Sent / Scheduled | Status | Sent | Opened | Open rate | Actions |
|---|
System push copy
Automated notifications sent from Cloud Functions (social, support tickets, moderation, roadmap, meal nudges, challenges, scheduled goal nudges, etc.). Title and body support placeholders such as {{name}} — keep keys exactly as documented per row. Overrides may take up to ~2 minutes to apply everywhere.
| ID | Label | Category | Placeholders | Actions |
|---|
Preferred Suppliers
Manage onboarding, agreements, promos and app visibility.
Total
—
Active
—
Awaiting Approval
—
Leads
—
Revoked
—
Supplier details
Draft agreements (in person)
Generated agreements not yet fully signed on the admin iPad.
Discount codes live in the app
Pulled from Firestore app_config/preferred_suppliers_hub
— the same document the mobile Preferred Suppliers hub reads (after CRM sync / seed).
Use Remove to delete a partner row from this document only (CRM suppliers/promos are unchanged); map pins linked to that brand id are cleared too.
Revoked suppliers
These records stay in CRM for accountability. Use Status → Revoked on the Suppliers tab to filter the live list. Open a row to see who revoked it, when, and the reason on file.
Deleted suppliers are removed from CRM; the tables below are built from the immutable audit log (admin/support only).
Permanently deleted (audit)
Each row is logged when a supplier document is deleted after revoke.
Revocations (audit trail)
Historical revoke actions with reasons (may include partners still listed as Revoked in CRM).
Removal requests (audit trail)
SLA clock starts when removal is requested from the supplier detail panel.
Data requests
Export or delete requests — respond within 30 days
Pending venue menus
Menus submitted via Menu Analyser. Only the submitter can see them until you approve. Approve to make the menu visible to all users.
Content Moderation
Review user reports: posts, comments, venues, menu data, and fake accounts. View details, remove content, ban users, or reply to the reporter.
Report details
Social moderation
Review reports for social posts, comments, and profiles. Look up a user by Firebase UID to see account info and block relationships.
Quick user lookup (UID)
Report details
Community Challenges
Create and manage time-based challenges. Launching a challenge sends a push to all users.
Challenge detail
Environment
Points for actions, referral, and other app behaviour
Points & rewards (appConfig/pointsConfig)
These values are used by Cloud Functions when awarding or deducting points. Changing them affects future actions only.
Awarded when an admin approves a submitted venue menu
Awarded when a community meal deal submission is approved
Reserved for referring a friend (if you enable it)
Earned points expire after this many months
Points required to convert to premium (e.g. 100)
Days of premium granted when user redeems points
Feature control (appConfig/featureControls)
Enable or disable app features globally without a new app release.
What's New / Release notes
Firestore: appConfig/whatsNew
Shown once on the home dashboard per Release ID until the user closes it. Users can reopen from Profile → More → About → Release notes. Bump Release ID when you publish new copy.
Blank lines separate paragraphs. Single line breaks become soft breaks inside a paragraph.
Bullets (up to 5 — leave rows empty to skip)
In-app preview
ApproximateUpdates as you edit. Version line uses the real app version on device; placeholder shown here.
What's New in MyMacroGo
Version (from app build)
Danger zone — reset all users' points
This is not a "refresh". It zeros every user's points balance, deletes each user's points_ledger, and resets first-time reward flags. Use for staging resets or catastrophic data fixes only.
API usage & cost management
30-day call volumes from Firestore, modelled £ from your USD list rates and FX. Invoices in GCP are authoritative — this view is for planning and trends.
All charts use the same 30-day window (UTC).
Signups & funnel
admin_funnel_daily · last 30 days (UTC) · older dates on the left of each chart
Google AI (Gemini)
Per-day calls
Places (GMP total) + integrations
Places, email, image pipeline, Algolia
Google Maps Platform (by product)
SKU requests · from admin_api_usage_daily
Estimated cost (this month, UTC)
USD rates × calls × FX → £Non-zero USD list prices in settings are required for non-zero modelled numbers. £0.00 with zeroed rates is expected until you set prices.
Settings & list rates
Budget in £, vendor list prices in USD; the USD fields below are multiplied by FX to match the green estimate block above.
E.g. 0.78 if £0.78 per $1. Leave empty to use 0.78.
Monthly budget (GBP)
Gemini — list price in USD (per call)
Enter vendor USD; estimates above show £ using FX. Gemini pricing
Maps — list price in USD (per request)
Use invoice / SKU
Quick links
Consoles to reconcile against modelled numbers above
Replace project/_ in Firebase URLs with your project ID after opening the console.
Spend summary
Totals from your manual log (this month & all-time).
Add spend entry
| Month | Source | Amount (USD) | Notes | |
|---|---|---|---|---|
| Loading… | ||||
Email Templates
SendGrid dynamic template IDs · config/email_templates
Templates receive subject, appName, and verifyUrl / resetUrl / appUrl as configured in Cloud Functions. Staff invite (optional) uses the same link fields as password reset: resetUrl and setupPasswordUrl.
SendGrid Marketing contacts
Backfill users/* into SendGrid Marketing (same rules as live sync: marketingConsent !== false, resolvable email, not deactivated).
Uses callable adminBackfillSendGridMarketingContacts. Owner/Admin only.
Prerequisite: Firebase secret SENDGRID_MARKETING_CONTACTS_API_KEY must be set to a SendGrid API key with Marketing Contacts (or Full Access) scope — not the same limited key as transactional mail. Bind it to the marketing sync/backfill functions and redeploy. After one batch, if skippedNoSecret equals processed, the secret is still missing on the function. SendGrid may show new contacts a few minutes after a successful upsert (API returns 202).
User feedback
Live stream from the app — current features, future ideas and free-text suggestions. Each user can answer up to 6 prompts in their lifetime, with a 48-hour cooldown between any two prompts.
Current features
Easy / OK / Difficult — >80% Difficult with 3+ votes pinned to top.
Future ideas
Interested vs Not Interested — strong margins float to the top.
Roadmap pool
Edit the in-app future-feature pool. Only active ideas are pitched. Prompt id: roadmap_ + doc id.
Add roadmap idea
Feedback log
Difficult notes and end-of-trial suggestions, newest first.
Audit Log
Full trail of admin logins and actions
Filters
| Time | User | Action | Item / Target | Details |
|---|