Skip to content
Facteur
FRGet started

Quotas and alerts

One inbox’s quota should never depend on another’s

Elsewhere, isolating quotas requires an Enterprise plan. Here it is included from twelve euros a month, because it is the condition for a team to work in peace.

Today’s quotas

4 inboxes
  • ci-nightly4,120 / 5,000
  • e2e-signature7,640 / 8,000

    90 % alert sent

  • manual-staging240 / 2,000
  • load-test3,000 / 3,000

    limit reached, messages refused

infra/quotas.tsTypeScript
// Quotas live in the API, so they live in your IaC.
await facteur.inboxes.setQuota('j3k9x2mq', {
  // 'reject': CI stops dead
  daily: { messages: 5_000, onExceed: 'reject' },
  // 'alert': we warn, we let it through
  monthly: { messages: 80_000, onExceed: 'alert' },
});

await facteur.alerts.create({
  scope: { inbox: 'j3k9x2mq' },
  thresholds: [50, 75, 90, 100],
  channels: [
    { type: 'slack', target: '#qa-alerts' },
    { type: 'webhook', target: 'https://hooks/quota' },
  ],
});

Detail

What you can set

Available from the first paid plan

€12/month

Quota isolation is not a commercial negotiation lever. It is the minimum for a team to share an account without getting in each other’s way, so it is included from the Solo plan.

Daily and monthly limits

Both, independently, per inbox. The daily limit protects against infinite loops; the monthly one protects the budget.

You choose the behaviour

reject | alert

On overage the inbox refuses messages at the SMTP level — your test fails cleanly, with an explicit error code — or it keeps accepting and merely alerts. Whether the inbox serves CI or a customer demo, the right choice differs.

Progressive alert thresholds

50 · 75 · 90 · 100 %

One alert per threshold crossed, never twice for the same one. The point is to warn you before the wall, not to drown you.

The channels you already use

Email, signed webhook, Slack, Microsoft Teams — and OpsGenie or PagerDuty when the threshold crossed deserves to wake someone rather than wait for Monday.

Usage per inbox

The dashboard answers “who used my quota”, not just “how much did I use”. Per inbox, per day, exportable as CSV.

Global spending cap

A maximum beyond which we stop billing pay-as-you-go. A surprise bill is a design defect, not a fact of life.

Driven by API

Everything above is in the API and in the Terraform provider. Your quotas live in your repository, not in the memory of whoever last clicked.

And when it overflows

Three ways out, and you pick

Exceeding a quota is a normal event in a project’s life. It should not be an incident.

Option 1

A pack, right away

Two clicks, payment, capacity available within the second. Your subscription does not move by a cent.

Option 2

Pay-as-you-go takes over

Nothing to do, nothing breaks, billed on usage within your spending cap.

Option 3

We refuse, cleanly

An explicit SMTP rejection rather than a message swallowed in silence. Your test fails for the right reason, and you see it.

Take back control of your capacity

Per-inbox quotas, progressive alerts and a spending cap: included from the Solo plan, with no sales conversation.