Every ticket template can POST a JSON copy of every submission to a webhook URL you control. Use it to drive Microsoft Power Automate, Azure Logic Apps, n8n, Make, Zapier, or any custom HTTPS endpoint — and optionally use it as the only destination for templates that should never create a PSA ticket (HR change requests, procurement approvals, anything that lives in a Flow).Documentation Index
Fetch the complete documentation index at: https://docs.msportal.ai/llms.txt
Use this file to discover all available pages before exploring further.
What it does
When a user submits a ticket from a template that has a Flow webhook configured, MSPortal sends a single HTTPSPOST to your URL with a JSON body that includes:
- The submission’s field answers, keyed by your template’s own field keys
- The PSA ticket id and number (if one was created)
- The submitting user’s name and email
- The company context (id, name, external PSA id)
- The template’s id, name, and key
Prerequisites
- “Write Ticket Settings” or “Manage Ticket Settings” permission to configure
- An HTTPS endpoint that accepts
POSTrequests withContent-Type: application/json - For Power Automate: a flow with a When a HTTP request is received trigger
When the webhook fires
| Scenario | What happens | What you get |
|---|---|---|
| PSA configured and ticket created successfully | PSA ticket is created, webhook fires with the real ticket id/number/external_url | Both: PSA ticket + Flow run |
| PSA configured but creation fails | Webhook fires with the submission data, PSA fields null | Flow run (no PSA ticket) |
| No PSA configured (webhook-only template) | Webhook fires, no PSA call is attempted | Flow run only |
| No webhook configured | Existing behavior: PSA ticket + optional fallback email | No Flow run |
Configure the webhook
Open the template
Expand the Flow Recipient accordion
Enable and paste your URL
https:// and must point to a public host. Localhost, private IP ranges (10.x, 192.168.x, 172.16-31.x), link-local, and CGNAT addresses are blocked.(Optional) Paste a shared secret
X-MSPortal-Signature: sha256=<hmac> header so your Flow can verify.Leave it blank if you don’t need signing — the random URL acts as the secret in that case.Test with webhook.site before you build the Flow
The fastest way to see exactly what MSPortal will send your Flow is webhook.site — a free service that gives you a unique URL and shows every request that hits it in real time.Open webhook.site
https://webhook.site/abc123-def4-...).Copy your unique URL
Paste into MSPortal
Click Send test event
The JSON payload
Top-level shape
Top-level shape
event is "ticket.test" and tenant_id is the literal string "test-tenant" (not your real tenant uuid). On real submissions event is "ticket.created" and tenant_id is your tenant’s uuid.The fields object
The fields object
fields object uses your template’s own field keys as keys. If your template has fields with keys username, asset_tag, and reason, the payload will be:When PSA fields are null
When PSA fields are null
id, number, external_url, board, status, and priority are all null. The summary, description, and fields are always populated. Branch on ticket.number !== null in your Flow if you need to handle both cases.HMAC signature header
HMAC signature header
HMAC-SHA256(secret, raw_body) encoded as lowercase hex, with a sha256= prefix. Compute the same digest over the raw request body in your Flow and compare to verify origin.Other headers
Other headers
| Header | Value |
|---|---|
Content-Type | application/json |
User-Agent | MSPortal-FlowWebhook/1.0 |
X-MSPortal-Event | ticket.created or ticket.test |
X-MSPortal-Tenant | Your tenant uuid (or test-tenant on test events) |
X-MSPortal-Signature | HMAC-SHA256 of body, only when a secret is configured |
Quick setup for Power Automate
Create a new automated cloud flow
Save once to generate the URL
Copy the HTTP POST URL
Paste into MSPortal and send a test
Generate the JSON schema from the sample
fields.username, ticket.number, etc. as dynamic content.Webhook-only templates (no PSA ticket created)
You can make a template route every submission straight to your Flow with no PSA ticket created at all. Useful for workflows that live entirely outside the PSA — HR onboarding, equipment requests, leave approvals, anything where the Flow is the system of record.Clear the PSA defaults
Enable the Flow webhook
Embedded templates
If a template contains an embedded template field, each template’s own webhook fires independently. So:- Parent template’s webhook fires once for the parent submission with the parent ticket data
- Each embedded template’s webhook fires once for its own submission with its own ticket data
Troubleshooting
Test event returns HTTP 4xx or 5xx
Test event returns HTTP 4xx or 5xx
Test event says "Webhook URL must point to a public host"
Test event says "Webhook URL must point to a public host"
localhost, 127.0.0.0/8, 10.x, 192.168.x, 172.16-31.x, 169.254.x, 100.64-127.x, IPv6 loopback (::1), link-local (fe80::/10), and unique-local (fc00::/7) addresses. Use a public hostname or test with webhook.site.Real submissions aren't reaching my Flow but the test event did
Real submissions aren't reaching my Flow but the test event did
/tickets/new using the template and check the Flow’s run history for a new invocation within ~10 seconds.If the run history shows nothing, check the receiving Flow hasn’t been turned off and your subscription is in good standing.My Flow needs to know if a PSA ticket was actually created
My Flow needs to know if a PSA ticket was actually created
ticket.number — it’s null when no PSA ticket was created (webhook-only template, or PSA call failed). It’s a string when a real PSA ticket exists. You can branch on this directly:HMAC verification fails in my Flow
HMAC verification fails in my Flow
Best practices
- Always test with webhook.site first. It surfaces malformed payloads, header issues, and connectivity problems before you’ve built any flow logic.
- Use a shared secret if your Flow does anything sensitive. The webhook URL alone is enough authentication for read-only / observability flows, but anything that provisions, deletes, or changes credentials should verify the HMAC.
- Don’t put secrets in your URL. Use the shared secret field instead — it’s stored encrypted alongside the template.
- Treat the webhook as best-effort on the PSA-success path. If your business logic depends on receiving every notification, configure fallback email or alert on missing Flow runs from your monitoring system.
- For webhook-only templates, set a meaningful template name. It’s the only thing that distinguishes one flow’s submissions from another in your downstream system.