Email-to-Ticket
Configure inbound email parsing to automatically create support tickets and append replies.
Overview
MaxRMM can receive inbound emails and automatically:
- Create a new ticket from the email subject and body
- Add a comment to an existing ticket when the email subject contains a ticket reference
This works with email parsing services like Resend or SendGrid that forward incoming emails to a webhook URL.
How It Works
- An end user sends an email to your support address (e.g.,
support@company.com) - Your email provider forwards the parsed email to the MaxRMM inbound webhook
- MaxRMM matches the sender's domain to a company in the system
- If the subject contains a ticket reference (e.g.,
[Ticket: clxxxxxxxxx]), a comment is added to the existing ticket - Otherwise, a new ticket is created with medium priority and SLA timers applied
Step 1: Set Up Your Email Provider
Using Resend
- In Resend, configure an inbound webhook for your domain
- Set the webhook URL to:
https://api.maxrmm.com/api/inbound-email - Resend will POST parsed email data (from, subject, text, html) to this endpoint
Using SendGrid
- In SendGrid, go to Settings → Inbound Parse
- Add a hostname and set the URL to:
https://api.maxrmm.com/api/inbound-email - Enable "POST the raw, full MIME message" or use the parsed format
Step 2: Configure Domain Matching
MaxRMM identifies which company a ticket belongs to by matching the sender's email domain. There are two matching methods:
- Custom domain — Set your company's domain in Settings. Emails from
*@company.comwill create tickets under your tenant. - Technician email fallback — If no custom domain matches, MaxRMM looks for a technician in the system with a matching email domain.
Important: If the sender's domain does not match any company or technician in MaxRMM, the email is silently ignored (HTTP 200 returned to the email provider with status ignored).
New Ticket Creation
When a new email arrives that does not match an existing ticket, MaxRMM creates a ticket with:
| Field | Value |
|---|---|
| Title | Email subject line |
| Description | Email body, prefixed with "Email from sender@domain.com" |
| Priority | Medium (default) |
| Source | email |
| SLA | Response and resolution timers applied per your SLA policy |
Reply Threading
To add a comment to an existing ticket, the email subject must contain one of these patterns:
[Ticket: clxxxxxxxxxxxxxxxxx]— e.g.,Re: Printer not working [Ticket: cl8f2k9x0001abcdef012345]#clxxxxxxxxxxxxxxxxx— e.g.,Re: Printer not working #cl8f2k9x0001abcdef012345
When a match is found, the email body is added as a public comment on the ticket. This allows end users to reply to ticket notification emails and have their responses threaded into the ticket automatically.
Webhook Payload Format
The inbound email endpoint accepts the following fields (all optional except from and subject):
POST /api/inbound-email
Content-Type: application/json
{
"from": "user@company.com",
"subject": "Printer not working",
"text": "The printer on floor 3 is showing an error...",
"html": "<p>The printer on floor 3 is showing an error...</p>"
} The endpoint also accepts SendGrid's envelope format with envelope.from and sender fields.
Note: This endpoint does not require authentication — it is designed to receive webhooks from email providers. The domain-matching logic ensures that only emails from known domains create tickets.
Response Codes
| Status | Response | Meaning |
|---|---|---|
201 | {"status": "ticket_created", "ticketId": "..."} | New ticket was created |
200 | {"status": "comment_added", "ticketId": "...", "commentId": "..."} | Comment added to existing ticket |
200 | {"status": "ignored", "reason": "no matching company"} | Sender domain not recognized |
400 | {"error": "Missing required fields: from, subject"} | Missing from or subject |