How to Categorize a List of Company Websites in Bulk
Put your domains in a CSV, add one column whose header asks the category question with your allowed categories written into it, and run it for every row. Sort by confidence and check only the lowest rows. By the end of this post you will have the exact header wording and the math to price the job before you run it.
Updated October 15, 2026
Write the categories into one column header
A bulk categorization job is a CSV with a domain column and one question column. The question carries the buckets, so every answer comes back as one of them and not as free text.
Here are the two headers I would paste into a new sheet. Swap in your own buckets.
| Column header (the question) | What you get back |
|---|---|
| Which best describes this company: agency, SaaS, local service business, ecommerce store or other? | One of your five buckets |
| Is this a B2B company that sells software? Yes or No. | Yes or No |
Example: the domains and confidence numbers below are invented, only to show the shape of the result.
| domain | Which best describes this company... | confidence |
|---|---|---|
| example-agency.com | agency | 0.94 |
| example-shop.com | ecommerce store | 0.91 |
| example-blog.net | other | 0.38 |
The third row is the one you open. The first two you keep.
Run it in five steps
- Export the list with one column of domains. Keep the original row number in the file.
- Add the category header from the table above, with your own buckets in it.
- Add the Yes or No header for the one filter that matters most.
- Run the sheet. Each answer arrives with a confidence number.
- Sort by confidence, check the lowest rows, keep the rest.
When your buckets are few and clearly different, one column is enough. When they overlap or the list is messy, keep the second column and filter on both. For the cutoff between "keep" and "check", use the numbers in What Confidence Threshold Should You Use to Review AI Answers? and do not guess one.
Price the run before you start
Row-questions used = rows x questions.
Say you have 4,000 domains and you ask the two questions above. That is 4,000 x 2 = 8,000 row-questions. Starter is $29/month for 25,000 row-questions, so the whole list fits with room left. Pro is $99/month for 150,000 row-questions if you run lists like this for clients every week. Cached answers are not billed again, so re-running a sheet after a small wording tweak does not double the bill.
The free plan has 500 row-questions and needs no card. At two questions per row that covers a 250 domain sample, which is plenty to see whether your buckets are worded well.
Do the review math so you know what you are saving
Hand-review time = rows flagged low confidence x seconds per site.
Say 400 of those 4,000 rows come back low and you spend 20 seconds on each. That is 400 x 20 = 8,000 seconds, about 2.2 hours. Opening every row at the same 20 seconds is 80,000 seconds, about 22 hours. Plug in your own row count and your own seconds per site. The gap between the two numbers is the reason the confidence column exists.
Use a code lookup only when you need an official code
Sometimes you do not want your own buckets. You want a NAICS or SIC code for compliance or a database join. Then use a code lookup and do not bend it into something else.
Brand.dev's NAICS API takes a company domain and analyzes site metadata, headers, page content, keywords, category labels and schema to return a NAICS code and sector. It is built for developers, so plan on code or a connector.
The catch is the codes themselves. Some companies carry more than one NAICS code, and there is no official 1 to 1 mapping. If your ICP is "agencies" or "local service businesses", a code will not line up with it cleanly, and rows land in the wrong bucket or in several.
| If you need... | Do this |
|---|---|
| An official code for compliance or a join | Use a code lookup tool or API |
| Your own buckets (agency, SaaS, local service business) | Write them into a column header |
| Both | Run the code lookup first, then add a header question for your bucket and compare the two |
Use a taxonomy tool when you need standard topic labels
If you sort publisher or ad lists, a fixed topic taxonomy can be exactly right. Nyckel's bulk IAB tool takes a CSV with URLs in column A, scrapes each site and returns an IAB category per row. It handles up to 5,000 rows at a time at about 10 to 15 seconds per 100 rows. Klazify covers 620+ topic categories based on the IAB v3 standard and supports batch enrichment from a CSV.
Batch time = rows / 100 x 10 to 15 seconds. For 4,000 rows that is 40 batches, so roughly 7 to 10 minutes. Uploads needed = rows / 5,000. For 12,000 domains that is 3 uploads, and without the original row number in the file, merging the results back is a headache.
The limit is what IAB labels describe: the topic of a site, not the kind of business behind it. A site tagged under a business topic could be an agency, a publisher or a store. If your question is "is this an agency", a topic label hands you a second pass of manual sorting.
Fix the three mistakes that cost the most
- Leaving the categories out of the header. Answers come back as free text. Cost: cleanup time before every filter.
- Using IAB topics or NAICS codes as your ICP buckets. Cost: a second manual pass, because the label never matched the question you were asking.
- Trusting every row. Some wrong rows end up in the final list. Cost: you email the wrong companies. Sorting by confidence is the fix, and no tool should claim its answers are always right.
To narrow by fit and not just category, How to Filter a Lead List by ICP Fit When There Is No Industry Column covers that step.
Do this in the next ten minutes
- Open your CSV and pull out 250 domains.
- Write your allowed categories into one header, using the wording above.
- Add the Yes or No header for the one filter that matters most.
- Run both, sort by confidence, and open the five lowest rows.
If those five rows look reasonable, your buckets are worded well. If they look off, reword the header and run it again. Cached answers are not billed again, so a small tweak stays cheap.
Start with your own list
Columns is an AI spreadsheet from Hive Asset Group. You write the question as a plain-English header, it answers every row, and every answer carries a confidence number. The free plan includes 500 row-questions with no card, enough to try the two headers above on a real sample. Start free, no card.
Frequently asked questions
- Can I upload a CSV of domains and get a category for each one?
- Yes. Put the domains in one column, add a column header that asks the category question with your allowed categories written in, and run it. Each row comes back with an answer and a confidence number.
- How many websites can I categorize at once?
- It depends on the tool. Nyckel's bulk IAB tool takes up to 5,000 rows per upload, so 12,000 domains means 3 uploads. With a column-header sheet you size the job in row-questions: rows x questions.
- What is the difference between an IAB category and an industry category?
- An IAB category describes the topic of a site. An industry category, such as a NAICS code, describes the kind of business. A site on a business topic could be an agency, a publisher or a store.
- How do I categorize websites into my own groups instead of a standard list?
- Write your groups into the column header, for example: agency, SaaS, local service business, ecommerce store or other. Every answer then comes back as one of your buckets.
- How do I know which categories are wrong?
- Sort by the confidence number and open the lowest rows. You will not catch every error that way, but you review the rows most likely to need a human instead of all of them.