---
title: "SaleFrame"
description: "the sale framed for one buyer: what the first sale costs them, the value and the return in their own numbers with their basis, the payback, the sensitivity, and the framing chosen with its evidence; computed once by the one evaluator from a business model, and read by the sale, the estimator page and the signal"
section: concepts
address: /concepts/saleframe
contract: 0476e35e6e275db5
---

# SaleFrame

the sale framed for one buyer: what the first sale costs them, the value and the return in their own numbers with their basis, the payback, the sensitivity, and the framing chosen with its evidence; computed once by the one evaluator from a business model, and read by the sale, the estimator page and the signal

[figure: SaleFrame is a fact at brand scope. The drawing shows its fields and the objects that they point at.]

| property | value |
|---|---|
| kind | fact |
| scope | brand |
| key | the buyer, the offering, the business model version and the inputs hash |
| store | postgres+lake |
| family | strategy |



## Fields


| field | type | required | note |
|---|---|---|---|
| `buyer` | [UnitRef](/concepts/unitref) | yes | the lead, the entity, the buyer profile, or the anonymous session of a public page |
| `offering` | `id` | no | the offering, absent when the frame is for the tenant's tier alone |
| `tier` | `text` | no | the tier of the price ladder priced, when the offering is the tenant's |
| `business_model` | `id` | no | the business model evaluated; absent for a frame written by hand before the economics of the market were specified |
| `model_version` | `count` | no |  |
| `inputs` | [FrameInput](/concepts/frameinput) | no | every input read, with where it came from and its basis |
| `inputs_hash` | `hash` | no | the repeat key with the buyer, the offering and the version |
| `period` | `duration` | no | the buyer's period the outputs are stated per |
| `first_sale_cost` | [NumberInPosition](/concepts/numberinposition) | yes | in the buyer's own numbers; in the estimate position it names the estimate with its interval |
| `potential_value` | [NumberInPosition](/concepts/numberinposition) | yes | the incremental value over the period |
| `return` | [Interval](/concepts/interval) | no | value less cost, derived by the named rule, with its interval |
| `payback` | `duration` | no | cost over value per period |
| `payback_interval` | [Interval](/concepts/interval) | no | the payback with its interval when a simulation ran |
| `sensitivity` | [Sensitivity](/concepts/sensitivity) | no | one per stated driver |
| `simulation` | `id` | no | the run that gave the intervals; absent for a point evaluation |
| `framing` | [KindOfFraming](/concepts/kindofframing) | yes |  |
| `set_aside` | [KindOfFraming](/concepts/kindofframing) | no | the framings considered and not chosen |
| `evidence` | [EvidenceRef](/concepts/evidenceref) | yes | the motives, means, affinity and constraints that chose the framing |
| `state` | [Readiness](/concepts/readiness) | no | not ready with the leaf named when an input is withheld |



## Routes that use it
- [`/v1/economics/estimate`](/reference/economics/estimate) returns it
