Researching a competitor from open sources: what you can see from outside
I built this tool for my own work. From a single website address, in 30–60 minutes I get a working picture: what the product is and on what terms it's sold, what the site runs on, which outside services are connected to it, and how all of that changed over the past few years. Only free public sources are used, with no paid subscriptions. There is also a separate set of rules for drawing conclusions. It appeared after the method caught a mistake of my own.
The site is public, and it says almost nothing about itself
You open a competitor's site, or the site of a company you're about to work with. It's public, yet on its own it answers none of the practical questions. The page won't tell you how old the site is or how long it has looked this way. It won't say what it's built on or which outside services it uses: analytics, chat, payments, contact forms. It's even harder to see what was on the same domain a year ago, with which offer and at what price, and what has been removed or added since.
The usual answer is paid subscriptions for technology lookups and for domain and certificate history. They cost hundreds of dollars a month. I wanted to answer the same questions from free sources, including which technologies actually run on the page today and what changed over the past year.
The second difficulty is drawing the right conclusion. Gathering signals is easy, and reading too much into them is just as easy: you spot the same outside service on two sites and decide they're one product. Such a conclusion looks well-founded, and people make decisions based on it.
Twelve steps, repeatable collection and careful conclusions
The method has two halves. The first is collection: it runs from scripts, can be repeated at any time and leaves files behind. The second is a set of rules for reading the results. They say which signal actually proves something and which one appears on hundreds of unrelated sites and proves nothing.
WHOIS: registrar, domain creation date, name servers; how old the site really is
DNS records (A, NS, SOA, MX, TXT), the domains listed in the certificate, certificate history on crt.sh
A HEAD request: server headers, X-Powered-By, how cookies are named
What they sell and on what terms: offer, price, guarantees, contact forms
Public scans, passive DNS and the web archive: how the site looked before
Collection runs with one command
The
01-recon.sh
script takes a domain and in one pass runs WHOIS, DNS, certificate parsing, a search of certificate
history in the public certificate logs, a HEAD request, public scans, passive DNS and the web
archive. Each step is saved as its own file in a working folder. You can come back to that file,
attach it to a conclusion and compare it with a new run on the same domain a month later. Nobody
can check an analysis that exists only in the analyst's terminal.
Opening the page is a separate step, on purpose
The first script doesn't open the page: WHOIS, DNS and archives come from outside sources, and the
certificate and headers are read without loading the page. Opening the page itself is the only step
that leaves a trace in the site owner's analytics, so it lives in a separate file,
02-live-click.sh,
and runs only when I decide to run it. It captures exactly what the analysis is for:
- the offer and the price on the date of the analysis, which is what your own offer will be compared with
- contact forms: how many fields, which are required, what they promise after sending
- the outside services the page loads: analytics, chat, payments, CDN
Set-Cookieand response headers, which identify the site engine quite precisely
The page is saved in full, prices included, as of the date of the analysis. Two dated copies turn "they were cheaper in spring" into a fact.
The platform is recognised by its fingerprints
A site rarely says what it's built on. But every platform leaves fingerprints, and they stay on the
site when the text changes. The
tracker-signatures.md
reference is a "signal → platform" table that grows with every analysis:
- a response header unique to one platform: the strongest signal, which identifies the platform at once
- the naming and structure of cookies, which reveal both the site engine and the connected analytics
- file paths and build file names, which show the framework and how the front end is built
- the list of outside domains the page loads: CDN, analytics, chat, payments
- host names in the cloud provider's DNS, which show where everything is hosted and on what
The site's code shows how the product is built
A separate step reads the collected JavaScript and CSS to see how the product is built. Service addresses written into the code show which integrations are connected. Library versions show how fresh the front end is and how often it's updated. Internal names show how the data is organised. The step is cheap, often skipped, and it explains a great deal.
The rules for conclusions are kept in a separate document
Several parties stand behind a single site: the host, a CDN, a website builder or CMS, and the
connected outside services. Each of them serves dozens of unrelated clients. So
attribution-rules.md
splits signals into two lists: those that actually prove something, and those that show up
everywhere. A conclusion is drawn only from a unique signature.
No paid sources, by design
All collection relies on sources anyone can use: registry WHOIS servers, public DNS resolvers, public certificate logs, public page scans, passive DNS and the web archive. This limit is good for the method: it makes me rely on signals that anyone can check independently.
Plain command-line tools and free public services
All collection is a plain shell script that needs only standard command-line tools
Registrar, domain creation date, name servers: how old the site really is
A map of the DNS: hosting, mail, verifications for outside services
The domains listed in the certificate: every related domain issued under one certificate
Public certificate logs: past subdomains and related names
Public scans: which files and outside services the page loads
Free sources of DNS history
How the offer, prices and site structure looked one and three years ago
Reads JSON responses right inside the script, no packages to install
The signature and conclusion references are versioned together with the scripts
A method that catches its own mistakes
from a site address to a finished profile: offer, platform, connected services, history of changes
no paid subscription for technology lookups, DNS history or certificates
three separate analyses; each added new signatures to the reference files
The method caught my own mistake
In the third analysis my first conclusion was wrong. Two different sites used the same outside service, and that looked like proof they were the same product. The signal was striking, repeatable and completely misleading. The error showed up one step later: the response headers carried a platform signature, and the second site had a different one. All the two sites shared was an outside service used by dozens of unrelated companies.
The rule that came out of it
Shared tools do not prove a shared team.
That sentence went into
attribution-rules.md
together with a list of signals that look convincing and prove nothing:
- anycast addresses of a popular CDN: one shared pool for every customer on the plan
- the most popular registrar and its default privacy service: that only shows popularity
- a shared outside widget (chat, form, analytics): dozens of unrelated companies install them
- a standard landing page template and the usual cookie set of a popular framework
The resulting procedure is short: find a unique signature, identify the platform from it, confirm it with a second independent signal, and only then state a conclusion. Shared infrastructure goes into the write-up only as supporting evidence.
What I have after three analyses
A repository with the playbook, two reusable scripts and two reference documents that grow with each new analysis. There is also a delivery checklist with the fields that must be filled in before a conclusion counts as finished: what the product is, what the site runs on, which services are connected, and what exactly supports each point. The checklist exists for the same reason as the rules: so that the analyst's confidence never stands in for evidence.
In short, the method checks its own conclusions. The document now answers two questions: "how to find out" and "how to tell that you don't know yet".
Where the same method helps
The underlying task is common: build a picture of someone else's site from one public address without drawing the wrong conclusion. It comes up in many situations:
- → Checking a partner before a deal: domain age, what the site runs on today, related sites under the same certificate, history in the web archive
- → Technical research on a competitor: what the site is built on, which analytics and outside services it uses, what was on the domain a year ago
- → Copies of your site and phishing against your brand: a network of lookalike domains often gives itself away through a shared certificate and shared infrastructure
- → Checks before buying a domain or a project: what used to be there and what it's linked to through certificate history
- → Looking at your own company from outside: the same research pointed at yourself shows which of your subdomains and internal names anyone can see for free
- The one-command collection script: a domain goes in, a folder with a file for each step comes out
- A separate script for opening the page; the rest of the collection doesn't load the page itself
- A "signal → platform" reference that grows with every new analysis
- Rules for conclusions: a clear list of signals that prove something, and a list of those that prove nothing
- A delivery checklist with required fields, so the result doesn't stay in the analyst's head
If you want to know how a competitor does it, the answer is often already public
Much of the answer is in free sources. It has to be collected in the right order and read correctly. One site takes 30–60 minutes. The method, the scripts and the reference files stay with you and keep working without me.
Related cases and ready-made solutions
An Astro landing page that scores B2B leads by company tax ID
A multi-step form asks for the company's tax ID. Within seconds an n8n workflow pulls data about the company…
Finding B2B clients with cold emails written by AI
Five steps. Apollo picks senior decision-makers who fit the customer profile, Clay collects 4–7 facts about…
Conversions go to the ad platforms straight from the server, and the team's report builds itself
The Keitaro tracker collects clicks and conversions on your own server. An nginx layer with Lua removes…