A Freshdesk email integration lets your support workflow trigger emails that are separate from Freshdesk’s standard ticket notifications: operational alerts, customer onboarding messages, escalation notices, renewal reminders, or messages sent through your own verified domain.
Volanea does not provide a native Freshdesk marketplace app or plugin. The reliable approach is to use Freshdesk’s built-in ticket automation webhook to call a small server-side endpoint, then have that endpoint call Volanea’s REST API. This keeps email credentials private, gives you control over duplicate protection, and makes failures observable.
What this integration does
This integration has three distinct jobs:
- Freshdesk decides when an email-worthy event occurred. For example, a ticket is created with a particular tag, category, priority, or custom-field value.
- Freshdesk sends a webhook to your middleware. The middleware receives a compact JSON payload that you define in the automation rule.
- Your middleware sends the email through Volanea. It validates the request, maps Freshdesk fields into an email, prevents duplicate sends, and uses the Volanea API key from a server-side environment variable.
The concrete Freshdesk trigger used in this guide is a Ticket creation automation rule. It runs when a new ticket is created and only sends an email when the ticket matches the conditions you set. A common example is a ticket with an external-email tag, an Urgent priority, or a custom field such as Send customer update = Yes.
That distinction matters. Freshdesk already sends ticket replies and standard notifications. This workflow is for messages that need a different sender identity, template, tracking policy, delivery stream, or application-level audit trail.
Why use Freshdesk automation instead of a native app
Freshdesk supports outbound HTTP calls through automation rules. Its Trigger Webhook action is intended for sending ticket information to an external system when a ticket is created or updated. It is a fire-and-forget action: Freshdesk makes the request, but does not need the API response to continue its own automation.
That makes it appropriate for notifying your middleware that a ticket needs an email. It is not a complete email-delivery system by itself. Freshdesk automation cannot safely take responsibility for all of the following:
- Storing and rotating an email-provider API secret.
- Rendering robust HTML email safely.
- Applying idempotency rules when the same ticket update is delivered more than once.
- Recording Volanea message IDs against a ticket or in your own database.
- Retrying a provider request according to your own delivery policy.
- Separating outbound email from internal support rules.
A middleware endpoint fills that gap. It can be a small Node.js service, a serverless function, a Cloudflare Worker, an API route in your application, or a workflow service that can safely store secrets and make authenticated HTTP calls.
Freshdesk’s webhook capability is available on eligible paid Freshdesk plans, including Growth, Pro, and Enterprise plans. Freshdesk documents Trigger API separately for workflows that need to use an API response in subsequent automation; this guide does not require it. A standard Trigger Webhook is enough because Freshdesk only needs to notify your sending service.
The recommended architecture
Use this request path:
Freshdesk Ticket creation automation
|
| POST JSON webhook
v
Your HTTPS middleware endpoint
|
| POST authenticated Volanea REST request
v
Volanea
|
v
Recipient inbox
The key design choice is that Freshdesk sends to your endpoint, not directly to Volanea.
Direct provider calls can look simpler, but they leave you with fewer controls. Freshdesk automation is a rules engine, not a secret-management or message-processing layer. A middleware endpoint lets you validate the incoming request, normalize optional values, choose a template, escape HTML, add an idempotency key, and log the resulting Volanea message ID.
A practical ticket-to-email example
Suppose your support team creates a ticket for an account that needs an implementation follow-up. An agent or intake form applies the implementation-follow-up tag. A Ticket creation automation rule detects that tag and posts ticket details to your middleware.
Your middleware then sends an email to the requester:
- To: the Freshdesk requester’s email address.
- From: an address on your verified sending domain.
- Subject: a clear follow-up subject based on the ticket.
- HTML: a short confirmation with the ticket ID and next steps.
- Idempotency key: a value derived from the Freshdesk ticket ID and workflow purpose.
This is much safer than using a generic “ticket was created” event for every request. A targeted condition limits unwanted email, reduces accidental loops, and gives support teams an explicit way to control which tickets enter the workflow.
Configure the Freshdesk Ticket creation automation rule
In Freshdesk, create an automation rule under the ticket automations area. Depending on your Freshdesk experience and account setup, the navigation can be presented under Admin, Workflows, and Automations. In Freshdesk Omni, ticket automations are available under the configuration and workflows area.
Create the rule from the Ticket creation tab. Do not use Ticket updates for the first version of this workflow unless an update is genuinely the event that should send the message.
Suggested rule configuration
Use a clear rule name, such as:
Send Volanea implementation follow-up for tagged tickets
Then configure conditions that make the action intentional. For example:
- In Tickets → If Tags → contains →
implementation-follow-up - In Tickets → If Requester Email → is not empty
- In Tickets → If Status → is not → Closed
The exact condition labels can vary with your Freshdesk plan and interface, but the goal remains the same: only trigger for tickets with a valid recipient and a deliberate workflow signal.
Under actions, choose Trigger Webhook and configure a POST request to your middleware endpoint, for example:
https://your-app.example.com/webhooks/freshdesk/volanea
Select JSON encoding and use the advanced/custom request-body option. Freshdesk’s webhook body is not a fixed universal event schema. Instead, you configure the JSON body and Freshdesk substitutes ticket placeholders when it delivers the request. That is useful because you should send only the fields your email workflow actually needs.
Freshdesk webhook payload template
Configure this as the JSON request body in the Trigger Webhook action:
{
"event": "ticket.created",
"workflow": "implementation-follow-up",
"ticket": {
"id": "{{ticket.id}}",
"subject": "{{ticket.subject}}",
"description": "{{ticket.description}}",
"status": "{{ticket.status}}",
"priority": "{{ticket.priority}}"
},
"requester": {
"email": "{{ticket.requester.email}}",
"name": "{{ticket.requester.name}}"
}
}
At delivery time, the middleware receives JSON shaped like this:
{
"event": "ticket.created",
"workflow": "implementation-follow-up",
"ticket": {
"id": "123456",
"subject": "Help with implementation timeline",
"description": "We need help planning the first rollout.",
"status": "2",
"priority": "3"
},
"requester": {
"email": "alex@example.com",
"name": "Alex Morgan"
}
}
Use Freshdesk’s payload preview before enabling the rule. Previewing matters because a field can be blank, a custom ticket field can be absent, or a requester may not have a usable email address. If you add custom ticket fields, test the exact placeholder syntax in your Freshdesk account rather than assuming that custom-field names map directly to JSON keys.
Keep the Volanea API key out of Freshdesk
The Volanea API key should not live in ticket fields, client-side JavaScript, a public frontend configuration file, or a Freshdesk custom field visible to agents or requesters.
For this integration, the Volanea key belongs in the middleware’s server-side secret store:
VOLANEA_API_KEY=your_private_api_key
VOLANEA_FROM_EMAIL=support@example.com
FRESHDESK_WEBHOOK_TOKEN=a-long-random-secret
The Freshdesk side should store only what it needs to authenticate to your middleware. If your Freshdesk webhook configuration provides authentication fields, use those to send a dedicated webhook credential to your endpoint. If your configuration cannot send the authentication scheme your endpoint expects, use a long random secret in an unguessable endpoint path or route the request through an integration layer that supports secure credentials.
Do not reuse a Freshdesk agent API key as the Volanea API key. They authenticate different systems and should be independently revocable. A separate inbound webhook token also lets you disable Freshdesk-to-middleware access without changing your outbound email credentials.
Why this is a security boundary
A Volanea key can authorize sending email. If exposed, an attacker could potentially send mail from your account, harm your sender reputation, consume sending capacity, or impersonate your approved sender identity.
A webhook receiver can validate a narrow-purpose token and reject everything else. It can also enforce rules Freshdesk cannot enforce on its own, such as:
- Only accepting the
implementation-follow-upworkflow. - Only sending to valid recipient addresses.
- Only accepting ticket IDs that match a safe format.
- Rejecting requests with missing event data.
- Rate-limiting unexpected bursts.
- Logging malformed or unauthorized requests without attempting an email send.
Middleware code: Freshdesk payload to Volanea REST email
The following Node.js example receives the JSON configured above, checks a webhook token, validates the fields, escapes customer-controlled content, and turns the Freshdesk ticket into a Volanea email request.
It assumes an Express application and server-side environment variables. The Volanea request uses the REST email endpoint and bearer token configured for your Volanea account. Confirm the current endpoint, authentication format, and available message fields in the Volanea API reference and setup guides before deploying, especially if your account uses a versioned endpoint or a different sending region.
import express from "express";
const app = express();
app.use(express.json({ limit: "256kb" }));
const {
FRESHDESK_WEBHOOK_TOKEN,
VOLANEA_API_KEY,
VOLANEA_FROM_EMAIL
} = process.env;
function escapeHtml(value = "") {
return String(value)
.replaceAll("&", "&")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll('"', """)
.replaceAll("'", "'");
}
function isEmail(value) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(value || ""));
}
app.post("/webhooks/freshdesk/volanea", async (req, res) => {
const suppliedToken = req.get("x-webhook-token");
if (!FRESHDESK_WEBHOOK_TOKEN || suppliedToken !== FRESHDESK_WEBHOOK_TOKEN) {
return res.status(401).json({ error: "Unauthorized webhook" });
}
const { event, workflow, ticket, requester } = req.body ?? {};
const ticketId = String(ticket?.id ?? "");
const recipient = String(requester?.email ?? "").trim();
if (event !== "ticket.created" || workflow !== "implementation-follow-up") {
return res.status(202).json({ ignored: true });
}
if (!/^\d+$/.test(ticketId) || !isEmail(recipient)) {
return res.status(422).json({ error: "Missing or invalid ticket data" });
}
// Store this key in Redis, Postgres, or another durable store before sending.
// If it already exists, return 200/202 without sending another message.
const idempotencyKey = `freshdesk:${workflow}:ticket:${ticketId}`;
const requesterName = escapeHtml(requester?.name || "there");
const subject = String(ticket?.subject || "Your support request");
const safeSubject = subject.replace(/[\r\n]/g, " ").slice(0, 180);
const safeDescription = escapeHtml(ticket?.description || "");
const emailPayload = {
from: VOLANEA_FROM_EMAIL,
to: [recipient],
subject: `We received your request: ${safeSubject}`,
html: `
<p>Hi ${requesterName},</p>
<p>We received your request and will follow up shortly.</p>
<p><strong>Ticket ID:</strong> ${ticketId}</p>
<p><strong>Subject:</strong> ${escapeHtml(safeSubject)}</p>
${safeDescription ? `<p><strong>Your message:</strong><br>${safeDescription}</p>` : ""}
<p>Reply to your support ticket if you need to add more details.</p>
`,
text: `Hi ${requester?.name || "there"},\n\nWe received your request and will follow up shortly.\n\nTicket ID: ${ticketId}\nSubject: ${safeSubject}`,
headers: {
"X-Freshdesk-Ticket-ID": ticketId,
"X-Workflow": workflow
}
};
const volaneaResponse = await fetch("https://api.volanea.com/v1/emails", {
method: "POST",
headers: {
"Authorization": `Bearer ${VOLANEA_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": idempotencyKey
},
body: JSON.stringify(emailPayload)
});
const responseBody = await volaneaResponse.text();
if (!volaneaResponse.ok) {
console.error("Volanea send failed", {
ticketId,
status: volaneaResponse.status,
responseBody
});
return res.status(502).json({ error: "Email provider rejected the send" });
}
console.info("Volanea email accepted", {
ticketId,
workflow,
responseBody
});
return res.status(202).json({ accepted: true });
});
app.listen(3000, () => {
console.log("Freshdesk webhook receiver listening on port 3000");
});
The field mapping is explicit:
| Freshdesk webhook field | Volanea email field | Purpose |
|---|---|---|
requester.email | to[0] | Recipient address |
ticket.subject | subject | Message context |
requester.name | html and text | Personal greeting |
ticket.id | html, text, headers, idempotency key | Traceability and duplicate prevention |
ticket.description | html | Optional customer-provided context |
workflow | headers and idempotency key | Identifies the automation purpose |
Never insert ticket.description directly into HTML without escaping it. A customer can submit angle brackets, pasted markup, or unexpected text. Escape it before rendering, or use a trusted template engine that escapes variables by default.
Choose the right email recipient and sender
The requester email is often the obvious target, but it is not always the correct one. Before enabling the workflow, decide whether the email should go to:
- The ticket requester.
- A fixed internal operations mailbox.
- A contact stored in a custom CRM field.
- A group of account stakeholders.
- An agent, group, or escalation owner.
For customer-facing email, require a valid requester email in the Freshdesk automation conditions and validate it again in middleware. The second validation is not redundant: automation rules can change, imports can create incomplete tickets, and webhook data can be missing unexpectedly.
Your from address must be a sender address or domain you have verified in Volanea. Use a stable, recognizable sender such as support@example.com or notifications@example.com. Avoid dynamically using a requester’s address as the From address. That pattern creates alignment and deliverability problems; use a verified From address and, where appropriate, set a Reply-To address according to your email policy.
Add idempotency before you enable retries
A webhook-driven email send is not automatically exactly-once. Freshdesk may retry or repeat an outbound request when it cannot confirm a successful response, and your own platform may receive the same event more than once. If every delivery becomes a new provider send, the customer can receive duplicate emails.
Use a durable idempotency record keyed to the business event. For the Ticket creation workflow in this article, a suitable key is:
freshdesk:implementation-follow-up:ticket:123456
Before calling Volanea, write that key to a database or cache with a state such as processing. If it already exists as sent or processing, return a successful response to Freshdesk without creating another message. After Volanea accepts the request, store the provider message ID and transition the key to sent.
Do not rely only on an in-memory Set
An in-memory duplicate list works for a local demo but fails in production when the process restarts or multiple server instances receive requests. Use Redis, Postgres, DynamoDB, or another durable shared system.
A simple record might include:
{
"idempotency_key": "freshdesk:implementation-follow-up:ticket:123456",
"freshdesk_ticket_id": "123456",
"workflow": "implementation-follow-up",
"status": "sent",
"volanea_message_id": "provider-message-id",
"created_at": "2026-09-20T15:00:00Z"
}
The provider-level idempotency header in the example is useful, but your own idempotency store remains important. It protects the business workflow even if a request fails before reaching Volanea, after Volanea accepts it, or during a middleware restart.
When this breaks
Every integration should be designed around failure paths, not just the successful demo. In this specific Freshdesk-to-middleware-to-Volanea hop, these are the failures most likely to matter.
Freshdesk retries can create duplicate sends
If Freshdesk does not receive a timely successful response from your endpoint, it may attempt the webhook again. A retry does not necessarily mean the first request failed before Volanea accepted the email. It may mean the response was lost, your endpoint timed out after the send, or a network connection closed at the wrong moment.
Mitigation: create the idempotency record before sending, return a 2xx response for duplicate deliveries, and store the ticket ID plus workflow name. Do not use the ticket subject as the duplicate key: subjects can repeat and can change.
Your webhook endpoint can time out
A slow serverless cold start, database lock, DNS failure, or slow provider request can cause Freshdesk’s outbound request to exceed its available waiting time. Treat the Freshdesk webhook response as an acknowledgement path, not a place for lengthy work.
Mitigation: validate quickly, persist a job, return 202 Accepted, and let a background worker make the Volanea request. If you send synchronously, set conservative internal timeouts and ensure your endpoint returns promptly.
Freshdesk payload fields can be empty or unavailable
A requester may not have an email, a field may not exist in every ticket type, custom fields may be plan-specific, and placeholder values can be blank. The ticket description can also be HTML, plain text, or content that is inappropriate to repeat in a confirmation email.
Mitigation: test representative tickets, make optional fields truly optional, use fallback copy, and reject requests that lack a valid recipient. Keep the webhook body minimal so a missing nonessential field does not break the workflow.
The rule triggers on the wrong tickets
A broad Ticket creation rule can send mail for spam, merged tickets, agent-created tickets, internal testing, or tickets created by an integration.
Mitigation: use a deliberate tag or custom field as the send signal. Start with one group and one ticket type. Add an exclusion such as Tags does not contain volanea-sent only if your operational process reliably controls that tag; do not rely on tags alone for duplicate prevention.
Volanea rejects the message
A send can be rejected because the From address is unverified, the account lacks permission for a sending domain, the request format is invalid, or the recipient is malformed.
Mitigation: log the provider status and response body securely, capture the ticket ID, and alert on repeated failures. Do not log API keys, full authorization headers, or unnecessary customer content.
Test the workflow safely
Do not enable this automation first on live customer tickets. Start with a controlled test path.
- Create a non-production or tightly scoped Freshdesk rule using a test tag such as
volanea-test. - Point the webhook at a request inspector or a staging middleware endpoint.
- Create a test ticket with a known internal requester email.
- Confirm Freshdesk substituted the expected ticket values in the webhook body.
- Confirm your middleware accepted the webhook authentication token.
- Confirm the Volanea request contains the expected From, To, subject, and template fields.
- Create the same event again or replay the webhook to verify duplicate handling.
- Enable the production rule only after reviewing logs and received messages.
Keep test and production sender identities separate where practical. A test message should make its environment obvious in the subject line, such as [Staging] We received your request.
Operational practices that improve deliverability
Freshdesk is the trigger, but Volanea is the sending layer. That means sender reputation depends on your email practices after the webhook is working.
Use a verified domain and ensure your domain authentication records are correctly configured. Keep operational messages concise and expected. A customer who submits a support ticket generally expects a confirmation or follow-up, but they do not expect unrelated promotional content in that same message stream.
Maintain a clear separation between transactional support mail and campaigns. Ticket-triggered mail should have a narrow purpose, predictable content, and a recipient relationship that is easy to explain. If you need to evaluate sending volume, usage limits, or plan economics before moving the workflow into production, review transactional email pricing.
Also monitor these metrics by workflow name:
- Webhooks received.
- Webhooks rejected by authentication or validation.
- Duplicate webhooks suppressed.
- Volanea requests accepted.
- Provider errors by status code.
- Delivery, bounce, and complaint events where available.
- Time from Freshdesk ticket creation to provider acceptance.
This turns an integration from a black box into an observable system. If a support manager asks whether a customer received a message, you should be able to trace the Freshdesk ticket ID to an idempotency record and then to the provider message identifier.
Alternatives when direct webhook delivery is not practical
The webhook-plus-middleware pattern is the best choice when you control an application backend or can deploy a small endpoint. It is also the best choice when you need idempotency, custom templates, internal audit records, or advanced routing.
If you cannot run middleware, an integration platform can receive the Freshdesk event and call a provider API. That can be useful for a simple proof of concept, but verify that the platform can safely store the Volanea API key, format arbitrary JSON requests, preserve ticket data, and handle duplicates. A no-code workflow does not remove the need for recipient validation or an intentional trigger condition.
Avoid trying to expose an email API key in browser code, a public form, or a Freshdesk-visible ticket value to bypass middleware. That substitutes a short setup for a long-term security and deliverability risk.
Conclusion
A reliable Freshdesk email integration with Volanea starts with a focused Ticket creation automation rule, not a marketplace plugin. Freshdesk sends a defined JSON webhook when a ticket meets your conditions; your middleware validates and deduplicates that event; Volanea sends the resulting transactional email through your verified sender identity.
The most important implementation decisions are straightforward: keep the Volanea API key server-side, use a purpose-specific Freshdesk trigger, validate every payload, escape customer-provided content, acknowledge webhooks quickly, and persist idempotency records before sending. With those controls in place, Freshdesk becomes a dependable source of support events while Volanea handles the email infrastructure.
FAQ
Does Volanea have a native Freshdesk app?
No. This setup does not use a Freshdesk marketplace app or native Volanea plugin. It uses Freshdesk Ticket creation automation and a Trigger Webhook action connected to your middleware.
What Freshdesk event starts the email send?
This guide uses a Ticket creation automation rule. The rule starts when a new ticket is created and its conditions match, such as a specific tag, priority, or custom field.
Can Freshdesk send directly to Volanea without middleware?
A direct webhook may be possible only if your Freshdesk webhook configuration and Volanea authentication requirements align exactly. Middleware is recommended because it protects the Volanea key, handles field validation, supports idempotency, and gives you reliable logs.
Where should the Volanea API key be stored?
Store it in a server-side environment variable or managed secret store used by your middleware. Do not put it in Freshdesk ticket fields, frontend code, or any configuration exposed to end users.
How do I prevent duplicate emails from Freshdesk retries?
Use an idempotency key based on the Freshdesk ticket ID and workflow name, persist it before sending, and return a successful response when the same event is received again.