Role-split emails, contact pages and website technology columns
Twenty-four of the 64 columns are read from the business’s own website rather than from the map listing. What each one is for, what it looks like, and how complete they actually are.
A map listing gives you a name, an address, a phone number, hours and a rating. It never gives you an email address, never tells you who works there, and never tells you what the business runs its website on. Twenty-four of the 64 export columns come from somewhere else entirely: the business's own website.
These are the columns that turn a directory row into something you can actually open a conversation with, so they are worth understanding one at a time.
Read this before you plan around them
Website enrichment is still being rolled out. The columns are in every file, in the order below, from the first export you run — but a column that is present is not a column that is filled, and coverage on the enrichment fields is climbing rather than complete. Nothing here describes a value we invent: when we have not read it, the cell is empty. Export a small batch in your own market and count the populated cells before you commit a campaign to one of these fields.
Nine email columns, not one
The email group writes a single Email column — the best address we
found. The separate all_emails group writes nine more, and they answer a different
question: which mailbox should this message go to, and is there a person behind it?
| Column | Contains |
|---|---|
Individual email | An address that belongs to a named person rather than a department — p.groth@… rather than info@… |
Individual email first name | The first name inferred from that address, where the pattern makes it unambiguous |
Individual email last name | The surname, on the same basis |
Contact email | The general enquiries mailbox — info@, contact@, post@ |
Sales email | The sales or new-business mailbox |
Marketing email | The marketing mailbox |
Finance email | Accounts, invoicing, billing |
Administration email | Admin, HR, office management |
All emails | Every address found for the business, as a JSON array, with the evidence for each one |
The point of the split is that the right mailbox is not the same for every
message. A demo request that lands in finance@ is deleted; an invoice
query that lands in sales@ is forwarded twice and then lost. If you are running
more than one kind of outreach from the same export, these eight columns let one file serve all
of them without a manual sort.
And Individual email first name / last name are what make a first
line addressed to a person possible from a spreadsheet. Where they are empty, they are empty —
there is no inferred "Dear Business Owner" fallback written into the file, because a wrong name
is worse than no name.
What is inside All emails
A JSON array, one object per address, in ranked order — so Email is always the
first element's email. The keys are fixed:
[{"email": "p.groth@example.no",
"domain": "example.no",
"category": "individual",
"pattern": "flast",
"firstname": null, "lastname": "Groth", "gender": null,
"mx_provider": "google",
"is_webmail": false, "is_disposable": false, "has_mx": true,
"sources": ["https://example.no/kontakt"]}]
category is what drives the role columns above:
individual, info-contact, sales, marketing,
finance, administration — plus technical and
unknown, which have no column of their own and appear only inside the array. Where
two addresses share a category, the first one wins the column.
sources is the honest part: the list of URLs the address was actually found on.
That is per-address provenance, and it is what lets you answer "where did you get this" for a
specific mailbox rather than for the row as a whole. See your lawful basis.
We do not generate addresses from a pattern
pattern describes an address we found; it is not licence to
construct firstname.lastname@domain for a business where we found nothing. A
guessed address bounces, damages your sending reputation, and was never published by
anybody. Empty stays empty — why a listing has no email.
Six contact-page columns
Contact page 1 through Contact page 5 hold up to five URLs on the
business's site that look like contact pages, and All contact pages holds the same
list as a JSON array. Multilingual sites are the common case for more than one:
/en/contact and /no/kontakt are two rows of the same reality.
These matter most when Email is empty. A business with a contact form and no
published address is not unreachable — it is reachable through a form, and the URL is right
there in the file. Pair the Has a contact page filter with an empty
Email and you have a clean list of "reachable, but not by mail merge".
Realistically: page 1 is the one that is usually populated, page 2 sometimes, and pages 3 to 5 rarely. They exist because the header contract has five of them, not because five is a typical number.
Website title, meta and language
| Column | Contains | Why you would use it |
|---|---|---|
Website title | The <title> of the home page | How the business describes itself in its own words — far better copy for a personalised first line than a category name |
Website meta description | The meta description | The same, in a sentence |
Website meta image | The Open Graph image URL | A logo or storefront photo, if you are building a visual list |
Website meta generator | The generator tag, e.g. WordPress 6.4.8 | The single most direct signal of what a site is built on, and often of how old it is |
Website lang | The declared page language: no, nb, en | Which language to write in. Do not infer it from the country. |
Website technologies and ad pixels
Two JSON arrays of what was detected on the site:
Website technologies ["Nginx", "WordPress", "PHP", "MySQL", "reCAPTCHA"]
Website ad pixels ["Google Tag Manager", "Facebook Ads"]
This is qualification data. If you sell Shopify apps, a list of businesses whose sites
report Shopify is a different proposition from a list of businesses in a category. If you sell
advertising services, Website ad pixels splits your market cleanly in two: the
businesses already spending on ads, and the businesses not yet. Both are good lists; they need
completely different opening lines.
Two matching filters narrow on this before you export — Technology contains and Ad pixel contains, both free text, plus a plain Runs advertising pixels flag. See the filters.
Absence of a technology is not evidence of absence
These arrays list what was detected on the pages we read. A tool that only loads on a checkout page, or behind a consent banner, may be in use and not in the array. Treat a hit as a strong signal and a miss as no signal, not as a negative one.
Reading the JSON columns without pain
- An empty array is written as an empty cell, not as
[]. Check for emptiness before you parse, or your parser will throw on the majority of rows. - Take the XLSX or JSON download if you are going to work with these by hand. In CSV they are long quoted strings in a tab-delimited file, which is correct and unpleasant — choosing a format.
- The singular column is always the first element of its matching array, so you never need to parse the array just to get the primary value.
Updated on: