The setup that drives every batch downstream. Settings is laid out as ten numbered sections, ordered roughly “essential to optional” — formulas + pitcher up top, branding + integrations toward the bottom. Hardware sections (wicks → lids → containers) sit in dependency order: containers reference your wick + lid registries, so define those first.
The eleven sections
- 01 · Wax → Fragrance Ratio — My Waxes + My Formulas + the (oz wax × load %) = oz fragrance math + batch-size presets.
- 02 · Pour Pitcher — your pitcher capacity presets.
- 03 · Wick Registry — wicks you actually buy.
- 04 · Lid Registry — lids you actually buy.
- 05 · Container Registry — jars + tins + refills, referencing wicks + lids by ID.
- 06 · Costs & Thresholds — default oil buy size, low-stock threshold, oz vs gm, wick-sticker line item.
- 07 · Brand Dispatch — brand name, AI naming voice, recipe-share tagline.
- 08 · Square Integration — OAuth + product mapping + Sync Now.
- 09 · Shopify Integration — OAuth + product mapping + Sync Now.
- 10 · Inventory Sync — source-of-truth picker + per-channel inbound/outbound + cadence.
- 11 · Account Security — TOTP 2FA enable / disable (Basic + Pro). Step-up on every sign-in.
01 · Wax → Fragrance Ratio
The single most important card on the page. Three things live here: the waxes you buy, the formulas you reuse, and the BLNDR-wide ratio that drives every recipe.
My Waxes
- 1
Add a wax
Pick from the wax catalog (auto-fills the tech sheet — melting point, pour temp, cure time, recommended load range).
- 2
Set the actual price you pay
Per-pound cost. Drives
$/lbin COGS — list price is fine for a quick start, but real margin needs your real wholesale price. - 3
Pin a default
Click the
★on a row. The Mixer and Batch Planner both pre-select it on cold start.
My Formulas
A formula is a saved (wax + load %) pair you reuse. The Batch Planner reads from this list for its formula dropdown — useful when you pour the same wax+load combo across many recipes (e.g., “Coconut Apricot at 8%”).
- 1
Add a formula
+ ADD A FORMULA→ pick a wax → enter load % → name it → save. - 2
Pin a default
Star a row. The Batch Planner picks it automatically when you start a new batch.
- 3
Remove a formula
The × button flips to
DELETE?for 3 seconds. Click again to confirm.NOTETwo-step inline confirm instead of a nativewindow.confirm()because iOS Safari can silently suppress confirm dialogs in some contexts — a real bug that bit a user once.
═ THE FORMULA ═ (the master ratio)
The big horizontal equation card: RECIPE RATIO BASE × FRAGRANCE LOAD = FO PER RECIPE.
- RECIPE RATIO BASE — the oz of wax every recipe is built around (default 1 oz). Change it and every recipe scales with it.
- FRAGRANCE LOAD — slider, 1–40%. Soaps + salves use much higher loads than candles; even within candles a maker may push past the wax's stated max for stronger throw. Min/max from the wax record show as a recommendation — flagged when exceeded but never enforced.
- FO PER RECIPE (DERIVED) — the output number CHANDLER + the Mixer reference when scaling.
The card includes a plain-English readout below — “Every recipe will tell you to pour X oz of fragrance oil per Y oz of wax. Drop the load to 8% and it becomes…” — useful for sanity-checking the math.
Batch Size Presets
Quick-pick numbers shown when planning a batch (each = how many containers in one pour). Click an existing chip to remove it; click + to add a new one. Pick the counts you actually pour (6, 12, 24…) so you're not re-typing every time.
02 · Pour Pitcher
The capacity (oz) of the melting pitchers you actually use. Multiple presets supported — the Batch Planner's pitcher-size dropdown reads from this list.
- 1
Pick or add a capacity
Default presets: 40 / 60 / 80 / 100 oz. Click a preset to make it your active size, or use
+ Addto enter a custom number. - 2
Remove a preset
Click the × on any preset chip.
03 + 04 + 05 · Hardware registries (Wicks → Lids → Containers)
03 · Wick Registry
Wicks vary too widely across vendors for a centralized catalog to pay back, so users hand-enter what they own. Same row-shape as Lids.
- 1
Click + Add
Inline form. Required: Name (e.g., “ECO-12”).
- 2
Optional fields
Cost per unit, owned qty, restock threshold + restock_enabled, source URL.
- 3
Save
Row lands in the registry; available immediately in the Container form's default-wick dropdown.
04 · Lid Registry
Same shape as wicks. Name + optional cost / stock / threshold / URL.
05 · Container Registry
Two add buttons: + ADD for a regular container, + ADD REFILL for a refill SKU that inherits everything from a parent container.
- 1
Click + ADD
Opens the container form.
- 2
Pick the default wick + lid from the dropdowns
Both populated from your wick + lid registries (Sections 03 + 04). If either dropdown is empty, jump back, save what you need, then return — the dropdown updates immediately.
- 3
Set wicks-per + lids-per
Most jars are 1 + 1. Multi-wick vessels go up to 14×. The decrement multiplier lives on the container row, not on the wick/lid row — so a 14-wick container decrements
14 × wick.costper unit produced. - 4
Fill in the rest
- Name + size — “Status Jar 8oz”.
- Fill weight — oz of wax it actually holds.
- Cost — your buy price; in COGS.
- Sell price + optional refill price.
- Owned qty + restock threshold + restock_enabled.
- 5
Refill rows
+ ADD REFILLcreates a row that points at a parent container (inherits fill weight, default wick, default lid) but stores its own refill price. Refill containers in the Batch Planner show oil-amount + dedicated-pitcher controls instead of qty pills, and skip Square / Shopify outbound (the customer brought their own vessel).
06 · Costs & Thresholds
- DEFAULT OIL BUY SIZE — pick from the catalog's known sizes (1 oz, 4 oz, 8 oz, 16 oz, 1 lb, 5 lb, etc.). Affects the cost-per-oz the Batch Planner uses for COGS.
- LOW STOCK ALERT (oz) — global threshold for fragrance oils. Drops below this and an oil shows the amber Low badge in Owned Oils.
- DEFAULT MEASUREMENT —
OUNCESorGRAMS. Affects the Batch Planner's per-pitcher breakdown unit and the refill row's oil-amount input. - OTHER EXPENSES → WICK STICKERS — adhesive disks at the bottom of every jar. One sticker per wick used; cost per sticker, stock on hand, warn-below threshold, reorder URL. Auto-applied to every batch — flows into COGS, decrements at commit.
07 · Brand Dispatch
- BRAND NAME — appears on the public recipe-share page.
- BRAND VOICE — the AI Namer's default voice. Pick from
LUXURY — SOPHISTICATED,SNARKY — WITTY,BASIC — CLEAR,NOTE-BASED — DESCRIPTIVE. Per-name overrides happen in the Mixer; this just sets the default. - RECIPE SHARE TAGLINE — up to 100 chars. Shown at the bottom of every
blndr.io/r/[shortId]share page. Default: “Crafted with BLNDR. Not alchemy, but close enough.”
08 · Square Integration
OAuth-based. Tokens are AES-256-GCM encrypted at rest.
- 1
Click CONNECT SQUARE
Bounces to Square's OAuth consent screen. Grant access to inventory + catalog read/write.
- 2
Land back at /settings?square_connected=true
The card flips to “Connected”. A wizard launcher appears:
Map products. - 3
Map containers to Square catalog items
For each saved container, pick the matching Square catalog item — that's the SKU finished candles will adjust on commit.
- 4
Hit Sync Now (one-time pull)
First sync mirrors current Square inventory into BLNDR's cache so the Stock Check + Owned Counts read accurately.
09 · Shopify Integration
Same OAuth model as Square. Tokens encrypted at rest. Adds two extras: GDPR webhook handlers (data-request, redact, shop-redact) and inventory backups.
- 1
Open your Shopify Admin in another tab
Make sure you're signed in to the same store you want to connect.
- 2
Click CONNECT SHOPIFY in BLNDR
OAuth consent screen appears with the requested scopes.
- 3
Approve
Land back in BLNDR. Map your containers to Shopify products (same picker as Square).
- 4
Snapshot + sync
The Shopify card has an “Inventory backups” subpanel — every sync auto-snapshots the current Shopify inventory so a bad sync is reversible.
10 · Inventory Sync (source of truth + cadence)
Once both integrations are connected, this is where you tell BLNDR which channel owns the inventory and which is a mirror.
- 1
Pick the source of truth
BLNDR,Square, orShopify. The engine pulls from this channel on a schedule, decrements it on inbound sales (e.g., a Shopify order arrives), and pushes finished-candle counts to the mirrors when you Make Batch. - 2
Configure each channel
One row per available channel with two toggles each:
- Outbound — when ON, BLNDR pushes new counts to this channel.
- Inbound — when ON, BLNDR receives new counts from this channel (via webhooks).
The source-of-truth row is highlighted; you usually want its outbound OFF (BLNDR doesn't overwrite the source) and inbound ON (sales decrement the source). Mirrors typically have outbound ON (they receive) and inbound OFF (BLNDR ignores their changes).
- 3
Pick a cadence
How often the source-of-truth pull runs (every 15 / 30 / 60 minutes, etc.). Inbound webhooks fire in real-time on top of this — the cadence is just the safety-net poll for missed events.
- 4
Save Sync Settings
The button confirms with a green “Saved.” flash. Last synced timestamp updates as the engine runs.
11 · Account Security (Basic + Pro)
Two-factor authentication for your account. Free tier sees an upgrade prompt — Basic and Pro can opt-in.
- 1
Click ENABLE 2FA
Routes to
/auth/2fa/setup. A fresh TOTP factor is generated; you scan the QR with any authenticator app and enter the 6-digit code to confirm. - 2
Subsequent sign-ins step up
After your password, you'll land at
/auth/2fa/verify. Type the current code, you're back in. The challenge is required once per session. - 3
Disable requires a fresh code
Click
DISABLE 2FAon the Settings card. The button reveals an inline 6-digit input — entering a current code from your authenticator unenrolls the factor on the server. Without the code (or with an old one), the disable fails.
security_audit_log so we have a forensic trail. See Account Security → User-side 2FA for the full flow.