Developer DocsSettings & Constants

Settings & Constants

This is the Table B reference: the shop’s cost constants, material costs, the dimensional price grid, and shop identity. The owner edits these once on the Settings screen; the salesperson never sees them (see Architecture). Every number below is the seeded default — the value the demo ships with — pulled straight from src/data/defaults.ts, alongside the taxonomy’s own source/reliability note (src/data/constantMeta.ts). Honest sourcing is part of the point: a believable number means showing where each input came from.

Two timing rules matter:

  • New calculations use edits immediately (tested as AC-4). Settings edits deep-clone, set, and save synchronously, so the next price reflects the change.
  • Saved quotes recompute on open. A quote stores a pricing snapshot, but it is recomputed against current settings every time the config changes and on open — so reopening an old quote after tuning a constant shows the new number.

The constant keys below are the real Constants field names (src/types.ts); the UI labels and the grouping match CONSTANT_GROUPS. Fractions are stored as decimals (0.07 = 7%).

Per-inch rates ($/upright inch)

The displayed channel-letter fabrication path is per-inch. Halo takes precedence over raceway when both apply; otherwise raceway beats flush. See Pricing Engine.

ConstantSeeded defaultWhat it does / source
price_per_inch_frontlit$19.00Front-lit, flush mount. Practitioner-stated (flush front-lit).
price_per_inch_raceway$21.00Front-lit, raceway mount. Practitioner-stated.
price_per_inch_halo$22.00Halo / reverse-lit. Practitioner-stated.

Channel-letter materials

Feed the owner-only cost floor for channel letters (the per-letter material cost and the job-level rollup), not the displayed price.

ConstantSeeded defaultWhat it does / source
coil_cost_per_ft$2.00Return coil, $/ft (5″ .040 coil).
acm_backing_per_sqft$1.31ACM backing, $/sqft. Research-verified.
acrylic_white_per_sqft$1.88White acrylic face, $/sqft (3/16″).
acrylic_colored_per_sqft$2.19Colored acrylic face, $/sqft. Research-verified.
trim_cap_per_ft$0.41Trim cap, $/ft. Research-verified.
wire_studs_per_letter$5.00Wire & studs, $/letter. Example 1 used ~$20 per 4-letter job.
raceway_cost_per_ft$25.00Raceway, $/ft. Mid of $15–40 — verify with supplier.
material_indeterminates_pct0.07 (7%)Scrap / waste allowance. From shopVOX scrap/waste.

LEDs & power

Drive the channel-letter LED derivation: density → module count → watts → power-supply count. The derate is intentional.

ConstantSeeded defaultWhat it does / source
power_supply_cost$42.95Power supply, $ each. Both research passes agree.
ps_max_watts60Power supply max watts (12V sign-grade).
ps_derate0.80Power-supply derate fraction. Taxonomy decision #1 — 0.80, not 0.9.
⚠️

Do not “fix” ps_derate to 0.9. The engine sizes supplies on usableWatts = ps_max_watts * ps_derate (so 60 × 0.80 = 48 usable watts), then takes ceil(totalWatts / usableWatts). The 0.80 derate is a deliberate sourcing decision, not a placeholder. The divisor is also guarded: clearing ps_max_watts or ps_derate to 0 yields a supply count of 0, not Infinity. See Assumptions & Decisions.

Labor

A task-rate model (taxonomy decision #4): hours are derived from the job and charged at these rates plus burden. default_markup seeds the cost-plus path’s starting markup.

ConstantSeeded defaultWhat it does / source
cnc_bend_rate$65.00CNC / bending, $/hr. Task-rate model (decision #4).
assembly_rate$45.00Assembly, $/hr. Task-rate model.
labor_burden_pct0.15 (15%)Labor burden fraction applied on labor cost.
default_markup2Default markup for the cost-plus path. The salesperson can override 1.5–3.0 in Advanced.

Install & fees

Install hours and the flat fees, plus the two margin-badge thresholds.

ConstantSeeded defaultWhat it does / source
install_rate$100.00Install crew, $/hr. Within $95–110; calibrated to Example 2.
install_min_fee$175.00Install minimum, $ (~2 hr minimum).
crane_fee$2,500.00Crane fee, $. Mid of $1,000–5,000.
permit_fee$300.00Permit fee, $. Matches Example 1; within $50–1,000; single permit line (decision D4).
pe_stamp_fee$600.00Engineering (PE stamp), $. Mid of $200–1,000 wall-sign range.
design_fee$150.00Design fee, $ — channel letters only (decision D1). Low end of $150–350.
minimum_job_price$0.00Minimum job charge, $. 0 = off (decision D2). Shipped disabled.
margin_red_below0.30 (30%)Margin badge turns red below this fraction.
margin_amber_below0.45 (45%)Margin badge turns amber below this fraction.

minimum_job_price ships disabled at 0 (decision D2). The engine only applies it when minimum_job_price > 0 and the subtotal falls below it, adding a Minimum job charge line for the difference. The intent is to ask each shop what their real minimum is rather than guess one. The margin thresholds drive the editor’s margin badge: margin below 0.30 is red, below 0.45 is amber, otherwise green. See Pricing Engine and Assumptions & Decisions.

Dimensional letters — markup & multipliers

Applied to the wholesale grid price below. The rail-mount uplift is the only sourced mount multiplier; spacer/standoff has no sourced uplift (×1.0).

ConstantSeeded defaultWhat it does / source
dealer_markup_dim1.5Dealer markup, applied to the wholesale grid price.
finish_mult_painted_custom1.125Painted custom-color ×, relative to the grid row’s included finish.
finish_mult_polished1.5Polished ×, relative to the grid row’s included finish.
mount_mult_rail1.35Rail-mount ×. Spacer/standoff has no sourced uplift (×1.0).

LED products

Three seeded modules drive the channel-letter LED derivation. sloan_prism12 is the default selected on new channel-letter quotes (defaultConfigFor). Each row is editable on Settings (cost / watts / density per module).

idLabelcostPerModulewattsPerModuledensityPerFtNote
genericGeneric 12V module$1.250.81.5dealer-list / inferred
sloan_prism12SloanLED Prism 12$2.0011.5default; matches Example 1 anchor
sloan_hoSloanLED high output$6.571.21.2high output

Dimensional price grid ($ per letter)

The wholesale price per letter at the 6 / 12 / 18 / 24″ anchors, by material. Quotes interpolate linearly between anchors, and heights are clamped to 6–24″ before lookup. Each row also carries a read-only thickness and the base finish already included in the grid price.

materialIdLabelThickness · base finish6″12″18″24″
routed_pvc_quarterRouted PVC1/4 in · painted$11.28$26.53$50.37$61.00
flat_acrylic_quarterFlat cut acrylic1/4 in · colored$20.00$36.00$60.00$90.00
flat_aluminum_quarterFlat cut aluminum1/4 in · brushed$45.30$77.00$120.90$222.00
cast_aluminumCast aluminumcast · brushed$38.01$71.38$152.96$249.36
cast_bronzeCast bronzecast · brushed$75.09$173.35$355.97$601.62
⚠️

These are reseller list prices — dealer-net is lower. The Settings grid carries this tag verbatim. Before the demo, confirm the shop’s actual dealer-net pricing and edit the grid (or adjust dealer_markup_dim) so the dimensional numbers reflect what they really pay. See Assumptions & Decisions.

Shop info

Identity and quote-terms fields. These feed the PDF header and footer, not the price.

FieldSeeded defaultWhere it appears
nameSummit Signs & LightingPDF header.
address4815 Industrial Oaks Blvd, Austin, TX 78735PDF header.
phone(512) 555-0184PDF header.
emailquotes@summitsigns.examplePDF header.
logoDataUrl(none)Optional logo (PNG/JPG, uploaded as a data URL) on the PDF header.
quoteValidityDays30Sets the PDF’s valid-until date.
terms(see below)Printed in the PDF footer above the signature line.

The seeded terms text:

50% deposit due on acceptance; balance due on completion of installation. Pricing
assumes standard site access. Permit fees are billed at cost if actual fees differ
from the quoted amount.

Resetting

Each Settings section has a Reset that restores only that section’s keys from the seeded defaults — the constant groups, the LED products + power constants, the grid + multipliers, and shop info each reset independently. The “def.” / “Default:” hint under every field always shows the seeded value, looked up by key (or by id for products and grid rows) so it stays correct even after edits.