Send email from BuiltWith with Volanea by treating BuiltWith as a data source and your server-side relay as the sending boundary. BuiltWith does not offer a native Volanea app, marketplace installation, or a general outbound HTTP webhook action that can directly call an email API, so the dependable implementation is BuiltWith API → scheduled middleware → Volanea REST API.
That distinction matters. A direct integration guide that tells you to paste a Volanea endpoint into a BuiltWith webhook field would be inventing a feature that is not part of BuiltWith’s documented product surface. BuiltWith offers APIs for domain, technology-change, list, relationship, and related data; it also offers live data feeds over WSS on eligible plans. Its documented integrations include specific CRM and platform integrations, rather than a generic automation canvas with an arbitrary POST action. (api.builtwith.com)
This guide builds the practical version: poll the BuiltWith Change API on a schedule, detect technology additions or removals for domains you care about, and send an internal alert through Volanea. The same relay pattern works if you consume a BuiltWith live feed, but polling the Change API is easier to make auditable, idempotent, and predictable.
What this integration does — and does not do
The integration sends an email when your middleware finds a BuiltWith technology change. For example, you may want an internal account-team alert when a monitored company adds a marketing automation platform, removes an ecommerce tool, or makes another meaningful technology change.
The concrete event that starts the email is not a BuiltWith form submission, record creation, pipeline stage change, or outbound webhook. In this implementation, the trigger is a scheduled job in your infrastructure — such as a cron job, serverless scheduler, queue consumer, or worker — that calls BuiltWith’s Change API. A send begins only when the returned Changes.events array contains an event your rules allow.
BuiltWith documents its Change API as a lookup for technology additions and removals during a configurable time window. The response includes a root-domain lookup, a generated summary, and event properties such as type, technology, category, tag, importance, and timestamps. (api.builtwith.com)
This has two important implications:
- BuiltWith does not provide the recipient email address. The Change API response identifies a domain and technology data, not a contact who opted in to hear from you. Use this workflow for alerts to your own team, customers who have requested monitoring, or another audience with an appropriate permission basis.
- Your relay owns the send decision. It decides whether an event is important enough to email, which mailbox receives the alert, what template to use, and how duplicate processing is prevented.
That is a better architecture than attempting to make a prospecting email system out of technology data. Technology signals can help a human decide what to investigate, but they do not establish consent to send promotional email.
Why middleware is required for BuiltWith
BuiltWith’s documented APIs are request/response APIs. For the Change API, your application sends a request containing a KEY and LOOKUP parameter, then receives structured JSON describing detected changes. BuiltWith also documents live data feeds using WSS endpoints, available on Basic, Pro, and Team plans, for products that need a streaming integration. (api.builtwith.com)
Neither of those is a generic “POST arbitrary JSON to this URL” workflow builder. Therefore, there is nowhere in BuiltWith’s standard interface to store a Volanea secret key for an outbound email API action.
A small relay closes that gap:
- A scheduler invokes your relay at a defined interval.
- The relay calls BuiltWith’s Change API for one or more monitored domains.
- The relay validates the response and filters events according to your rules.
- The relay derives a stable idempotency key for each logical alert.
- The relay calls Volanea’s
POST /v1/sendendpoint with an internal recipient, a verified sender, and an HTML-plus-text message. - The relay stores its checkpoint and processed-event state only after the relevant work succeeds.
Volanea’s single-message endpoint accepts one recipient or up to 50 recipients, uses a secret key with Bearer authentication, and supports the Idempotency-Key header for retry-safe requests. (volanea.com)
The recommended trigger: a scheduled Change API poll
A scheduled poll is the recommended trigger when you are monitoring a finite set of domains. It is straightforward to test: provide a domain, inspect the JSON, and decide what event should lead to an alert.
Use a job interval that matches the business value of the information rather than one that merely feels real time. For account intelligence, hourly or daily evaluation is usually more useful than a tight loop. A smaller number of well-triaged alerts also protects the reputation of the internal notification channel: an alert mailbox that receives every low-value implementation detail becomes an inbox everyone ignores.
The Change API accepts a SINCE parameter, including a natural-language window such as last month or a date. For production automation, store the timestamp of your last successful evaluation and request a bounded, overlapping interval. The overlap protects you from a failed run; idempotency protects you from the overlap producing the same alert twice. (api.builtwith.com)
An alternative: BuiltWith live data feeds
BuiltWith’s live data feeds are useful when your plan includes them and you need a continuously connected data consumer. A WSS client belongs in a long-running worker or a managed stream consumer, not in browser JavaScript and not in a client-side automation snippet. (kb.builtwith.com)
Do not assume a live feed is an HTTP webhook. A WebSocket client connects outward from your infrastructure to BuiltWith, receives feed messages, and then invokes your own processing logic. Since the exact feed contract and subscription configuration should come from the credentials and documentation for your BuiltWith account, keep parsing isolated in one adapter module. The Volanea send layer can remain exactly the same as the polling example below.
The real BuiltWith payload to map
For this guide, the source payload is the documented JSON response from BuiltWith’s Change API. BuiltWith returns a top-level Results array, with one entry per domain lookup. Each result contains Lookup and Changes; Changes contains the change-window timestamps, a summary, and an events array. (api.builtwith.com)
A representative response shape is:
{
"Results": [
{
"Lookup": "example.com",
"Changes": {
"since_utc": "2026-04-08T00:00:00Z",
"last_checked_utc": "2026-05-08T00:00:00Z",
"summary": "example.com added HubSpot and removed Marketo.",
"events": [
{
"type": "technology_added",
"technology": "HubSpot",
"category": ["Marketing Automation"],
"tag": "analytics",
"first_seen_utc": "2026-05-02T00:00:00Z",
"importance": "high",
"why_this_matters": "Marketing automation adoption can indicate active investment in lead capture, nurturing and customer lifecycle programs."
}
]
}
}
]
}
The example above follows BuiltWith’s documented field names. Removed technologies use the same event structure but provide last_seen_utc rather than first_seen_utc. (api.builtwith.com)
The safest mapping is from one BuiltWith event to one internal email. That produces a clear audit trail: a recipient can see exactly which domain and technology change caused the notification, and your system can attach one stable idempotency key to that alert.
| BuiltWith field | Volanea use | Why it matters |
|---|---|---|
Lookup | Subject, message body, idempotency input | Identifies the monitored root domain. |
Changes.summary | Message overview | Gives the recipient useful context before the event details. |
events.type | Subject and body | Distinguishes an addition from a removal. |
events.technology | Subject and body | Names the technology that changed. |
events.category | Body | Adds readable classification without relying on a guessed taxonomy. |
events.importance | Routing/filtering and body | Lets your relay reserve email for medium or high-priority changes. |
events.first_seen_utc / last_seen_utc | Body and idempotency input | Anchors the event in time. |
events.why_this_matters | Body | Preserves BuiltWith’s supplied business context while clearly identifying it as a signal. |
Build the polling relay
The following Node.js example is intentionally small, but it is a real server-side pattern rather than pseudocode. It calls BuiltWith’s Change API, maps each qualifying event into a Volanea send request, and uses a deterministic idempotency key.
It assumes these environment variables exist only in the server or serverless runtime:
BUILTWITH_API_KEYVOLANEA_API_KEYVOLANEA_FROMALERT_TOMONITORED_DOMAINS
MONITORED_DOMAINS is a comma-separated list such as example.com,example.org. The sender domain in VOLANEA_FROM must be verified before sending. Volanea’s documentation describes the base API URL as https://api.volanea.com, the machine-readable specification at GET /v1/openapi.json, and the send endpoint as POST /v1/send. (volanea.com)
// builtwith-volanea-alerts.mjs
import crypto from "node:crypto";
const BUILTWITH_API_KEY = process.env.BUILTWITH_API_KEY;
const VOLANEA_API_KEY = process.env.VOLANEA_API_KEY;
const VOLANEA_FROM = process.env.VOLANEA_FROM; // alerts@notify.yourdomain.com
const ALERT_TO = process.env.ALERT_TO; // revops@yourcompany.com
const MONITORED_DOMAINS = (process.env.MONITORED_DOMAINS || "")
.split(",")
.map((domain) => domain.trim())
.filter(Boolean);
if (!BUILTWITH_API_KEY || !VOLANEA_API_KEY || !VOLANEA_FROM || !ALERT_TO) {
throw new Error("Missing required server-side environment variables.");
}
function escapeHtml(value = "") {
return String(value)
.replaceAll("&", "&")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll('"', """)
.replaceAll("'", "'");
}
function eventTimestamp(event) {
return event.first_seen_utc || event.last_seen_utc || "unknown-time";
}
function idempotencyKey(domain, event) {
const material = [
"builtwith-change-alert-v1",
domain,
event.type,
event.technology,
eventTimestamp(event)
].join("|");
return crypto.createHash("sha256").update(material).digest("hex");
}
async function getBuiltWithChanges(domain) {
const url = new URL("https://api.builtwith.com/change1/api.json");
url.searchParams.set("KEY", BUILTWITH_API_KEY);
url.searchParams.set("LOOKUP", domain);
url.searchParams.set("SINCE", "last 2 days");
const response = await fetch(url, {
headers: { Accept: "application/json" }
});
if (!response.ok) {
throw new Error(`BuiltWith lookup failed for ${domain}: ${response.status}`);
}
return response.json();
}
function makeVolaneaMessage(result, event) {
const domain = result.Lookup;
const changes = result.Changes || {};
const categories = Array.isArray(event.category)
? event.category.join(", ")
: "Unclassified";
const observedAt = eventTimestamp(event);
const action = event.type === "technology_removed" ? "removed" : "added";
const subject = `[BuiltWith] ${domain} ${action} ${event.technology}`;
// This is the explicit BuiltWith → Volanea field mapping.
return {
from: VOLANEA_FROM,
to: [ALERT_TO],
subject,
html: `
<h2>Technology change detected</h2>
<p><strong>Domain:</strong> ${escapeHtml(domain)}</p>
<p><strong>Change:</strong> ${escapeHtml(event.type)}</p>
<p><strong>Technology:</strong> ${escapeHtml(event.technology)}</p>
<p><strong>Category:</strong> ${escapeHtml(categories)}</p>
<p><strong>Importance:</strong> ${escapeHtml(event.importance || "unspecified")}</p>
<p><strong>Observed:</strong> ${escapeHtml(observedAt)}</p>
<p><strong>BuiltWith summary:</strong> ${escapeHtml(changes.summary || "No summary provided.")}</p>
<p><strong>Why this may matter:</strong> ${escapeHtml(event.why_this_matters || "No explanation provided.")}</p>
`,
text: [
"Technology change detected",
`Domain: ${domain}`,
`Change: ${event.type}`,
`Technology: ${event.technology}`,
`Category: ${categories}`,
`Importance: ${event.importance || "unspecified"}`,
`Observed: ${observedAt}`,
`BuiltWith summary: ${changes.summary || "No summary provided."}`,
`Why this may matter: ${event.why_this_matters || "No explanation provided."}`
].join("\n")
};
}
async function sendWithVolanea(message, key) {
const response = await fetch("https://api.volanea.com/v1/send", {
method: "POST",
headers: {
Authorization: `Bearer ${VOLANEA_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": key
},
body: JSON.stringify(message)
});
const body = await response.json().catch(() => ({}));
if (!response.ok) {
throw new Error(`Volanea send failed: ${response.status} ${JSON.stringify(body)}`);
}
return body;
}
for (const domain of MONITORED_DOMAINS) {
const payload = await getBuiltWithChanges(domain);
for (const result of payload.Results || []) {
for (const event of result.Changes?.events || []) {
// Example policy: notify only for medium/high changes.
if (!['medium', 'high'].includes(event.importance)) continue;
const message = makeVolaneaMessage(result, event);
const key = idempotencyKey(result.Lookup, event);
const sent = await sendWithVolanea(message, key);
console.log("Alert accepted", {
domain: result.Lookup,
technology: event.technology,
type: event.type,
idempotencyKey: key,
result: sent
});
}
}
}
The code sends both html and text. That is a strong default for alert mail because recipients can still read the notification when HTML is unavailable or disabled. Volanea’s sending guidance describes a message body with a From address, recipient array, subject, HTML body, and text fallback. (volanea.com)
Configure secrets and authentication correctly
There are two separate credentials in this design, and they serve different systems.
BuiltWith API key
The BuiltWith key authenticates your data lookup. BuiltWith documents passing its API key in the request as the KEY parameter for Change API calls. (api.builtwith.com)
Put BUILTWITH_API_KEY in your deployment platform’s encrypted environment-variable or secret-management facility. Never commit it to source control, expose it in browser code, or append it to a link that could be copied into logs, analytics, tickets, or chat messages.
Volanea API key
The Volanea key authenticates the actual email send. Store VOLANEA_API_KEY in the same server-side secret store, then inject it into the outgoing request as Authorization: Bearer ….
There is no “BuiltWith-side Volanea API key field” because BuiltWith does not provide a general outbound REST action for this flow. The key belongs in the middleware’s secret configuration — for example, a serverless-function secret, encrypted worker variable, or managed secret vault — and nowhere client-visible.
Do not place the Volanea key in:
- Front-end JavaScript, static site configuration, or a public repository.
- A browser extension setting that users can inspect.
- A query parameter, including a URL used in a BuiltWith report note or exported spreadsheet.
- An email template or a prompt passed to an automation tool.
- A dashboard field whose value is rendered back to non-administrator users.
A leaked sending key is not merely a configuration issue. It can be used to send mail from your account, consume credits, trigger complaint risk, and complicate incident investigation. Use separate keys for development and production where available, limit access to the production secret, rotate a suspected exposed key immediately, and examine send activity before resuming the workflow.
Choose an alert policy before you send
The simplest relay sends an email for every event. That is usually the wrong production policy. A better system turns raw technology observations into alerts with a clear operational purpose.
Start by answering these questions:
- Who is the intended recipient? Internal account owners, customer-success managers, security analysts, or a customer who explicitly requested a monitored-domain report are defensible audiences. Unsolicited recipients are not.
- Which event types matter? You may care about
technology_added,technology_removed, or only one of them. - What qualifies as important? The Change API supplies
importance; use it as one input, not as a substitute for your own business rules. - What is the cooldown? If several related changes appear for one domain, should your team receive one digest rather than several messages?
- What action should a recipient take? A notification should say enough to support a next step, such as reviewing an account, checking a renewal risk, or updating a research record.
Per-event email versus digest email
Per-event email is best when a specific high-priority change requires quick human review. It supports a simple idempotency key and a precise audit record.
A digest is better when you monitor many domains and signals are informational. Instead of immediately sending each event, write events to a database or queue and send one daily summary per account owner. The Volanea send API can send individual transactional notifications, while reusable content can also be managed with stored templates when a fixed alert layout makes maintenance easier. (volanea.com)
Do not use a digest to hide a broken alert rule. First reduce irrelevant signals; then decide whether aggregation adds value.
Verify the sending domain
Use an address on a domain you control, such as alerts@notify.example.com, and verify that sending domain in Volanea before enabling the scheduler. A send endpoint accepting a request does not guarantee inbox delivery: recipient suppression, unsubscribes, provider handling, and downstream mailbox policy remain separate stages.
For a production walkthrough of authentication, templates, send behavior, and endpoint details, keep the email API reference and setup guides alongside the relay code. The implementation team should also agree who owns DNS records, monitoring, key rotation, and delivery-event handling before the alert becomes business-critical.
When this breaks
This hop has failure modes that are easy to miss because it combines an external data API, your scheduler, your database or state store, and an email API. Design for them before the first production run.
A retry produces a duplicate email
BuiltWith’s Change API is a pull API in this architecture; it is not retrying an outbound webhook to Volanea. However, duplicates can still happen when your scheduler retries a timed-out job, when a worker crashes after sending but before saving state, or when your SINCE windows intentionally overlap.
The solution is the deterministic Idempotency-Key shown in the example. Volanea documents that a repeated idempotency key replays the stored response instead of creating another send, making retry behavior safe for the same logical message. (volanea.com)
Make the key identify the business event, not the execution attempt. Good inputs include the root domain, event type, technology name, and BuiltWith’s observed timestamp. Do not generate a random UUID per retry: that tells Volanea every retry is a new send.
BuiltWith is slow, unavailable, or rate-limited
A scheduled job should have separate timeouts for the BuiltWith lookup and Volanea send. If BuiltWith does not respond before your scheduler’s hard deadline, fail the job before it attempts email. Let the next run retry the lookup using an overlapping time window.
Avoid advancing your durable “last processed” checkpoint before processing completes. Otherwise, a transient failure can create a blind spot where a change was observed by BuiltWith but never evaluated by your relay.
For multi-domain monitoring, process domains independently or in small bounded groups. One failed lookup should not prevent alerts for every other domain. Record the domain, status code, request duration, and an error category — but redact credentials from logs.
Volanea times out after accepting the message
A network timeout after POST /v1/send is ambiguous: Volanea may have accepted the request even though your relay did not receive the response. Retrying with the same idempotency key is the correct response. Retrying with a new key risks duplicate mail.
Treat a successful API acceptance as exactly that: acceptance into the sending pipeline. If your workflow needs delivery, bounce, complaint, or suppression outcomes, process Volanea delivery events separately rather than assuming an HTTP 2xx means the recipient saw the message.
Expected fields are missing or have an unexpected type
Not every result necessarily has every optional field you would like to put in an email. The documented change-event fields distinguish additions from removals: an addition can have first_seen_utc, while a removal can have last_seen_utc. Your formatter must handle either value. (api.builtwith.com)
Use defensive defaults as the example does. If category is absent or not an array, render “Unclassified.” If why_this_matters is absent, do not invent an explanation. If Results or Changes.events is missing, log the schema anomaly and skip sending rather than constructing a misleading alert.
Payload availability is also plan and product dependent. BuiltWith documents live feeds as available on Basic, Pro, or Team plans, while the exact API features and credits depend on your account. Validate the response from the plan you actually purchased before making a downstream schema promise. (kb.builtwith.com)
A malformed field becomes unsafe HTML
BuiltWith fields are external data. Escape them before interpolating into HTML, as the escapeHtml function does. This protects the content of your internal notifications from malformed markup and prevents a technology name or generated explanation from unexpectedly changing the email layout.
Keep a text alternative too. It improves accessibility and gives you a clear canonical version of the alert for log comparison and incident reviews.
Testing the integration without creating alert noise
Before scheduling production sends, test the data and email components independently.
First, run the BuiltWith lookup for one non-sensitive domain and save a redacted sample response. Confirm the response includes the Results and Changes.events structure your parser expects. Then use a non-production Volanea key and a verified test sender where possible.
A useful test sequence is:
- Run the relay with
ALERT_TOset to a test mailbox you control. - Temporarily remove the importance filter or use a recorded fixture so the mapping function is exercised.
- Confirm the subject includes the domain, action, and technology.
- Confirm the text and HTML views show the same substantive information.
- Run the exact same event twice and verify that the idempotency key prevents a second email.
- Simulate a Volanea timeout after request submission, then retry with the identical key.
- Test a removed-technology event with
last_seen_utcand an event lackingwhy_this_matters. - Enable scheduling only after your logs, alert routing, and state persistence are working.
For a long-lived system, write automated tests around makeVolaneaMessage() and idempotencyKey(). These tests are more valuable than end-to-end tests alone because they guard the business semantics of the integration when someone later changes a template or adds a new event filter.
Operational improvements for larger monitoring programs
As the number of monitored domains grows, do not simply run more individual cron jobs. Build a small, observable pipeline.
Store a record for each processed event with the domain, event fingerprint, raw payload hash, send idempotency key, Volanea response identifier if returned, and final processing status. This makes it possible to answer practical questions: Did we send an alert? Which BuiltWith event caused it? Was it intentionally skipped? Did a retry reuse the same key?
Add a dead-letter path for events that consistently fail validation or send attempts. A dead-letter record should include enough redacted context for an operator to repair the mapping, but never include your Volanea or BuiltWith keys.
If your organization needs different messages for different teams, keep routing in configuration rather than branching arbitrary email addresses from the external payload. For example, a domain can belong to an account owner in your internal database; the relay looks up that owner and sends a defined alert. This keeps contact data under your control and makes changes to staffing or access immediate.
Finally, measure usefulness. Track how many alerts were sent, acknowledged, acted upon, muted, or marked irrelevant. Those outcomes should feed back into your importance thresholds and technology filters. The goal is not maximum alert volume; it is timely, credible signal.
A direct HTTP workflow is not the BuiltWith pattern
Some SaaS products have native “record created → webhook action” automation. BuiltWith is not documented as that kind of workflow product. It is a technology-data platform with APIs, live feeds, exports, and selected integrations.
That means a generic middleware service — your own serverless function, worker, or integration platform that can safely call APIs on a schedule — is not an awkward workaround. It is the correct boundary for this use case.
If you prefer an automation service, use it only where it can actually perform the required work: securely call the BuiltWith API, parse its response, retain a durable cursor or deduplication record, and make an authenticated outbound request to Volanea. A simple one-step “webhook to email API” automation is insufficient because it has no BuiltWith event to receive and no robust protection against overlapping polls or retries.
For teams comparing operational tradeoffs such as API limits, sending volume, and account tiers, review transactional email pricing before selecting the cadence and alert volume for production.
Conclusion
To send email from BuiltWith with Volanea, do not look for a native BuiltWith app or an outbound-webhook setting that does not exist. Use the documented BuiltWith Change API as the source of technology-change data, process it in a server-side relay, and send the resulting internal alert through Volanea’s authenticated POST /v1/send endpoint.
The durable version of this workflow has four properties: secrets stay server-side, source fields are explicitly mapped, sends use deterministic idempotency keys, and failures are logged without silently moving the checkpoint forward. With those controls in place, BuiltWith technology signals can become useful, readable alerts rather than a brittle stream of duplicate notifications.
FAQ
Does BuiltWith have a native Volanea integration?
No. BuiltWith does not provide a native Volanea app, marketplace plugin, or documented generic outbound HTTP action for sending directly to Volanea. Use a server-side relay that reads BuiltWith API data and calls Volanea.
What BuiltWith event triggers the email?
In the recommended implementation, a scheduled middleware job calls the BuiltWith Change API. An email is triggered when a returned Changes.events item passes your filtering rules, such as a high-importance technology_added or technology_removed event.
Where should the Volanea API key be stored?
Store it only in the middleware’s server-side secret manager or encrypted environment configuration. There is no BuiltWith-side API-key field for this flow, and the key must never appear in client-side code, public configuration, or URLs.
How do I stop duplicate alerts after a retry?
Create a deterministic Idempotency-Key from stable BuiltWith event fields, such as the domain, event type, technology name, and first-seen or last-seen timestamp. Reuse that same key whenever the same logical event is retried.
Can I email a prospect when BuiltWith detects a technology change?
Technology detection is not email consent. Use this workflow for internal alerts or recipients who have an appropriate relationship and permission basis. If a signal suggests outreach, route it to a human workflow and apply your organization’s compliance and consent policies before sending anything promotional.