Connect Discord monitor bots
- Written for
- + Written for
- Deprecated
- + Deprecated
- Applies to
- + Applies to
Connect Discord monitor bots
If your monitor, checkout or cook-group bot can post to a Discord webhook, it can post to Shippified. You create a webhook bot in Shippified, copy its intake URL, and paste that URL into your bot wherever you would normally paste a Discord webhook. Every successful checkout the bot reports then becomes an order in your workspace.
This works the same way for Hayha, Refract, Valor and any other bot that sends Discord-style webhooks.
How it works
Your bot finishes a checkout and posts its usual Discord embed, but to your Shippified URL.
Shippified reads the embed with a parser template and pulls out the order number, item, price, customer/profile, tracking and store.
The order is created, or merged into an existing order with the same order number.
Optionally, Shippified posts a short summary of the parsed order to a Discord channel of your choice.
Each webhook bot has its own URL, its own template setting and its own stats (Orders, Tracking, Review), so we recommend one Shippified webhook bot per real bot (for example "Hayha Target" and "Refract Walmart").
Important: The intake URL is the only credential. Anyone who has it can post payloads into your workspace. Keep it private, just as you would a Discord webhook URL.
Create a webhook bot
Open Links in the sidebar and choose the Webhooks tab.
Click New webhook bot (or Create your first bot if you have none yet).
Fill in the form (the fields are described below).
Click Create webhook bot.
Copy the URL from the new bot card with the Copy button next to it.
The URL looks like this:
https://shippified.net/api/webhooks/discord/<your-handle>/<bot-slug><your-handle> is an opaque identifier for your workspace, and <bot-slug> is the slug you chose.
Tip: Always copy the URL from the bot card after saving. Shippified tidies up slugs when you save: it lowercases them, replaces anything other than letters, numbers and hyphens with a hyphen, and adds
-2,-3and so on if you already have a bot with that slug. The card shows the final URL.
Form fields
Field | What it does |
|---|---|
Display name | The name shown on the bot card, on orders, in digests and on forwarded messages. |
Webhook slug | The last part of the intake URL. Changing it later changes the URL. |
Bot type | Monitor (Hayha, Refract, Valor: per-item headline), Dropship (Horus, Auto DS: per-customer headline) or Generic (mixed or unknown). It's a label for your own reference, and it picks the shape of the bot's test payload (see Send a test payload). It never changes how payloads are parsed: parsing always follows the template. |
Bot image | Optional avatar. It appears on the bot card and in digests, and is used as the avatar on forwarded messages. |
Parser template | Auto-detect (recommended) lets Shippified pick the matching template for each payload. Choosing a built-in or custom template instead pins it to this bot. See Choosing a parser template. |
Bot note (free text, not parser-related) | A private note, such as what the bot is for. |
Forward parsed orders to (optional) | A Discord webhook URL. After each payload is parsed, a summary is posted there. It must be a public address: URLs that point at private or local network addresses are refused when you save. See Forwarding parsed orders. |
Paste the URL into your bot
Every bot names its settings differently, but the process is the same.
Open your bot's webhook or notification settings.
Find the field for the success or checkout webhook, which is where you would normally paste a Discord webhook URL.
Paste your Shippified intake URL there and save.
If the bot has a "test webhook" button, press it. Otherwise, wait for the next checkout.
Shippified accepts the same JSON that Discord does, so your bot doesn't need to know it's posting to Shippified. The URL answers with a success response (HTTP 202) whenever the payload is accepted.
Tip: Want checkouts to keep appearing in your own Discord channel too? Put your Discord webhook URL in Forward parsed orders to rather than pointing the bot at two places. Shippified forwards a summary after it parses each payload.
Send a test payload
Click Send test payload on the bot card. It posts a sample embed through your real intake URL, so it tests the whole path, including your template and forwarding. The sample's shape follows the bot's Bot type:
Bot type | Sample embed |
|---|---|
Monitor or Generic | A "Successful Checkout" embed with order number, profile, item, price, SKU and a tracking number. |
Dropship | A "New order" embed with order number, customer, ship-to city, item, price and quantity, and no tracking number. |
The sample is saved with the bot, so after changing Bot type, save the bot before sending a test.
Note: The test creates a real order in your workspace, marked as coming from this bot. If you don't want to keep it, delete it from Orders. Sending the test again updates that same order, because it reuses the same order number.
Choosing a parser template
When a payload arrives, Shippified picks a template in this order:
The bot's pinned template, if it has one. A pinned template is always used, even if its detection rules wouldn't pass. This is also the only way a template with no detection rules ever runs.
Your custom webhook templates, newest first. The first one whose detection rules all pass is used.
Built-in templates: Hayha, Refract and Valor. Each is recognised by the bot's name appearing somewhere in the embed, such as the username, author, title or footer.
Whichever template is chosen, Shippified then runs a generic pass over the payload to fill in anything the template didn't find. That pass looks for common embed field names such as "Order Number", "Order #", "Customer", "Profile", "Product", "Item", "Total", "Price", "Qty", "Tracking", "Carrier" and "Store". This is why many bots work with no template at all.
Situation | Recommended setting |
|---|---|
Hayha, Refract or Valor with their standard embeds | Leave Parser template on Auto-detect (recommended) or pick the matching built-in. |
A bot whose embeds use common field names | Leave it on Auto-detect (recommended) and check the first few orders. |
A bot with unusual field names, or several bots sharing one format | Build a custom template (see Custom templates) and pin it here. |
The bot card shows the pinned template next to Template. If a pinned template was deleted, the card marks it missing and the bot falls back to automatic detection. To unpin a template, edit the bot and choose Auto-detect (recommended).
Tip: The Build new custom template button in the form takes you straight to the template builder. To capture a real embed from Discord for the builder, use the embed copier.
Forwarding parsed orders to Discord
Shippified can post a summary of every parsed payload to a Discord channel:
Per bot: set Forward parsed orders to on the bot.
Fallback for all bots: in Settings → Forwarding, set Bot throughput fallback webhook. Bots that don't have their own forward URL use this one.
Both must be public addresses. A URL that resolves to a private, loopback or link-local address is refused when you save it, and is checked again every time Shippified sends.
The forwarded message is posted as "Shippified" with your bot image as the avatar. It reads "Parsed Store order number" and includes the item as the title, plus fields for Source, Store, Status, Tracking (or "Needs review" when there's no tracking yet) and Parser. It is sent for every payload that creates or updates an order. Payloads refused by your plan limit aren't forwarded.
Note: Shippified pings webhook in Settings → Forwarding is a separate feature. It posts order lifecycle notifications (placed, shipped, delivered, updates), and you choose which events it sends. See Order lifecycle.
Retries and failures
Behaviour | Detail |
|---|---|
Attempts | Up to 3, waiting about 1.5 seconds before the second and 4 seconds before the third. |
Timeout | Each attempt waits up to 8 seconds. |
Retried | Rate limiting (HTTP 429), server errors (5xx) and network errors. |
Not retried | Other 4xx errors, such as a deleted webhook or an invalid URL. These fail right away. |
A failed forward never loses the order. The order is still created or updated. When forwarding fails, whether to the bot's own URL or to the workspace fallback, that payload shows as review in the bot's activity log, with a message that says which one failed, such as output webhook forward failed after 1 attempt: HTTP 404 (HTTP 404) or fallback webhook forward failed after 3 attempts: HTTP 503 (HTTP 503).
Rate limits and plan limits
Because intake URLs can't use passwords, they are rate limited:
Limit | Value | Response when exceeded |
|---|---|---|
Per sending IP address, across all your bots | 60 requests per minute | HTTP 429, |
Per bot | 60 requests per minute | HTTP 429, |
Tip: If you run many bots from one server, they share the per-IP limit. Normal checkout volume is far below it, but a mass test run from one machine can reach it.
If your plan's monthly order limit has been reached, Shippified still acknowledges the payload so your bot doesn't retry it, but it doesn't create a new order. The payload appears in the activity log as rejected with plan_limit_reached (used/limit). Updates to orders that already exist are never blocked. See Account and privacy for plan details.
The activity log
Click the eye icon (Activity) on a bot card to open its log. It lists up to the 200 most recent payloads that reached this bot's URL, newest first, whether or not they parsed. The list is this bot's own history, so a quiet bot's entries aren't pushed out by busier bots in the same workspace. Each entry shows an outcome badge, the parser used, the time received, any error and the start of the raw payload.
Outcome | Meaning |
|---|---|
created | A new order was created. |
merged | The payload matched an existing order by order number and updated it. |
review | Either the parser couldn't identify the store or the item (the order is created with status Issue), or forwarding the summary failed (to the bot's own URL or the workspace fallback). |
rejected | Your plan's monthly order limit was reached, so no order was created. |
The parser column tells you which template handled the payload: shape:hayha for a built-in, custom:… for one of your templates, or generic discord when no template matched and only the generic pass ran.
Shippified keeps up to 5,000 log entries per workspace, shared by all your bots, and stores up to 20,000 characters of each payload. Payloads that were rejected by a rate limit, or sent to an unknown URL, never reach your workspace and are not logged.
Tip: Orders marked review often just need a template. Copy the raw payload from the log, paste it into the template builder as the sample, and map the fields your bot uses. Then use Re-run parsing on the Templates page to fix orders that already came in. See Custom templates.
Editing and deleting a bot
Edit: click the pencil icon on the bot card, make your changes and click Save changes. If you change the slug, paste the new URL into your bot, because the old one stops working.
Delete: click the trash icon and confirm with Delete bot. Orders the bot already created stay in your workspace. The URL stops accepting new payloads right away.
Public feed mirror
If you have turned on Include my checkouts in public stats (under Settings → Profile) and Shippified's public feed is enabled, each order your bots create or update is also posted to Shippified's public Discord feed.
The public post is a short card built from four details only: the item, the store, the price and the product image. It's always posted under the name "Shippified", never your bot's name. Your bot's original embed isn't reposted, so order numbers, tracking numbers, profile and customer names, emails and addresses never appear in the feed. To keep even the item, store and price out of it, leave Include my checkouts in public stats turned off. See Sharing and profiles and Account and privacy.
Troubleshooting
Symptom | What to check |
|---|---|
Nothing appears in the activity log | Check that the URL in your bot matches the bot card exactly, including the slug. A wrong slug or handle is refused before anything is logged. |
Orders land as Issue | No template recognised the store or item. Build and pin a custom template. |
Wrong values in some fields | Pin a template so detection isn't left to guesswork, or adjust your custom template's mappings. |
Forwarded messages stop | Look for review entries that mention |
Saving the bot fails with an | The forward URL is malformed, isn't |
For more help, see Troubleshooting. Developers can find the endpoint reference in Webhooks.