Lead till prissatt PDF-offert inom marginalfönster på 19 min.
Offert-bot for svensk B2B-forsaljning. Modulen tar emot en kvalificerad lead tillsammans med saljteamets prisregler, applicerar volymrabatt och storlekskategori-modifierare, och returnerar en strukturerad offert pa svenska redo att renderas som PDF.
Modul-ID ar quote-bot. Version 1.0.0. Voice-profil kapaciti. Default modell claude-haiku-4-5. Modulen extender BaseModule och deltar i samma signerade audit-kedja som ovriga moduler i kapaciti-modules.
Tiden fran inkommen lead till levererad offert ar den enskilt viktigaste mekaniska parametern i en B2B-saljpipeline. Pilotmatningar visar att den genomsnittliga svenska SME-saljaren spenderar mellan 90 och 150 minuter pa att producera en forsta offert, varav stora delar gar at till att leta prisuppgifter, kontrollera marginal och formatera dokumentet. Den ledtiden forlanger sig genom hela funneln och pressar konverteringsgraden.
Mal-cykeltiden for quote-bot ar 19 minuter fran kvalificerad lead till signerad PDF-offert i kundens inkorg. Modulens egen runtime ar typiskt under 20 sekunder. Resterande tid gar at till CRM-enrichment, account ownerns granskning av intern notering, och rendering till PDF. Det ger saljaren tid att fokusera pa relationen istallet for pa formatering.
Designprincipen ar att prissattning ska vara deterministisk. Modellen far aldrig hitta pa egna priser eller rabattvillkor. All matematik kommer fran inputens prisregler, och varje siffra i SUMMERING-blocket ar transparent sparbar bakat till radsumma, rabatt och storlekskategori-modifierare.
Inputen ar ett strukturerat objekt med sex delar.
{
lead_id: "lead-2026-05-19-031",
customer: {
company_name: "Skellefteå Redovisning AB",
org_nr: "556789-1234",
contact: { name: "Maria Johansson", email: "maria@..", phone: "+46.." },
industry: "Redovisning och revision",
size_category: "small"
},
request: {
products_or_services: [
{ id: "helpdesk-pilot", name: "..", quantity: 1, unit: "pilot", custom_specs: ".." }
],
requested_delivery: "2026-06-15",
additional_requirements: "GDPR-DPA innan kontraktsstart"
},
pricing_rules: {
base_unit_prices: { "helpdesk-pilot": { unit_price_sek: 24000, currency: "SEK" } },
volume_discounts: [{ threshold_qty: 6, discount_pct: 5 }, { threshold_qty: 12, discount_pct: 10 }],
size_category_modifiers: { micro: -10, small: 0, medium: 5, large: 10 },
payment_terms_options: ["30 dagar netto", "delbetalning 3 manader", "forskott 50%"],
validity_days: 30,
vat_pct: 25
},
account_owner: { name: "..", email: "..", phone: ".." },
brand: { name: "Kapaciti", voice_profile_id: "kapaciti" }
}
size_category har fyra niva: micro (under 10 anstallda), small (10-50), medium (50-250), large (over 250). Storlekstillagget pa subtotal efter radrabatter foljer normalt micro -10, small 0, medium +5, large +10 procent.
volume_discounts ar ej staplad. Modulen valjer den hogsta threshold_qty som en rads quantity uppnar och applicerar den procenten.
payment_terms_options ska vara minst en strang. Modulen valjer ett default baserat pa size_category men visar alla alternativ for kunden.
Utdata ar text i strikt faltformat. Frontend eller PDF-renderaren parsar den direkt med QuoteBotModule.parse(output) eller med egna regex per falt. Sektioner i ordning:
OFFERT_ID: OFF-YYYY-NNNN
DATUM: YYYY-MM-DD
GILTIG_TILL: YYYY-MM-DD
KUND:
- FORETAG: ..
- ORGNR: ..
- KONTAKT: ..
POSTER:
- ARTIKEL: <id> | <namn> | <qty unit> | a-pris .. SEK | rad-summa .. SEK
SUMMERING:
- DELSUMMA_EX_MOMS_SEK: ..
- RABATT_PCT: ..
- RABATT_SEK: ..
- STORLEKSTILLAGG_PCT: ..
- NETTO_EX_MOMS_SEK: ..
- MOMS_25PCT_SEK: ..
- TOTAL_INKL_MOMS_SEK: ..
LEVERANSVILLKOR: <2-3 meningar>
BETALNINGSVILLKOR: <valt alternativ + ovriga>
OFFERTENS_GILTIGHET: <2 meningar>
VILLKOR_OCH_FORUTSATTNINGAR: <3-5 bullets>
NASTA_STEG: <2-3 meningar>
KONTAKT_VID_FRAGOR: <account owner>
INTERN_NOTERING: <forhandlingsutrymme + uppfoljning>
OFFERT_ID ar deterministiskt genererat fran lead_id genom en stabil hash. Det innebar att samma lead alltid ger samma offert-ID, vilket forenklar CRM-deduplicering och dispatch-spar.
INTERN_NOTERING ar enbart for saljteamet. Den filtreras bort i PDF-rendern men ligger kvar i audit-bundlen for senare upplyftning.
Modellen ar instruerad att folja exakt foljande algoritm:
rad-summa = a-pris * quantitythreshold_qty som quantity uppnar. Om tillamplig, applicera discount_pct pa radsumman.
DELSUMMA_EX_MOMS_SEK = sum(rad-summa)RABATT_SEK = sum(rad-rabatter)STORLEKSTILLAGG = (DELSUMMA - RABATT_SEK) * size_modifier_pct / 100NETTO_EX_MOMS_SEK = DELSUMMA - RABATT_SEK + STORLEKSTILLAGGMOMS = NETTO * vat_pct / 100TOTAL_INKL_MOMS_SEK = NETTO + MOMSAvrundning sker till hela kronor, halvor uppat.
validateOutput() extraherar siffrorna med regex och kontrollerar tva saker: att NETTO + MOMS ungefar = TOTAL (inom 2 kr) och att NETTO ligger inom +/- 50 procent av DELSUMMA - RABATT_SEK (rimlighetsfonster for storlekstillagg). Vid avvikelse adderas en math_inconsistent eller math_out_of_range violation till bundlen sa account ownern kan rejekta offerten innan utskick.
Default per size_category:
micro och small: 30 dagar nettomedium och large: delbetalning 3 manaderAlla tre alternativ visas alltid i BETALNINGSVILLKOR-blocket. Det ger kunden flexibilitet och saljaren en oppning att forhandla.
Varje korning producerar en signerad bundle med foljande block:
input_received (leadens hela payload)context_loaded (tom i denna modul)agent_call (modell, system_prompt_length, voice)output_generated (full output-text)voice_validated (banned words, banned chars)output_validated (faltkontroll, math-sanity)audit_sealed (status, antal block)Bundlen signeras med samma Ed25519-nyckel som ovriga moduler. Den kan verifieras med scripts/verify-audit-bundle.mjs eller via verifyBundle() fran lib/audit-chain.mjs.
import { QuoteBotModule } from "kapaciti-modules/modules/quote-bot.mjs";
const mod = new QuoteBotModule();
const result = await mod.run(input, {
writeBundle: "/path/to/quotes/OFF-2026-0531.bundle.json"
});
console.log(result.output);
const parsed = QuoteBotModule.parse(result.output);
console.log(parsed.total_inkl_moms_sek);
pricing_rules.
far du 10% pa hela ordern") stods inte i v1.0.
promo-fall.
SUMMERING-blocket istallet for strikt faltformat. validateOutput fangar det och returnerar violations som account owner kan agera pa.
Planerat for nasta minor:
bundle_rules-array.utskick till kund.
Justera input-objektet eller använd starter-värdena. När du trycker på Kör modulen anropas samma agent som i produktion. Audit-kedjan byggs framför dig och hela sessionen signeras med Ed25519 i samma format som exempel-bundlen ovan.
JSON-payload som matchar modulens validateInput. Starter-värdena kommer från en riktig produktionskörning. Max 12 000 tecken.
Audit-kedjan visas här när scenariot körs
● Nyhetsbrev
En sammanfattning ungefär en gång i månaden. Vad förändrats i regelverket, vilka pilot-cases vi sett och vilka vendor-shifts som påverkar svenska bolag. Skickas av oss, inte av en automation som låtsas vara oss.