Metering & Entitlements
Metering controls how many answers each kind of reader gets, and what the reader sees when they reach the limit.
Use it to put Answers behind your existing access model — a registration wall, a free taster, or a subscriber allowance.
Miso configures metering for you. Send us your rules and your messages, and we set them up on your app. There is no self-serve screen for this yet. Contact your Miso representative to start.
What you send us
Two things:
- The rules — how many questions each kind of reader gets.
- The messages — exactly what the reader sees, in your own words.
Everything below is what those two lists can express.
What you send on every question
Metering needs to know who is asking. Send these on
POST /v1/ask/questions:
| Field | Why it is needed |
|---|---|
user_type |
Which tier the reader belongs to. |
user_id |
Identifies a signed-in reader across sessions and devices. |
anonymous_id |
Identifies a signed-out visitor. |
CAUTION: If you do not send
user_type, metering never runs and every reader is unlimited. This fails silently — there is no error. Make it part of your first integration test.
Reader tiers
Miso groups readers into three tiers. Your user_type value decides the tier.
| You send | Tier | Typically |
|---|---|---|
anonymous |
anon | Signed-out visitor. |
registered or free |
reg | Signed in, no paid plan. |
subscriber, paid, or internal |
sub | Paying reader or staff. |
user_type is a fixed list. A value outside it is rejected.
Question kinds
Miso counts two kinds of question separately:
| Kind | What it is |
|---|---|
| organic | The reader typed the question. |
| related | The reader clicked a suggested or related question. |
Most publishers meter the two differently. A common choice is to let readers click suggestions freely, and meter only the questions they type.
The rules
You give one limit per tier × kind. For example:
| Rule | Meaning |
|---|---|
anon, organic → 0 |
A signed-out visitor cannot type a question at all. |
| anon, related → unlimited | But they can click suggested questions freely. |
reg, organic → 5 |
A registered reader gets 5 typed questions. |
| sub, organic → unlimited | A subscriber has no limit. |
Any tier you do not mention is unlimited.
When the count resets
| You choose | Behavior |
|---|---|
| Monthly | The count resets on the 1st of each month, UTC. |
| Never (default) | The allowance is once per reader, for good. |
Asking the same question again does not count twice. A reader can re-read an answer without spending another credit.
The messages
You write the exact text. Miso shows it to the reader.
For each tier and kind, you can supply a message for three moments:
| Moment | When the reader sees it |
|---|---|
| below | They are still under the limit. |
| reached | This question is the one that hits the limit. |
| above | They are past the limit and get no answer. |
You do not have to write all three. If above is missing, Miso uses reached. If reached is missing, it uses below.
You can also write a message for one specific question — for example, a nudge only on the reader's 3rd question.
Counters in your text
Three placeholders are filled in for you:
| Placeholder | Becomes |
|---|---|
{curr} |
How many questions the reader has used. |
{max} |
Their limit. |
{remain} |
How many they have left. |
You have used {curr} of your {max} free answers. {remain} left this month.
Messages support Markdown, so you can link straight to your sign-in, registration, or subscribe page.
What the reader gets
Under the limit. Miso returns the normal answer. If you supplied a below message, it appears with the answer — use it for a gentle nudge or a counter.
At or past the limit. Miso returns your message instead of an answer, and
sets blocked_reason to metering so your front end can render a paywall
state.
{
"message": "success",
"data": {
"finished": true,
"blocked_reason": "metering",
"answer": "> You have used all 5 of your free answers this month."
}
}
Common setups
1. Registration wall
The most common pattern. Signed-out visitors can read but not ask. Suggested questions stay open so the feature is still visible.
| Tier | organic | related |
|---|---|---|
| anon | 0 |
unlimited |
| reg | 5 |
unlimited |
| sub | unlimited | unlimited |
Messages to write:
- anon, organic — "To ask your own question, sign in or register."
- anon, related — "This answer is a starting point. To ask your own questions, register."
- reg, organic, reached — "You have used all {max} of your answers. Subscribe to keep asking."
2. Free taster, then a wall
Let visitors feel the product before asking them to register.
| Tier | organic | related |
|---|---|---|
| anon | 2 |
unlimited |
| reg | 10 |
unlimited |
| sub | unlimited | unlimited |
- anon, organic, below — "{remain} free answers left. Register for more."
- anon, organic, reached — "That was your last free answer. Register to continue."
3. Monthly subscriber allowance
Meter paying readers too, and reset every month.
| Tier | organic |
|---|---|
| anon | 0 |
| reg | 2 |
| sub | 20, reset monthly |
- sub, organic, below — "You have used {curr} of {max} answers this month."
- sub, organic, above — "You have used all {max} answers this month. Your allowance resets on the 1st."
4. Staff and internal users bypass the limit
Send user_type: "internal" for your own team. They map to the sub tier, so
give that tier no limit and your staff are never metered.
5. Suggested questions always free
Set every related limit to unlimited and meter only organic. Readers can explore your suggested questions all day, and the allowance only applies to questions they type.
Before you launch
- Send Miso your rules and messages.
-
Confirm your front end sends
user_typeon every question, and the right value for each reader. - Test each tier: sign out, sign in as a free reader, and sign in as a subscriber.
- Check the state at the boundary — the question that hits the limit, and the one after it.
-
Confirm your front end renders
blocked_reason: "metering"as a paywall and not as an error.
To catch a click on the sign-in or register link in your message, and to start your own login flow instead, see Custom & Third-Party JS.
