Click an order to enter carrier & tracking. Marks the order shipped and fires the customer notification.
Order
Buyer
State
Items
Carrier
Tracking
Incoming — receive PO
Add a received PO; quantities are added to inventory and tagged to a lot for COA traceability.
SKU
Qty
Lot
Supplier
Cost
Date
Order refusal log
Orders refused for non-research-use indicators or restricted-state shipping. Records retained for compliance.
Date
Order
Reason
State
Refunded
Total SKUs
0
In stock
0
Low
0
Out
0
Live inventory scan
Type or scan a lot barcode (Code-128 from /label-maker). Pick the action, hit Apply — the database updates and we log the actor + lot to the audit table.
Time
Barcode
Action
Qty
SKU
Now
Cycle count in progress
Scan each vial, then close to reconcile.
Expected
—
Counted
0
Variance
—
No scans yet.
Edit cost / stock / lot / bin / expiry inline. Margin auto-computes. Stock of 0 immediately marks the product OUT OF STOCK on the live site. FEFO picking uses the expiry date. Persists to products when Supabase is wired.
SKU
Name
Bin
Lot
Expiry
Size
Price
Cost
Margin
Stock
Status
Scan-to-pick workflow. Scan the order barcode (or paste the Order #), then scan each vial's lot barcode to confirm picked. Lot mismatches are blocked. Weight capture confirms pack accuracy.
Step 1 · Order
Scan or enter order
Step 2 · Pick
Scan each vial lot
Step 3 · Pack
Weigh & close
No order loaded.
Per-lot vial label maker (NEW)
Pick SKU + Batch/Lot/Test, generates per-lot QR (links to COA) and inventory Code-128 barcode. 3 mL peptide + 10 mL bac-water variants. Save persists to lots table.
Below: legacy 4×6 shipping label generator and 2×1 product label PDF. Used for outbound shipping.
Shipping label (4″ × 6″)
Product / vial label (2″ × 1″)
Auto-prints: SKU · LOT · MFG / EXP · mass · purity · Code-128 barcode · "RUO — Not for Human Use"
Printer connectors
DYMO LabelWriter
Install DYMO Connect on the workstation. Web SDK auto-detected. Status: checking…
Brother QL
Use the system print dialog with QL-820NWB / QL-1110NWB. Set media to die-cut 2″×1″ or continuous 62mm.
Zebra ZD420 / ZD621
Browser Print SDK URL:
Recent labels
Time
Type
Order/SKU
Carrier/Lot
Authorize a research-material return. Per the RUO policy, returns are only accepted for cold-chain breach, broken vial, or incorrect SKU. No human-use returns.
Open RMA
RMA #
Date
Order
SKU
Reason
Resolution
Status
Issue a partial or full refund against an order. Audit-logged. When the processor is wired, fires the real refund API.
Issue refund
Time
Order
Amount
Reason
Note
Status
Actor
Create promo codes. Cart on the public site applies them automatically when the customer types or pastes the code.
Create code
Code
Type
Value
Uses
Cap
Expires
Status
Revenue, COGS, gross margin, refunds, taxes collected, and net for any window. Pulls from xfp_orders + xfp_inv (cost) + xfp_refunds. Exports for the bookkeeper.
Revenue
$0
COGS
$0
Gross margin
$0
Refunds
$0
Per-SKU breakdown
SKU
Units
Revenue
COGS
Margin
Margin %
Researcher loyalty: 1 point per $1 spent, 100 points = $5 off. Store credit balance applied at checkout. Gift cards: issue + balance + redeem. All keyed by customer email.
Members with points
0
Outstanding points value
$0
Active gift cards
0
Adjust customer points / credit
Loyalty ledger
Email
Points
Points $ value
Store credit
Last action
Gift cards
Code
Amount
Balance
To
Issued
Status
Subscribe & Save: customers create recurring orders from the account dashboard. Pause / skip / cancel any time. 10% off every refill. Activates real recurring billing when the processor + Supabase are wired.
Active subscriptions
0
Paused
0
MRR (est)
$0
Email
SKU
Qty
Cadence
Next ship
Status
Multi-warehouse routing. Pick & Pack will route each order to the nearest warehouse with stock. Single-warehouse mode by default.
Add warehouse
Name
State
ZIP
Priority
SKUs in stock
Publish research-context posts under /blog/<slug>.html at build time. Each post is generated from the title + body below. SEO meta + canonical baked in.
New post
Slug
Title
Author
Date
Posts are saved to localStorage and rendered on /blog/index.html. When Supabase is wired, posts persist server-side.
Researchers waiting on OOS restocks. Trigger a notify-all on a SKU when the lot ships.
Time
SKU
Email
Inbound institutional inquiries from /wholesale.html. Triage, quote, convert to PO/Net-30.
Time
Org
Contact
Type
Volume
Pay
Status
Inbound affiliate applications from /affiliate.html. Approve → unique ?ref= code generated. FTC-disclosure attestation required at signup.
Time
Name
Email
Audience
Size
URL
Status
COAs live at /coa/<LOT>.pdf. Add a record here so the public product page links it.
Lot
SKU
Purity
[M+H]+
Endo
Test Date
Path
Tickets
Select a ticket from the list.
Inline edit Notes (internal context) and Tags (comma-separated). Loyalty column shows points + store credit balance. Click email to open mail client.
Email
Name
State
Orders
LTV
Last order
Status
Notes
Tags
Loyalty
Operations Agents
Run the business with five named agents.
Each agent reads from the live Supabase backend, has scoped tools, and refuses anything that violates the RUO posture. Backed by Claude Haiku 4.5 via the /agent edge function. The Anthropic key never touches the browser.
Backend: checking…
Research Agentresearch
Pick an agent above and ask anything. Examples: "What's in the Healing Stack and what does each compound do? cite primary literature", "Triage today's orders", "Scan this product description for FDA flags".
Launch Center
Today's go-live checklist.
Each row pings the actual service. Green = ready, yellow = configured but unverified, red = action required. The first three rows are the only hard blockers for crypto-only checkout.
Supabase backend
Paste URL + anon key into data.js · run migrations + seed
Open Supabase, paste URL + anon key into data.js, run the three SQL files.
Open Coinbase Commerce, paste API key + webhook secret into Supabase secrets, set the webhook URL.
Open Anthropic Console, paste API key into Supabase secrets.
Add xfactorpeptidelab.com CNAME file + A records.
Make an admin user (see SETUP step 8), log in here, watch every row turn green.
Cards land later when PaymentCloud clears. Today's launch is crypto-first. That's not weakness — that's how every RUO ecom that's actually online operates for week one.
Buyer attestations recorded with timestamp + UA + timezone. Persisted to attestations in Supabase when wired.
Timestamp
Order
21+
RUO
Terms
UA
TZ
Pending researcher reviews. Approve to publish to the site, reject with a reason. Approved reviews appear in the public Reviews section. Submission lint blocks medical/dosing language at submit time.
Submitted
Email
Token
SKU
Rating
Body
Published reviews
Date
SKU
Name
Rating
Body
Add admin
Adds the email to admin_users. They receive an invite email with a one-time-use sign-up link (when Supabase is wired). Until then, the seed-admin can create local admin records.
Email
Role
Status
Added
Last login
Transfer ownership
Hand the Owner role to another admin. Current Owner is downgraded to Manager. Action is irreversible without a co-owner countersign.
Every admin write action is recorded with actor, timestamp, route, and diff. Append-only.
Time
Actor
Action
Target
Detail
Integrations
localStorage · this device
Coinbase Commerce
API key (reference)
Email signup
Key · List ID
Analytics
Chatbot backend
Vendor key vault
encrypted-at-rest · supabase pgsodium
Paste a key. The browser encrypts and sends it; only edge functions can decrypt at runtime.
Vendor onboarding
Step-by-step. Every vendor below has its key field pre-wired. Paste the key, click Test, and the site flips from localStorage stub to real dispatch.
Supabase (DB + Auth + RLS)
Paste your project URL and anon key. Schema is in ARCHITECTURE.md. RLS policies are skeletoned there too.
Email service (ESP)
Resend or Postmark. We send: order confirmation, ship notification, COA-on-publish, password reset, waitlist back-in-stock blasts. DNS records template is in DNS.md.
Shipping rates & labels
Shippo (recommended) or EasyPost. Powers live shipping-rate quotes at checkout and one-click label purchase + tracking lookup from the admin.
Tax engine
TaxJar or Avalara. Multi-state sales tax. Required once revenue triggers nexus in any state.
KYC for high-risk orders
Persona or Stripe Identity. Triggered when an order's value or qty exceeds the threshold below.
SMS notifications
Twilio. Optional ship notifications and 2FA.
Live chat (customer-facing)
Tawk.to or Crisp. When configured, the live chat widget loads on every public page. Falls back to the on-site research chatbot when not configured.
Operations alerts
Slack incoming webhook. Fires on: new order, low stock, RMA, refund.
Payments + checkout
High-risk processor. Configure via data.js (XFP_PROCESSORS) or a single proxy endpoint here.
Demo data
Populate the dashboard, orders, pick-pack, customers, COAs, attestations, tickets, and audit log with realistic sample data so you can walk through the system end-to-end. Clear before going live with real orders. All entries are tagged DEMO in the data so they are obvious.
Change password
First-login owners are prompted to change the temp password. Strong-password rules: 12+ chars, mixed case, number, symbol.
📷 SCAN BARCODE
Point the camera at a Code-128, QR, or EAN barcode. Manual entry: