MSSP, MDR & Multi-Tenant SOC

One subscription, every tenant, no per-client line item

The economics of a managed security practice punish anything priced per seat or per endpoint, because you carry the cost across every client whether or not they value it. A daily list of 390,000-plus DNS-verified phishing domains is not priced that way: you take one copy, and it enriches tier-1 triage, feeds SOAR playbooks, and populates blocklists in as many tenants as you operate. This page is about the operational shape of that, and about the difference between reselling somebody's verdicts and embedding a list you hold.

Tenant distribution build 04:30 UTC
Tenant A — DNS RPZ Loaded
Tenant B — NGFW list Loaded
Tenant C — SIEM lookup Loaded
Tenant D — mail gateway Loaded
…and the rest of the book Same file
One authenticated retrieval per day. A changelog of additions and removals. No per-tenant billing event anywhere in the chain.
390,000+
Live verified domains
100
Domains per batch call
10/sec
Rate limit per API key
<50ms
Single-check response
Home / Use Cases / Managed Security Providers
The margin problem

Every per-seat data source is a tax on your smallest clients

A managed practice does not buy tools the way an enterprise does, because the cost lands across a book of clients with wildly different sizes and wildly different willingness to pay.

The commercial shape of a managed security business is unforgiving in a way that in-house teams rarely appreciate. You have a book of clients ranging from a thirty-person accountancy practice to a several-thousand-seat manufacturer. You have a service description that promises the same detection capability to all of them, because tiering the actual security content is both operationally miserable and hard to defend in a sales conversation. And you have a gross margin that gets squeezed every time a data source prices itself per endpoint, per user or per tenant, because the small clients cannot absorb their share and you end up eating it.

The two familiar bad outcomes

Sources priced per seat get bought for the top of the book and quietly withheld from the bottom, creating a two-tier service you then have to describe carefully. Sources priced per query get bought and then rationed, with analysts told to check "only when it matters" — which is precisely the instruction guaranteeing the check does not happen during a busy shift. Neither is what anybody intended when the tool was evaluated.

A flat subscription is structurally different

You pay once for the right to download the database, and the file is the same file whether it protects four tenants or four hundred. There is no per-tenant licence to track, no seat count to reconcile at renewal, and no moment where onboarding a client triggers a cost increase you have to price into the deal. Downloads are unlimited, so there is no meter running.

Unmetered controls actually get used

Controls that are metered get used less than controls that are not, regardless of what the policy says, because analysts internalise cost signals. A source costing nothing at the margin gets wired into the default path — the enrichment step that runs on every alert rather than on the ones somebody judged worthy. That is the version that changes your false-positive rate, and it is only available when the pricing model permits it.

The onboarding test. When you win a new client on Monday, does your security content cost more on Tuesday? For anything priced per seat the answer is yes, and that number has to appear somewhere in the deal. For a feed subscription it does not.
Rationed controls do not run. If tier-1 has been told to check sparingly because lookups cost money, the check will not happen at 02:00 during an alert storm — which is the only shift where it would have mattered.
Where it plugs in

Six places the same file earns its keep inside a managed practice

None of these requires a new console, a new agent, or anything a client has to see. They are all things you do with a file you already hold.

Tier-1 alert enrichment

A proxy or DNS alert naming a domain arrives with no context. A local lookup against the list attaches a definite verdict before a human sees the ticket, which turns "investigate this domain" into either a confirmed true positive with an escalation path or a low-priority item that can be closed on a rule.

SOAR playbook enrichment

The enrichment step is a local match rather than an external call, so it adds no latency budget, no API failure mode and no rate limit to your playbook. Where a playbook must call out, /check answers in under 50 milliseconds within a 10-per-second-per-key limit.

Per-tenant blocking

The same file drops into each tenant's enforcement point — a DNS response policy zone, a firewall address list, a secure web gateway custom category, or a mail gateway URL blocklist. One retrieval, many destinations, and a distribution job you probably already own for other content.

Retrospective hunting

The daily changelog names what was added. Run today's additions against yesterday's DNS, proxy and mail logs per tenant and you find the users who reached a host before it was known — which is a credential-reset conversation, not a blocked-request statistic.

QBR and reporting material

Blocked-connection counts per tenant, retrospective findings, and month-on-month movement are all derivable from data you already hold, without asking the client to install anything or believe a vendor-supplied benchmark.

Ad-hoc analyst lookups

The unglamorous one. An analyst has a domain from a forwarded email and wants an answer now. A local grep against the current file is instant and leaves no trace outside your infrastructure — which matters when the domain came from a client's incident.

What none of these do, and you should say so in the service description

This is a known-bad lookup: a match means the hostname has a confirmed active A record and has been verified as phishing or malware infrastructure as of its last_checked date, while a clean result means the hostname is not on the list rather than that it is safe, and a domain registered and first used inside the same hour will not be present yet. Write that into the service description rather than leaving it implicit, because a client told the boundary in advance treats a miss as a known limitation of one layer while a client who inferred completeness from a sales deck treats the same miss as a failure of the service — see the threat intelligence page for how this is framed more generally.

The queue

What a binary verdict does to a tier-1 analyst's shift

The value of a definite answer is not the answer. It is the twenty minutes of investigation that no longer has to happen, multiplied by the volume of a multi-tenant queue.

Consider what a tier-1 analyst actually does with a domain-bearing alert in the absence of a good source. They open a reputation service and get a score with no stated methodology. They check registration age, which tells them something but not enough. They look at what else resolves to the same address. They may or may not visit the page through an isolated browser, depending on whether your policy permits it and whether the sandbox is working today. Somewhere between five and twenty-five minutes later they form a judgement that is, honestly, a guess with supporting evidence — and they write it into the ticket in language that suggests more certainty than they have.

Variance is worse than the time cost

Multiply that investigation by the alert volume of a whole book and the cost is enormous, but the bigger problem is that two analysts working the same domain reach different conclusions — and the difference is not competence, it is which of the eight browser tabs they happened to weight. That variance is what a client experiences as inconsistency in your service, and it is what makes quality review across a shift roster so laborious.

What a definite verdict collapses

Where the domain is on the list, the analyst has unambiguous confirmation with a stated inclusion test — an active A record verified through rotating proxy infrastructure on a host assessed as phishing or malware distribution — plus a last_checked date. The ticket becomes an escalation immediately, with the same wording every time. Confidence is 0.98 or 0.0 with nothing between, because a graduated score reintroduces exactly the discretion the enrichment was meant to remove.

Be careful what a non-match authorises

The correct runbook instruction is that the check returned no match and the normal investigation continues — not that the domain is clean. Runbooks folding an absence of information into a disposition are how a good enrichment source becomes a source of false negatives, and it is the most common way this kind of integration gets misused. Write the rules so a match can close a question and a non-match cannot.

Measure the right thing

You are not reducing the number of alerts your sensors generate, and claiming that in a QBR deck will not survive scrutiny. You are reducing the time each domain-bearing alert consumes, and removing a category of ticket that would otherwise have been escalated to tier 2 on the strength of a nervous analyst's judgement. Measure the second thing, because it is real and it is defensible.

A match is a closing statement; a non-match is not. Build the disposition rules so a confirmed hit can resolve a ticket in one direction only. The reverse — closing on an absence — is how enrichment turns into a blind spot.
Consistency is the underrated benefit. The same domain gets the same verdict at 09:00 and at 03:00, from your most experienced analyst and from the one who started last month. That is what makes shift-level quality review tractable.
The numbers

What this costs across a book, and where the batching limits actually bite

Two purchasing shapes, and the arithmetic that decides which one a managed practice should be on.

Plans are monthly subscriptions via PayPal, priced by volume: Growth at $99/month for 25,000 lookups, Professional at $249/month for 100,000 lookups with priority support, Business at $499/month for 250,000 lookups with dedicated support, and Enterprise at $999/month for 750,000 lookups with an account manager. Unused lookups reset at the end of each billing month.

The feed: $499/month

Billed monthly, cancel any time. Includes priority support, daily-updated data and unlimited downloads.

Why the combination wins

Not the headline price but the shape: the feed handles steady-state matching across every tenant at zero marginal cost, and the bundled credits cover the interactive and playbook lookups that genuinely have to hit the API.

10 requests per second per key

The limit matters more at analyst scale than the price does, because it is shared across every playbook and every tenant using that key. One noisy tenant can starve everything else.

Batching is a 100× difference

/batch takes 100 domains per POST at one lookup each, returning checked, phishing_found and credits_used. A single key sustains roughly 1,000 domain checks per second batched, and roughly 10 unbatched — produced entirely by how the integration is written.

Deduplicate and cache

A busy tenant generates the same handful of domains repeatedly within a minute. Cache verdicts for the length of a build cycle, since the data changes once every 24 hours at 04:30 UTC and re-asking inside that window buys nothing at all.

And one endpoint that is free of auth

/stats reports database size and last update with no API key, no credits and no authentication — a sensible target for a monitoring check that must run outside any credentialled path, including one that verifies your own copy is not stale.

For anything resembling bulk, do not call out at all. Log enrichment, retrospective hunting and historical sweeps across a book of clients should match against the local feed copy rather than paying per domain for answers you could have held on disk.
Deployment

Five steps from evaluation to every tenant carrying the list

Written for a practice that already has a content distribution pipeline. If you do not, step three is the one that becomes a project.

01

Test against your own history

Pull the domains from ninety days of escalated alerts across the book and batch them. The hit rate on incidents you already investigated is the only evaluation number worth showing a service director.

02

Automate the retrieval

A scheduled pull shortly after 04:30 UTC, a validity check on the file before it replaces the live copy, and one alert if the current file is older than forty-eight hours. Staleness is the failure mode.

03

Fan out to tenants

Push the file through whatever already distributes content to client estates — your RMM, configuration management, or per-tenant firewall automation. Track which tenants confirmed the load, not just which were sent it.

04

Wire the enrichment step

Add the local match to the tier-1 runbook and the SOAR playbook, with disposition rules that let a match close a question and never let a non-match do the same. Batch and deduplicate anything that calls out.

05

Make it visible per tenant

Attribute blocks and retrospective findings to the tenant they belong to from day one. Reconstructing per-client figures later, from logs that were never tagged, is far more painful than tagging them now.

Step one is not optional. A hit rate measured against your own historical escalations is the only figure that survives contact with a sceptical service director, and it takes an afternoon and a few hundred credits to produce.
Confirm the load, do not assume it. A distribution job that reports success on push rather than on load is how a tenant ends up carrying a three-week-old list while your dashboard shows green.
Packaging

Reselling verdicts and embedding a list are different businesses

Both are legitimate. They carry different obligations, different failure modes and different conversations with a client's procurement team.

Reselling verdicts

You call the API per event and surface the answer to the client, in your portal or in a ticket. It is quick to build, honest about provenance if you name the source, and it scales linearly with event volume — which means your cost and your rate-limit headroom both track your busiest tenant's worst day. It also creates a dependency the client can feel: if the service is unreachable during an incident, the enrichment your runbook assumes is simply absent, and the analyst is back to eight browser tabs.

Embedding the list

You hold the database and match locally in your own platform. Matching costs nothing per event, survives any upstream outage, adds no latency to a playbook, and never transmits a client's domains anywhere, so onboarding a tenant is a distribution step rather than a commercial event. The trade is that you now own freshness: your copy is exactly as current as your last successful retrieval, which is why the staleness alert in step two is the most important line of the whole deployment.

Rule of thumb: if the check happens on every event, embed it. If it happens when an analyst asks a question, calling out is fine. Most mature practices run both — the embedded list underneath everything, and API calls for interactive and playbook work, funded by the credits bundled with the annual feed.

Presenting the capability under your own brand is normal in this industry and there is nothing improper about it. The API is called from your backend, or the list is matched inside your platform, and the client sees a verdict in your portal. What deserves thought is the language around it, because a managed provider's credibility is built on clients believing the descriptions in the service catalogue.

Claims that are safe to make

The factual ones about the data: a daily-rebuilt list of domains verified as actively resolving credential-harvesting and malware infrastructure, matched against every monitored event, with per-tenant reporting. Those are true, checkable and specific enough to differentiate you from a competitor whose marketing says "advanced threat intelligence" and stops there.

The claim that causes trouble

Implied exhaustiveness — language suggesting that phishing domains are blocked, rather than that known phishing domains are blocked. The gap between those two sentences is where every awkward post-incident conversation lives, and it is a gap you create for yourself in a sales deck long before anybody has to stand in it.

Decide the provenance answer early

Work out in advance how you answer a client who asks where the data comes from. Refusing to say invites the assumption that you built it yourself, which is a claim you then have to sustain under scrutiny. Naming the source costs very little, because the client is buying your operations, integration and analysts rather than a data licence they could buy directly and would have no idea what to do with.

QBR material writes itself

If you tagged correctly at step five: blocked connections to verified phishing infrastructure this quarter split by tenant, retrospective findings from the daily changelog, movement over time, and new tenants brought onto the same list at onboarding with no additional cost. All of it derived from data you already hold, with nothing for the client to install.

Report their estate, not the industry

A client cannot verify a benchmark and can verify their own numbers, so a chart drawn from their own logs is worth more than any figure about their sector. It also removes the awkward moment where somebody asks where the comparison came from and the honest answer is a vendor's marketing page.

Include the misses, not only the blocks

A QBR reporting "we found two users who reached a host before it was on the list, reset their credentials, and here is the timeline" is a far stronger argument for the service than a clean chart, and it is the kind of candour that renews contracts. The same reporting discipline appears on the incident response and SIEM integration pages.

Questions from service directors and SOC leads

What gets asked before this reaches a platform roadmap

Including the licensing question, which is the one everybody wants answered first and nobody asks first.

Can one subscription genuinely serve all of our client tenants?

The feed is a database download with unlimited retrievals, and it is designed to be loaded into infrastructure you operate — which for a managed provider means the enforcement points across your client estates. There is no per-tenant licence key, no seat count and no activation step per client, so onboarding a new tenant is a distribution task rather than a commercial event. Where it is worth a conversation rather than an assumption is if you intend to redistribute the raw database itself to clients as a data product they hold independently of your service — that is a different arrangement from embedding it in a service you operate, and the enterprise terms, which also cover SFTP and S3 delivery, STIX/TAXII and custom update frequencies, are quoted rather than listed. Ask before you build a product on the assumption.

Our SOAR platform makes one call per artefact. Is the rate limit going to hurt?

Yes, if you leave it that way. The limit is 10 requests per second per key, so a per-artefact playbook tops out at 10 domains per second regardless of how many workers you run, and a burst from one noisy tenant will starve every other playbook using the same key. Batching fixes it: the /batch endpoint takes up to 100 domains per POST at one lookup each, which turns the same 10 requests per second into roughly 1,000 domain checks per second, and adding deduplication before submission plus a short-lived cache — the data changes once per 24 hours at 04:30 UTC, so re-asking within a build cycle achieves nothing — makes the limit stop being a consideration. For anything genuinely bulk, match against the local feed copy instead and do not call out at all.

Does using this send our clients' domains to a third party?

With the per-query endpoints, yes — each call transmits the hostname you asked about. For a lot of enrichment work that is unremarkable, but it is a real question when the domain came out of a client incident, and it is a question that appears on client security questionnaires more often every year. Retrieving the whole database and matching locally removes the question: no client domain is ever transmitted, and the only outbound traffic is your scheduled download. That is a straightforward answer to give in a questionnaire, and it is architecturally true rather than a contractual promise about somebody else's log retention.

How do we describe the coverage limit to a client without undermining the service?

Plainly, and early. The wording that works is that the service blocks and flags domains verified as active phishing infrastructure, that verification requires the host to be resolving, and that a domain first used within the same hour it was registered may not yet be present. Then say what covers that gap in your stack — behavioural detection, mail authentication, user reporting, whatever you actually run. A client told this at onboarding treats a miss as a known property of one layer, whereas a client who inferred completeness from a sales deck treats the same miss as a service failure and says so in the renewal meeting — so the cost of the honest sentence is close to zero, and the cost of omitting it is a conversation you cannot win.

What is the actual measurable improvement for tier 1?

Be careful what you measure, because the tempting metric is the wrong one. You are not reducing alert volume — your sensors generate exactly as many alerts as before. What changes is handling time on domain-bearing alerts, and the number of tickets escalated to tier 2 purely because an analyst could not reach a confident conclusion. Measure those two directly, over a defined period, against your own baseline — and measure consistency alongside them, because the same domain producing the same disposition regardless of who is on shift is worth more to a managed practice than any single-ticket time saving, being what makes quality review across a roster possible at all.

We already buy a large commercial threat intelligence platform. Is this redundant?

Possibly, and the way to find out is empirical rather than architectural. Take ninety days of domains from your own escalated alerts, run them against both, and look at the overlap and the gaps. If your existing platform already carries everything with equivalent freshness and a comparable inclusion standard, you have your answer and it costs you an afternoon. What usually differs is the retention rule rather than the collection: many platforms accumulate indicators indefinitely, which is right for research and wrong for a blocklist because it grows a file your enforcement points parse forever, whereas here a domain that stops resolving falls out, so what you distribute describes hosts that are answering rather than everything ever observed. Whether that difference matters depends entirely on where you are putting the data.

Can we present this under our own brand?

Yes, and it is the normal arrangement. Calls are made from your backend or matching happens inside your platform, and the client sees a verdict in your portal alongside everything else you produce. The discipline that matters is in the language rather than the branding: claim what is true about the data — daily rebuild, verification by active DNS resolution, per-tenant coverage, dated observations — avoid phrasing that implies exhaustiveness, and decide in advance what you say when a client asks where the data comes from, because refusing to answer implies you built it, which is a claim you would then have to sustain under scrutiny.

What happens to a tenant if our retrieval fails for a week?

Nothing visible, which is exactly the danger. Enforcement carries on against your last successful copy, blocks keep happening, dashboards stay green, and the only symptom is that domains added over the last seven days are absent. This is the failure mode to design against, and it is why the deployment above puts a staleness alert in step two rather than in a backlog. Two cheap safeguards cover it: alert if the current file is more than forty-eight hours old, at the point of distribution and again at the tenant, so a broken fan-out is caught as well as a broken retrieval — and have that check compare against the /stats endpoint, which reports the database's last update and requires no key, no credits and no authentication, so your monitoring path does not depend on the same credentials that might be the thing that broke.

Run it against ninety days of your own escalations first

Confirm the database size from the open statistics endpoint, batch the domains from alerts you have already investigated, and see what the hit rate looks like on your own book before anything reaches a roadmap. If the answer is worth having, the feed is the deployment that puts it in every tenant without a per-client line item.