You cannot price a feature whose cost you learn at renewal
Published per-endpoint pricing, so gross margin is a calculation and not a quarterly surprise.
Propalt Team · For PropTech platforms
Pricing a feature requires knowing what it costs to serve, and with a lot of property data that cost is exactly what you cannot see until you are committed. The quote depends on a call, the tiers are opaque, and the true per-lookup figure only becomes clear once volume has grown and the renewal conversation arrives. By then you have already set your own prices, and you discover your margin was an estimate rather than a number.
The reasonable counterpoint is that enterprise data pricing is often bespoke for a reason: usage patterns differ, and a single rate card cannot fit everyone. True, but bespoke pricing you learn at renewal is not a rate card, it is a bet. The alternative is per-endpoint pricing published up front, where each call has a known credit cost and credits map to money. That does not fit every negotiation, but it does let a product team model gross margin on day one, which is when the pricing decision actually gets made.
Credits map to a number you can put in a model
The pricing is per endpoint, and the endpoints are priced in credits. A get_property call costs 6 credits and an EPC fabric lookup costs 2 credits, so the cost of serving a feature is the sum of the calls it makes, times the credit rate. That is a spreadsheet, not a negotiation. You can open a model, enter the endpoints your feature calls per user action, multiply by expected volume, and read off a monthly cost before you write the feature, let alone price it for your customers.
The 500 free credits per month let you measure the real call pattern of a feature before you commit to a volume, so the number in your model is calibrated against actual behaviour rather than a guess about how many calls a page will make. Published plan tiers then tell you what that volume costs, and where the next tier begins, before you grow into it rather than after.
| Feature (illustrative) | Calls per action | Credits per action | Monthly at 10,000 actions |
|---|---|---|---|
| Property detail view | 1 × get_property | 6 | 60,000 credits |
| Detail plus EPC | 1 EPC fabric call | Per published rate | Calls × rate × 10,000 |
The figures above use the published per-endpoint credit costs. The point is that every cell is a calculation you can run before you ship.
Margin is a decision, not a discovery
When the cost per action is knowable in advance, gross margin stops being something you find out and becomes something you decide. You set your customer price against a known serving cost and you know the spread. If a feature's margin is thin, you learn it in the model and change the design before launch, rather than absorbing it for a year and renegotiating under pressure at renewal. The decision moves to where it belongs, at the start.
A margin you calculate before launch is a decision. A margin you learn at renewal is a liability.
That timing is the whole advantage. Modelling the cost before the third vendor renewal rather than after means the numbers inform the product while the product can still change. Published pricing and a free tier to calibrate against turn unit economics from a quarterly surprise into a line in your business case, which is exactly where a platform team needs it.
Model the margin before you ship the feature, not after you renew the contract.
Try the Per-call margin model → · propalt.ai
Data is drawn across 29 million England and Wales properties from 8 authoritative UK registers plus the Propalt intelligence layer. Credit costs and plan tiers are as published on the Propalt pricing page at the time of reading. Figures shown are illustrative. This article is general information for platform teams.
Per-call margin model
Turns published per-endpoint credit pricing into a gross margin model a platform team can build on day one, before committing to volume.
🎯 Best used for
Modelling unit economics and feature pricing
🔌 Propalt APIs used
get_property get_valuation_by_property_id
