Ulrich Lifestyle Structures
Ulrich Lifestyle Structures' 3D shed/cabin configurator — list the model catalog, read one model's default configurator (dimensions, wall height, siding,…
Ulrich Lifestyle Structures' 3D shed/cabin configurator — list the model catalog, read one model's default configurator (dimensions, wall height, siding, each with its live option list), and price a specific build (with delivery/tax for a real ZIP) against the site's own live pricing engine rather than a researched estimate.
Domain: ulrichlifestyle.com
Also known as: Ulrich Lifestyle Structures, Ulrich Barn Builders, ulrichlifestyle, UlrichLifestyle, ulrichlifestyle.com
Call it directly
bowmark.providers.ulrichlifestyle.listModels(): Promise<UlrichModel[]>
bowmark.providers.ulrichlifestyle.getConfigurator(code: string): Promise<UlrichConfigurator>
bowmark.providers.ulrichlifestyle.priceConfiguration(code: string, selections: { width?: string, length?: string, wallHeight?: string, siding?: string, zip: string }): Promise<UlrichPriceResult>Functions
| Function | What it does |
|---|---|
listModels | Lists every shed/cabin model in Ulrich's current catalog with its code and name — the entry point every other function's code comes from. |
getConfigurator | Reads one model's default configurator: its base price (before delivery/tax) plus every dimension/material category (width, length, wall height, siding) with the model's own live option… |
priceConfiguration | Configures and prices ONE specific build against Ulrich's live pricing engine — any of width/length/wallHeight/siding left unset keeps the model's default, and zip (required) drives real… |
Types
// Ulrich Lifestyle Structures' OWN shapes — not a capability contract.
interface UlrichModel { code: string; name: string } // code is the key getConfigurator/priceConfiguration take
interface UlrichOptionChoice { value: string; label: string }
interface UlrichOption {
key: "width" | "length" | "wallHeight" | "siding";
title: string;
defaultValue: string; // this model's default choice, already reflected in basePrice
choices: UlrichOptionChoice[];
}
interface UlrichConfigurator {
code: string;
name: string;
description: string; // e.g. "12x24 The Heritage (Approx.10.65 ft. overall height)"
basePrice: number; // the DEFAULT configuration's price, before delivery/tax — a floor
basePriceFormatted: string;
options: UlrichOption[];
}
interface UlrichPriceLine { description: string; price: number }
interface UlrichPriceResult {
code: string;
description: string;
total: number; // full price including delivery/tax for the given ZIP
totalFormatted: string;
breakdown: UlrichPriceLine[];
unmatched: string[]; // a selection that didn't match a real choice, named so nothing mispriced silently
handoffUrl: string; // resumes this EXACT configuration on Ulrich's own site — purchase on the spot, or a rep closes it
}Examples
// What would a 12x20 Heritage shed with an 8ft wall actually cost, delivered to 78701?
const models = await bowmark.providers.ulrichlifestyle.listModels();
const heritage = models.find((m) => m.name === "The Heritage");
const priced = await bowmark.providers.ulrichlifestyle.priceConfiguration(heritage.code, {
width: "12",
length: "20",
wallHeight: "8",
zip: "78701",
});
return { total: priced.totalFormatted, resumeOnSite: priced.handoffUrl };// What are ALL the siding choices for The Heritage, and its starting price?
const cat = await bowmark.providers.ulrichlifestyle.getConfigurator("FG-UL-SL-21-GSH");
const siding = cat.options.find((o) => o.key === "siding");
return { base: cat.basePriceFormatted, sidingChoices: siding.choices.map((c) => c.label) };