Bowmark AIdocs

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

FunctionWhat it does
listModelsLists every shed/cabin model in Ulrich's current catalog with its code and name — the entry point every other function's code comes from.
getConfiguratorReads 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…
priceConfigurationConfigures 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) };