Send email from Sendwithus with Volanea by treating Sendwithus as the template layer and Volanea as the delivery layer. Because there is no native Volanea app, marketplace listing, or generic Sendwithus-to-Volanea outbound HTTP connection to install, the dependable approach is a server-side adapter that renders a Sendwithus template and then makes a Volanea REST API request.
What this integration does—and does not do
Sendwithus is built around reusable email templates and an API-driven sending workflow. Your application identifies a Sendwithus template, supplies recipient and template data, and Sendwithus either renders that content or sends it through an email service provider configured in Sendwithus.
Volanea is the delivery provider in this architecture. The adapter receives the business event in your application, asks Sendwithus to render the appropriate template, and submits the completed subject and content to Volanea. Volanea then owns the SMTP/API delivery attempt, provider response, bounce handling, and deliverability-side operations associated with that message.
This distinction matters because there is not a button in Sendwithus where you can paste a Volanea API endpoint and have every template automatically POST to it. Do not look for a Volanea installation in a Sendwithus marketplace, and do not expose a Volanea token in template data in an attempt to create one. Neither pattern is a safe integration.
The useful mental model is:
- A business event occurs in your backend, such as
order.paid,password.reset_requested, ortrial.ending. - Your backend selects a Sendwithus template by its
email_idand sends its merge data to Sendwithus's render endpoint. - Sendwithus returns rendered email content.
- Your backend maps that content to a Volanea email request.
- Volanea accepts, rejects, or queues the message, and your backend records the result.
That is still a Sendwithus-plus-Volanea integration. It is simply an API composition rather than a native connector.
The real Sendwithus trigger for this workflow
There is no Sendwithus-side record-created trigger, stage-changed trigger, form-submitted trigger, or generic outbound webhook action that can start a Volanea REST send. In the public Sendwithus API model, the initiating operation is an API request from your application: a render request or a send request for a template identified by email_id.
For a Volanea delivery architecture, use the render request as the Sendwithus operation that starts the email pipeline. Your own application event is the real business trigger. For example, when your checkout service records an order as paid, it calls sendReceiptEmail(order). That function calls Sendwithus to render the receipt template and then calls Volanea to deliver it.
This is preferable to attempting to use a post-send event webhook. A post-send webhook, where available for delivery events, is observability after Sendwithus has already attempted delivery through its configured provider. It is not a replacement for an email provider integration and cannot safely turn a completed send event into the first Volanea send.
Choose one system to make the delivery decision
Avoid running both paths for the same message:
- Do not call Sendwithus's send endpoint and then send the rendered result through Volanea.
- Do not configure one provider in Sendwithus as a fallback while your adapter sends every message through Volanea unless you have deliberately designed and tested that failover behavior.
- Do not use a delivery webhook as a command to resend a message through Volanea.
Each of those designs can create duplicate transactional mail. For password resets, invoices, confirmations, and verification links, duplicates are more than an aesthetic problem: they confuse recipients and can invalidate assumptions in support, fraud, and audit workflows.
Architecture: render in Sendwithus, deliver through Volanea
A production adapter can be a route in an existing application, a serverless function, a queue consumer, or a small internal email service. The essential requirement is that it runs in a trusted server environment.
A typical request path looks like this:
application event
-> email job with idempotency key
-> Sendwithus render API
-> normalized rendered email
-> Volanea REST API
-> delivery response stored with job
The queue is not mandatory for a low-volume prototype, but it is strongly recommended for transactional systems. It separates a user-facing request from slower external calls, lets you retry a transient provider failure deliberately, and gives operations staff a durable record of the intent to send.
Keep template selection in code, not in browser input
Your application should own a small template map. A caller can request a semantic event such as receipt, but it should not be able to submit an arbitrary Sendwithus email_id from a public browser form. That prevents an attacker from choosing internal templates or sending unintended mail.
For example:
const TEMPLATES = {
receipt: process.env.SWU_RECEIPT_EMAIL_ID,
resetPassword: process.env.SWU_RESET_EMAIL_ID,
trialEnding: process.env.SWU_TRIAL_ENDING_EMAIL_ID
};
Keep the Sendwithus template identifiers in server configuration or in a versioned application configuration file. Template data should be validated per event before it reaches Sendwithus. A receipt template may need an order number, line items, currency, and total; a reset email may need only a recipient name and a short-lived URL.
The Sendwithus render payload and field mapping
Sendwithus identifies an email template with email_id. The render request supplies that ID and an email_data object containing the values used by the template. A representative Sendwithus render request has this shape:
{
"email_id": "YOUR_SENDWITHUS_TEMPLATE_ID",
"email_data": {
"customer_name": "Avery Chen",
"order_number": "ORD-10428",
"order_total": "$49.00",
"receipt_url": "https://app.example.com/orders/ORD-10428"
}
}
The fields inside email_data are not universal Sendwithus fields. They are your template variables. The names must exactly match the variables used in the selected Sendwithus template. If the template uses {{ customer_name }}, send customer_name; if it uses a nested object such as {{ order.number }}, send the corresponding object structure.
The adapter needs to map the rendered response into delivery fields Volanea can accept:
| Email concern | Sendwithus source | Volanea request field |
|---|---|---|
| Recipient address | Your application/customer record | to |
| Recipient display name | Your application/customer record | to.name when used |
| Subject | Rendered Sendwithus subject | subject |
| HTML body | Rendered Sendwithus HTML | html |
| Plain-text body | Rendered Sendwithus text, if available | text |
| Sender address | Server-side sender policy | from |
| Event classification | Your application event name | tags or metadata |
Notice that recipient and sender identity are not template variables in this example. Recipient identity comes from your authoritative application data, while the sender comes from a controlled server-side policy. That makes it much harder for an untrusted caller to change who receives mail or forge a From address.
Working server-side adapter example
The following Node.js example shows the complete two-call flow. It uses a Sendwithus API key in the X-SWU-API-KEY header, renders the template, and sends the resulting subject and bodies to Volanea. Store endpoint URLs, sender identities, and credentials in server environment variables so they can be adjusted to match your account configuration and the current API reference.
import crypto from "node:crypto";
const SENDWITHUS_RENDER_URL = "https://api.sendwithus.com/api/v1/render";
const VOLANEA_EMAILS_URL = process.env.VOLANEA_EMAILS_URL;
export async function sendOrderReceipt(order) {
const messageKey = `receipt:${order.id}`;
// 1. Sendwithus payload: email_id chooses the template;
// email_data supplies variables used by that template.
const swuPayload = {
email_id: process.env.SWU_RECEIPT_EMAIL_ID,
email_data: {
customer_name: order.customer.name,
order_number: order.number,
order_total: new Intl.NumberFormat("en-US", {
style: "currency",
currency: order.currency
}).format(order.total / 100),
receipt_url: `https://app.example.com/orders/${encodeURIComponent(order.id)}`
}
};
const renderResponse = await fetch(SENDWITHUS_RENDER_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-SWU-API-KEY": process.env.SENDWITHUS_API_KEY
},
body: JSON.stringify(swuPayload)
});
if (!renderResponse.ok) {
throw new Error(`Sendwithus render failed: ${renderResponse.status}`);
}
const rendered = await renderResponse.json();
// 2. Field mapping: rendered Sendwithus content becomes Volanea content.
const volaneaPayload = {
from: {
email: process.env.TRANSACTIONAL_FROM_EMAIL,
name: "Example Store"
},
to: [{
email: order.customer.email,
name: order.customer.name
}],
subject: rendered.subject,
html: rendered.html,
text: rendered.text || stripHtml(rendered.html),
tags: ["receipt", "transactional"],
metadata: {
order_id: order.id,
sendwithus_email_id: swuPayload.email_id,
message_key: messageKey
}
};
const emailResponse = await fetch(VOLANEA_EMAILS_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.VOLANEA_API_KEY}`,
"Idempotency-Key": crypto.createHash("sha256").update(messageKey).digest("hex")
},
body: JSON.stringify(volaneaPayload)
});
const responseBody = await emailResponse.text();
if (!emailResponse.ok) {
throw new Error(`Volanea send failed: ${emailResponse.status} ${responseBody}`);
}
return JSON.parse(responseBody);
}
function stripHtml(html = "") {
return html.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim();
}
Before deploying, compare the Volanea endpoint, authentication header, recipient structure, idempotency support, and metadata fields against the current email API reference and setup guides. API contracts can evolve, and copying a request shape from another provider is a common source of failures.
Validate the response before delivery
A robust adapter does not blindly assume every render response is usable. Check that:
rendered.subjectis a non-empty string.- At least one body representation exists, ideally both HTML and text.
- The recipient address has passed your application validation.
- The requested From address belongs to a verified sending domain in Volanea.
- Required template variables were supplied and did not leave visible placeholders in the body.
For high-value sends, render a preview in a non-production environment using realistic edge cases: names with apostrophes, long company names, missing optional fields, non-ASCII text, a zero-value discount, and a large item list. A template that renders cleanly for Jane Doe can still produce broken markup for real customer data.
Authentication and secret handling
There are two secrets in this integration: the Sendwithus API key and the Volanea API key. Both belong exclusively on the server side. Place them in your deployment platform's encrypted environment-variable or secret-management system, not in JavaScript sent to browsers, not in a mobile app bundle, not in a public repository, and not in Sendwithus template data.
The Volanea API key lives in the adapter's server-side secret store as VOLANEA_API_KEY. The adapter adds it to the Volanea API request only when it is ready to send. Sendwithus does not need that key, because Sendwithus is not making the Volanea request in this design.
This is important for two reasons. First, a client-visible API key can be extracted and used to send mail from your account. Second, template content is designed to be rendered, previewed, copied, and delivered; it is the wrong place for a credential even if a template system offers hidden-looking variables.
Use separate keys for development, staging, and production where possible. Scope keys to the minimum capability offered by the provider, rotate them through a documented runbook, and redact authorization headers from logs. Logging a complete fetch error object without care can leak credentials in request configuration.
Sender identity, domains, and deliverability
A successful API response is not the same as a successful inbox placement. Before routing production Sendwithus-rendered email through Volanea, configure and verify the sending domain in Volanea. Use a From address on that authenticated domain and align the sender identity with the purpose of the message.
For example, receipts@example.com is a reasonable transactional sender for purchase receipts, while news@example.com may suit an opted-in campaign stream. Do not mix promotional copy into a password reset template merely because both use the same API path. Different mail types have different recipient expectations, complaint rates, and compliance requirements.
The adapter should also preserve a plain-text alternative. Sendwithus templates may be HTML-forward, but recipients, clients, security gateways, and accessibility workflows benefit from a meaningful text part. A crude HTML stripper is acceptable only as a fallback; write and review an intentional text version for important templates.
Use tags or metadata to identify the template and message purpose in Volanea. That makes it easier to investigate an increase in bounces, complaints, or provider rejections without parsing rendered content. Do not put passwords, reset tokens, full payment data, or personally sensitive fields into tags and metadata, because those fields may appear in operational systems and logs.
When this breaks
Every external hop can fail differently. The Sendwithus render hop can fail because of authentication, a missing template, a malformed request, rate limiting, or a template variable problem. The Volanea delivery hop can fail because the request is invalid, the sender domain is not ready, the provider is temporarily unavailable, or a recipient address is rejected.
Retries can create duplicate sends
The most dangerous failure is ambiguity. Your adapter may submit a Volanea request, lose the network response, and not know whether Volanea accepted it. Retrying without an idempotency strategy can send two receipts.
Create a stable message key from the event type and immutable business identifier, such as receipt:order_123. Persist the key and the send state before calling either external API. If Volanea supports an idempotency header, send that same value on every retry. If it does not, enforce deduplication in your job table: only one worker may transition a message key from pending to submitted.
Do not assume retries by any middleware platform are exactly-once. Zapier, Make, queues, serverless platforms, reverse proxies, and your own HTTP client may retry after a timeout. A timeout means only that the caller did not receive a response; it does not prove the receiving service did not process the request.
Webhook timeouts are the wrong delivery mechanism
If you use a workflow product elsewhere in your stack, keep its webhook endpoint fast. It should validate and enqueue a job, then return a 2xx response. Do not make it wait for Sendwithus rendering, Volanea acceptance, analytics writes, and unrelated database work in one synchronous webhook request.
A slow endpoint can be retried by the sender, creating the duplicate-send risk above. It can also make a customer-facing action feel unreliable. Queue-based processing gives you clearer retry boundaries: render retries can be separated from delivery retries, and a permanent template error does not need to be retried like a temporary network error.
Missing payload fields are an application concern
In this architecture, the Sendwithus email_data object comes from your application. Some events may not have every optional field. An order may have no customer name, an invoice may have no company name, or an integration source may omit a locale. Handle those cases before rendering rather than allowing a message with undefined or an unresolved merge variable to reach a customer.
Define a schema per template. Require fields that are essential to the message, supply explicit defaults for optional fields, and test each template whenever its variable contract changes. If your organization uses Sendwithus features that vary by subscription or account configuration, verify that the API capability you depend on is available in the target account before designing production automation around it.
Separate permanent failures from temporary ones
Retrying a bad request repeatedly does not fix it. A practical classification is:
- Retry temporary network errors, timeouts, and provider 5xx responses with exponential backoff and a cap.
- Do not automatically retry authentication failures, unknown template IDs, malformed JSON, or an unverified sender domain.
- Treat recipient-level rejection as a data-quality or suppression issue, not an infrastructure outage.
- Alert on repeated render failures separately from repeated Volanea delivery failures.
Store sanitized provider status, response identifiers, template ID, event type, and message key. Those details let an operator answer whether a message rendered, whether it was handed to Volanea, and whether a retry is safe.
Testing the integration before production
Start with a non-production Sendwithus template and a test recipient mailbox that your team controls. Use a production-like verified sender only when your domain configuration is ready. Do not test with customer addresses or copied production recipient lists.
Test at least these cases:
- A normal render with every required variable populated.
- A render where an optional variable is absent and a default should appear.
- A non-ASCII recipient name and localized template values.
- A Volanea request rejected because of a deliberately invalid test address.
- A simulated timeout after the send request to confirm idempotency prevents a duplicate.
- A Sendwithus template change that adds a new required merge variable.
Capture a rendered fixture in tests so template revisions can be reviewed like code changes. Snapshot tests are particularly useful for transactional templates because they reveal accidental subject changes, missing URLs, raw template tags, and HTML regressions before a release.
Alternatives and when to use them
If your application already has a backend, the adapter pattern is the cleanest option. It provides direct control of secrets, idempotency, observability, recipient policy, and error handling. It also avoids adding a third-party automation platform to a critical transactional path.
A no-code or low-code workflow tool can still be useful for internal notifications or low-risk operational messages. In that case, use it as middleware: a trusted system triggers the workflow, an HTTP step calls a small server-side endpoint you own, and that endpoint performs the Sendwithus render plus Volanea send. Do not place the Volanea key in a browser-accessible form or in an unprotected client-side workflow configuration.
For high-volume campaign operations, consider whether a render-per-recipient request is appropriate for your throughput and template strategy. Batch behavior, personalization volume, suppression handling, and tracking requirements may justify a dedicated campaign pipeline. For transactional email, the render-then-send pattern is usually easier to reason about because each business event has a clear message key and audit trail.
Operational checklist
Before enabling production traffic, confirm the following:
- The Sendwithus template ID is stored server-side and points to the approved template version.
- Every template has documented required and optional
email_datafields. - Sendwithus and Volanea keys are stored in a server-side secret manager.
- The Volanea sending domain and From address are verified.
- The adapter has a durable idempotency key for every business event.
- Timeouts, retries, and permanent errors are classified separately.
- Logs exclude authorization headers and sensitive template data.
- Monitoring can distinguish render failures from delivery failures.
- A test mailbox has received and reviewed HTML and plain-text versions.
This checklist may feel more involved than connecting two SaaS products with a single toggle. The tradeoff is control: you can change a Sendwithus template without changing delivery code, change Volanea delivery configuration without rewriting templates, and trace every message from application event to provider response.
Conclusion
To send email from Sendwithus with Volanea, do not search for a native plugin that does not exist. Start with an application event, use Sendwithus's email_id and email_data to render the approved template, and send the rendered subject and bodies from a secure server-side adapter through Volanea.
That division of responsibilities is practical and durable. Sendwithus remains the source of template content; Volanea remains the sending infrastructure; and your adapter provides the policy, secret protection, idempotency, and operational visibility needed between them.
FAQ
Can Sendwithus directly POST a rendered email to Volanea?
Not through a native Volanea connector or a generic Sendwithus outbound HTTP action. Use a server-side adapter that calls the Sendwithus render API and then calls Volanea's email API.
What is the Sendwithus trigger in this setup?
The initiating Sendwithus operation is your application's render request for a template email_id. The underlying business event—such as an order becoming paid—is triggered in your application, not by a Sendwithus record or stage event.
Where should the Volanea API key be stored?
Keep it in the server-side adapter's encrypted environment variables or secret manager. Never place it in Sendwithus template data, frontend code, mobile applications, or publicly readable workflow configuration.
How do I prevent duplicate emails after a timeout?
Generate one stable idempotency key per business event, persist it before sending, reuse it on retries, and ensure only one worker can submit that key. Treat an HTTP timeout as an unknown outcome, not proof that delivery failed.
Should I use Sendwithus's send endpoint as well as Volanea?
No, not for the same message. If Volanea is your delivery provider in this architecture, use Sendwithus to render content and Volanea to deliver it. Calling both send paths risks duplicate mail.