Ambient Orlando Private Sales Tool
Retainer + A La Carte System

Client Package Scope Builder

Choose the client type first, then build the right Ambient package or one-time quote. Package points stay internal. Add-ons increase price separately.

1

Client Type

This stays open so admins always know which flow is selected.

Always Open
2

Client + Sales Intake

Fill this during the call. The proposal uses the selected agency logo and uploaded client logo.

Locked
Upload a client logo to personalize the PDF proposal.
3

Scope Snapshot

Review before sending the proposal.

Quick View
Client TypeSelect FirstChoose Retainer or One-Time.
Package / Base$0No package yet.
Client Total$0Ambient package + add-ons. Excludes ad spend.
StatusStartSelect a client type.
Recommended Ad Spend$0Client-funded. Not agency revenue.
Direct Expense$0Backend estimate only.
Gross Profit$0Revenue minus direct expense.
Margin StatusMargin floor check.
4

Package Builder

Retainer path only. Points are backend capacity units and are hidden from the client proposal.

Retainer Only

Swipe left to view all packages →

CRM reserves internal capacity only in Scale. Turn off if the client does not need CRM to release capacity back to creative points.

Ad spend is not included in package price, revenue, direct expense, or margin.

Selected Package Scope

Edit quantity and points if the sales team needs to customize.

0 points used.

5

A La Carte + Add-Ons

For one-time services or retainer add-ons. These increase invoice total but do not increase package point cap.

Separate From Points
Browse + Add

A La Carte Menu

Search by service type, then add only what the client needs.

Selected + Review

Quote Details

These add to invoice total and stay separate from package points.

Selected A La Carte / Add-Ons

Qty and price can be edited before exporting.

Package Includes

Client-friendly inclusions shown on proposal.

    6

    Client-Facing Summary

    Clean proposal-style summary. No backend points, commission, or labor costs.

    Final Step

    Applies to client proposal and backend report so unused items do not clutter the templates.

    Saved.
    `; } function printReport(type){ const win=window.open("", "_blank"); if(!win){ toast("Popup blocked. Allow popups and try again."); return; } win.document.open(); win.document.write(reportHtml(type)); win.document.close(); setTimeout(()=>{ win.focus(); win.print(); },350); }function openPanel(name){ document.querySelectorAll(".amb15-nav").forEach(b=>b.classList.toggle("is-active", b.dataset.panel===name)); document.querySelectorAll(".amb15-panel").forEach(p=>p.classList.toggle("is-active", p.dataset.panelContent===name)); }function buildAdminDefaults(){ const tabs=[ ["packages","1","Packages","Ambient price, points, ad spend"], ["rules","2","Sales Rules","Deposit, margins, CRM"], ["production","3","Production","Run & Gun, half, full"], ["creative","4","Creative","Editing and graphics"], ["addons","5","A La Carte","Web, event, booth"], ["agency","6","Agency Brands","Add, replace, and update brands"] ]; $("amb15DefaultTabs").innerHTML=tabs.map((t,i)=>``).join(""); $("amb15DefaultPanels").innerHTML = ` ${adminPanel("packages","Package Pricing + Points","Use this when Ambient changes retainer prices, backend point limits, or recommended ad spend.",[ ["Foundation Price / Month","packages.foundation.price","number"],["Foundation Point Limit","packages.foundation.points","number"],["Foundation Recommended Ad Spend","packages.foundation.adSpend","number"], ["Growth Price / Month","packages.growth.price","number"],["Growth Point Limit","packages.growth.points","number"],["Growth Recommended Ad Spend","packages.growth.adSpend","number"], ["Scale Price / Month","packages.scale.price","number"],["Scale Point Limit","packages.scale.points","number"],["Scale Recommended Ad Spend","packages.scale.adSpend","number"] ],true)} ${adminPanel("rules","Sales Rules + Backend Cost Rules","Deposit, 3-month term, commission, CRM reserve, ad manager allocation, and margin floors.",[ ["Deposit %","rules.depositPct","number"],["Retainer Term Months","rules.termMonths","number"],["Sales Commission %","rules.commissionPct","number"], ["Retainer Margin Floor %","rules.retainerMarginFloor","number"],["One-Time Margin Floor %","rules.oneTimeMarginFloor","number"],["Ad Manager Cost / Retainer","rules.adManagerCost","number"], ["CRM Reserve Points","rules.crmReservePoints","number"],["CRM Direct Cost","rules.crmCost","number"],["PA Idea Cost","rules.paIdeaCost","number"], ["Equipment / Storage Cost","rules.equipmentStorageCost","number"],["Generic Add-On Cost %","rules.genericAddonCostPct","number"] ])} ${adminPanel("production","Production Services","Point values, one-time prices, and backend production costs.",[ ["Run & Gun Points","production.runGunPts","number"],["Run & Gun One-Time Price","production.runGunPrice","number"],["Run & Gun Shooter Cost","production.runGunShooterCost","number"],["Run & Gun PA Cost","production.runGunPaCost","number"], ["Half Day Points","production.halfPts","number"],["Half Day Price","production.halfPrice","number"],["Half Day Shooter Cost","production.halfShooterCost","number"],["Half Day PA Cost","production.halfPaCost","number"], ["Full Day Points","production.fullPts","number"],["Full Day Price","production.fullPrice","number"],["Full Day Shooter Cost","production.fullShooterCost","number"],["Full Day PA Cost","production.fullPaCost","number"], ["Raw Footage Price","production.rawFootagePrice","number"],["Extra Camera Price","production.extraCameraPrice","number"] ])} ${adminPanel("creative","Editing + Graphics","Finalized editing and graphic pricing, point values, and backend costs.",[ ["Regular Video Points","creative.regularVideoPts","number"],["Regular Video Price","creative.regularVideoPrice","number"],["Regular Video Cost","creative.regularVideoCost","number"], ["3 Repurposed Videos Points","creative.threeVideoPts","number"],["3 Repurposed Videos Price","creative.threeVideoPrice","number"],["3 Repurposed Videos Cost","creative.threeVideoCost","number"], ["Cinematic Edit Points","creative.cinematicPts","number"],["Cinematic Edit Price","creative.cinematicPrice","number"],["Cinematic Edit Cost","creative.cinematicCost","number"], ["Talking Head + AE Points","creative.talkingAePts","number"],["Talking Head + AE Price","creative.talkingAePrice","number"],["Talking Head + AE Cost","creative.talkingAeCost","number"], ["Cinematic + AE Points","creative.cinematicAePts","number"],["Cinematic + AE Price","creative.cinematicAePrice","number"],["Cinematic + AE Cost","creative.cinematicAeCost","number"], ["New Graphic Template Points","creative.graphicTemplatePts","number"],["New Graphic Template Price","creative.graphicTemplatePrice","number"],["Approved Template Reuse Points","creative.graphicReusePts","number"],["Carousel Points","creative.carouselPts","number"],["Carousel Price","creative.carouselPrice","number"], ["Unlimited Graphics Retainer","creative.unlimitedGraphicsRetainerPrice","number"],["Unlimited Graphics Standalone","creative.unlimitedGraphicsStandalonePrice","number"] ])} ${adminPanel("addons","Website + Event + Photo Booth","A la carte prices and backend allocations.",[ ["Landing Page Price","addons.landingPagePrice","number"],["Landing Page Backend Cost","addons.landingPageCost","number"],["Template Website Price","addons.templateWebsitePrice","number"],["Template Website Cost","addons.templateWebsiteCost","number"],["Fully Coded Website Price","addons.codedWebsitePrice","number"],["Fully Coded Website Cost","addons.codedWebsiteCost","number"], ["Event Video Hourly","addons.eventVideoHourly","number"],["Event Photo Hourly","addons.eventPhotoHourly","number"],["Event Photo + Video Hourly","addons.eventPhotoVideoHourly","number"],["Event Minimum Hours","addons.eventMinHours","number"], ["Photo Booth 2 Hours","addons.photoBooth2","number"],["Photo Booth 3 Hours","addons.photoBooth3","number"],["Printed Photos Hourly","addons.printedPhotosHourly","number"],["Custom Backdrop","addons.customBackdrop","number"],["Branding Photography 2 Hours","addons.brandingPhoto","number"] ])} ${agencyPanel("agency")} `; document.querySelectorAll("[data-default-tab]").forEach(btn=>btn.addEventListener("click",()=>openDefaultTab(btn.dataset.defaultTab))); document.querySelectorAll("[data-save-default-section]").forEach(btn=>btn.addEventListener("click",()=>{ saveDefaults(); toast(btn.dataset.saveDefaultSection+" saved."); renderAll(); })); document.querySelectorAll("[data-default-input]").forEach(input=>{ input.addEventListener("input",()=>{ const path=input.dataset.defaultInput; setByPath(cfg,path,input.type==="number"?num(input.value):input.value); renderAll(); }); });bindBrandManager(); renderBrandManager(state.agency); } function agencyPanel(id){ return `

    Agency Brand Manager

    Add FC Marketing, Ambient, or any new partner brand. Client logo upload still takes priority in the PDF.

    Select a brand to update or replace.
    Used internally. Lowercase letters, numbers, and dashes are safest.
    This appears in the intake dropdown and proposal.
    This appears in the top private sales tool label.
    Client logo upload has priority over this brand logo URL.
    `; }function sanitizeBrandKey(value){ return String(value || "").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"") || "brand-" + Date.now().toString(36); }function renderBrandManager(selectedId){ const select = $("amb15BrandEditorSelect"); if(!select) return;if(!cfg.agencies || !agencyKeys().length){ cfg.agencies = clone(DEFAULTS.agencies); }const chosen = cfg.agencies[selectedId] ? selectedId : fallbackAgency(); select.innerHTML = agencyKeys().map((id)=>``).join(""); select.value = chosen; populateBrandFields(chosen); }function populateBrandFields(id){ const item = cfg.agencies[id] || {}; const brandId = $("amb15BrandId"); const brandName = $("amb15BrandName"); const brandShort = $("amb15BrandShort"); const brandLogo = $("amb15BrandLogo"); if(brandId) brandId.value = id || ""; if(brandName) brandName.value = item.name || ""; if(brandShort) brandShort.value = item.short || item.name || ""; if(brandLogo) brandLogo.value = item.logoUrl || ""; }function saveBrandFromManager(){ const select = $("amb15BrandEditorSelect"); const oldId = select ? select.value : ""; const id = sanitizeBrandKey($("amb15BrandId")?.value); const name = ($("amb15BrandName")?.value || id).trim(); const short = ($("amb15BrandShort")?.value || name).trim(); const logoUrl = ($("amb15BrandLogo")?.value || "").trim();if(oldId && oldId !== id && cfg.agencies[oldId]){ delete cfg.agencies[oldId]; }cfg.agencies[id] = { name, short, logoUrl }; state.agency = id; saveDefaults(); renderAgencySelect(); renderBrandManager(id); renderAll(); toast("Agency brand saved."); }function addNewBrand(){ let base = "new-brand"; let id = base; let count = 2; while(cfg.agencies[id]){ id = base + "-" + count++; } cfg.agencies[id] = { name:"New Brand", short:"New Brand", logoUrl:"" }; state.agency = id; saveDefaults(); renderAgencySelect(); renderBrandManager(id); renderAll(); toast("New brand added. Rename it, then save."); }function deleteSelectedBrand(){ const select = $("amb15BrandEditorSelect"); const id = select ? select.value : ""; if(!id || !cfg.agencies[id]) return; if(agencyKeys().length <= 1){ toast("Keep at least one agency brand."); return; } delete cfg.agencies[id]; state.agency = fallbackAgency(); saveDefaults(); renderAgencySelect(); renderBrandManager(state.agency); renderAll(); toast("Agency brand deleted."); }function bindBrandManager(){ const select = $("amb15BrandEditorSelect"); if(select) select.addEventListener("change",()=>populateBrandFields(select.value)); const save = $("amb15SaveBrand"); if(save) save.addEventListener("click",saveBrandFromManager); const add = $("amb15NewBrand"); if(add) add.addEventListener("click",addNewBrand); const del = $("amb15DeleteBrand"); if(del) del.addEventListener("click",deleteSelectedBrand); }function adminPanel(id,title,desc,fields,active=false){ return `

    ${esc(title)}

    ${esc(desc)}

    ${fields.map(f=>fieldCard(f[0],f[1],f[2])).join("")}
    `; } function fieldCard(label,path,type){ const value=getByPath(cfg,path); return `
    Saved setting
    `; } function getByPath(obj,path){ return path.split(".").reduce((o,k)=>o&&o[k],obj); } function setByPath(obj,path,value){ const parts=path.split("."); const last=parts.pop(); const parent=parts.reduce((o,k)=>o[k],obj); parent[last]=value; } function openDefaultTab(id){ document.querySelectorAll("[data-default-tab]").forEach(b=>b.classList.toggle("is-active", b.dataset.defaultTab===id)); document.querySelectorAll("[data-default-panel]").forEach(p=>p.classList.toggle("is-active", p.dataset.defaultPanel===id)); }function bind(){ document.querySelectorAll("#amb15 [data-theme]").forEach(b=>b.addEventListener("click",()=>{ state.theme=b.dataset.theme; localStorage.setItem(STORE_THEME,state.theme); renderAll(); })); document.querySelectorAll("[data-open-modal]").forEach(b=>b.addEventListener("click",()=>openModal(b.dataset.openModal))); document.querySelectorAll("[data-close-modal]").forEach(b=>b.addEventListener("click",()=>closeModal(b.dataset.closeModal))); [$("amb15DefaultsModal"), $("amb15BackendModal")].forEach((modal)=>{ if(modal){ modal.addEventListener("click",(event)=>{ if(event.target === modal) closeModal(modal.id === "amb15DefaultsModal" ? "defaults" : "backend"); }); } }); document.addEventListener("keydown",(event)=>{ if(event.key === "Escape"){ closeModal("defaults"); closeModal("backend"); } }); document.querySelectorAll("[data-mode-choice]").forEach(b=>b.addEventListener("click",()=>setMode(b.dataset.modeChoice))); document.querySelectorAll(".amb15-nav").forEach(b=>b.addEventListener("click",()=>openPanel(b.dataset.panel))); Object.values(els).forEach(el=>{ if(!el || ["amb15PointSearch","amb15AddonSearch","amb15ClientLogo"].includes(el.id)) return; el.addEventListener("input",()=>{ syncInputs(); renderAll(); }); el.addEventListener("change",()=>{ syncInputs(); renderAll(); }); }); els.pointSearch.addEventListener("input",renderPointMenu); els.addonSearch.addEventListener("input",renderAddonMenu); els.logo.addEventListener("change",handleLogo); $("amb15RemoveLogo").addEventListener("click",()=>{ state.clientLogoData=""; state.clientLogoName=""; els.logo.value=""; renderLogo(); renderAll(); }); $("amb15LoadRecommended").addEventListener("click",()=>{ if(state.mode!=="retainer"){toast("Choose Retainer first.");return;} state.pointItems=recommendedBuild(state.packageId); state.crmActive=state.packageId==="scale"; renderAll(); toast("Recommended build loaded."); }); $("amb15AddCustomPoint").addEventListener("click",addCustomPoint); $("amb15AddCustomAddon").addEventListener("click",addCustomAddon); $("amb15CopySummary").addEventListener("click",()=>copyText(els.summary.value,"Client summary copied.")); $("amb15CopyBackend").addEventListener("click",()=>copyText(els.backend.value,"Backend report copied.")); $("amb15PrintClient").addEventListener("click",()=>printReport("client")); $("amb15PrintBackend").addEventListener("click",()=>printReport("backend")); $("amb15SaveSnapshot").addEventListener("click",saveSnapshot); $("amb15LoadSnapshot").addEventListener("click",loadSnapshot); } function syncInputs(){ state.agency=els.agency.value; state.showAdSpend=els.showAdSpend.checked; state.templateId=els.templateId.value.trim(); state.adSpendOverride=num(els.adSpend.value); state.paIdeas=num(els.paIdeas.value); state.softwareCost=num(els.software.value); state.adminCost=num(els.admin.value); state.hideZero=els.hideZero.checked; if(els.crm) state.crmActive=els.crm.checked && state.packageId==="scale"; } function renderLogo(){ if(state.clientLogoData){ els.logoPreview.src=state.clientLogoData; els.logoPreview.style.display="block"; els.logoText.textContent="Logo uploaded: "+state.clientLogoName; } else { els.logoPreview.removeAttribute("src"); els.logoPreview.style.display="none"; els.logoText.textContent="Upload a client logo to personalize the PDF proposal."; } } function handleLogo(){ const file=els.logo.files && els.logo.files[0]; if(!file) return; const reader=new FileReader(); reader.onload=()=>{ state.clientLogoData=reader.result; state.clientLogoName=file.name; renderLogo(); renderAll(); }; reader.readAsDataURL(file); } function addCustomPoint(){ if(state.mode!=="retainer"){ toast("Choose Retainer to add package point items."); return; } const name=prompt("Custom package item name:"); if(!name) return; const pts=num(prompt("Point value:", "1")); const cost=num(prompt("Backend cost estimate:", "0")); state.pointItems.push({id:"custom_"+Date.now(),name,cat:"Custom",qty:1,pts,desc:"Custom package item.",cost}); renderAll(); } function addCustomAddon(){ const name=prompt("Custom a la carte / add-on name:"); if(!name) return; const price=num(prompt("Client price:", "500")); const cost=num(prompt("Backend cost estimate:", String(Math.round(price*num(cfg.rules.genericAddonCostPct)/100)))); state.addons.push({id:"custom_"+Date.now(),name,cat:"Custom",qty:1,price,cost,desc:"Custom a la carte item."}); renderAll(); } function copyText(text,msg){ navigator.clipboard?.writeText(text).then(()=>toast(msg)).catch(()=>{ toast("Copy failed. Select text manually."); }); } function snapshotObject(){ return { state, inputs:{ agency:els.agency.value, clientName:els.clientName.value, businessName:els.businessName.value, email:els.email.value, phone:els.phone.value, salesRep:els.salesRep.value, industry:els.industry.value, goal:els.goal.value, assets:els.assets.value, challenge:els.challenge.value, notes:els.notes.value } }; } function saveSnapshot(){ localStorage.setItem(STORE_SNAPSHOT, JSON.stringify(snapshotObject())); toast("Snapshot saved."); } function loadSnapshot(){ try{ const snap=JSON.parse(localStorage.getItem(STORE_SNAPSHOT)||"{}"); if(!snap.state){ toast("No saved snapshot found."); return; } state=Object.assign(state,snap.state); Object.entries(snap.inputs||{}).forEach(([k,v])=>{ if(els[k]) els[k].value=v; }); renderLogo(); renderAll(); toast("Snapshot loaded."); }catch(e){ toast("Could not load snapshot."); } }buildAdminDefaults(); mountFloatingElements(); bind(); renderLogo(); renderAll(); })();
    Ambient Orlando Builder Guide
    Package Sales Guide

    How to Use the Ambient Package Builder

    Use this guide like a dashboard. Choose a step from the left menu, then read the matching walkthrough on the right. It is built for quick sales calls, internal handoff, and proposal prep.

    1

    Overview

    Use the builder in order: choose flow, fill intake, check snapshot, build scope, review pricing, then export.

    Start Here
    1
    Start

    Pick the Client Flow

    Choose Retainer for Foundation / Growth / Scale, or One-Time for single project pricing.

    2
    Prepare

    Fill Client Intake

    Add client details, goal, challenge, assets, notes, and optional logo upload.

    3
    Build

    Package or Add-ons

    Use package points for retainers. Use A La Carte for separate pricing and add-ons.

    4
    Finish

    Export Summary

    Use the client-facing PDF for proposals and the backend report for internal review.

    Ambient workflow Start with the recommended build first. Then customize only what needs to change so pricing stays clear and the proposal stays easy to approve.