# Conditions
Source: https://alius-docs.frimty.com/features/conditions
Filter which events trigger a notification using field-level conditions
## Overview
Conditions are optional filters on a trigger that narrow down which events generate a notification. Without conditions, a trigger fires for every event of its type. With conditions, you can restrict it to specific cases — e.g., only orders over \$200, or only products from a specific vendor.
***
## How Conditions Work
Each condition has three parts:
| Part | Description | Example |
| - | - | - |
| **Field** | The data point to check | `Total Inventory` |
| **Operator** | How to compare the value | `Less than` |
| **Value** | The threshold or target | `10` |
Multiple conditions can be added to a single trigger. When you have more than one condition, you choose how they combine:
| Mode | Behavior |
| - | - |
| **All conditions must match** | Every condition must be true (AND logic) |
| **Any condition can match** | At least one condition must be true (OR logic) |
If no conditions are set, the trigger fires for all events of its type (subject to change detection for update events).
***
## Operators
**String fields:**
| Operator | Behavior |
| - | - |
| Equals | Exact match (case-insensitive) |
| Doesn't Equal | Does not match exactly |
| Contains | Field includes the search text (case-insensitive) |
| Doesn't Contain | Field does not include the search text |
**Numeric fields:**
| Operator | Behavior |
| - | - |
| Equals | Exact numeric match |
| Doesn't Equal | Not equal |
| Greater than | Field value is strictly above the threshold |
| Less than | Field value is strictly below the threshold |
***
## Condition Fields by Entity
### Product
Available for: **Product created**, **Product updated**, **Product deleted**
| Field | Type | Description |
| - | - | - |
| Title | String | Product title |
| Status | String | `active`, `draft`, or `archived` |
| Product Type | String | Product type classification |
| Vendor | String | Vendor/manufacturer name |
| Tags | String | Comma-separated product tags |
| URL Handle | String | URL-friendly slug |
| Description | String | Product description (HTML body) |
| Field | Type | Description |
| - | - | - |
| Published At | String | When the product was published |
| Published Scope | String | Publication scope (`web`, `global`) |
| Field | Type | Description |
| - | - | - |
| Category | String | Shopify product category |
| Is Gift Card | String | Whether the product is a gift card (`true`/`false`) |
| Requires Selling Plan | String | Whether a selling plan is required |
| Has Only Default Variant | String | Whether the product has just one variant |
| Has Out-of-Stock Variants | String | Whether any variant is out of stock |
| Collections | String | Collections the product belongs to |
| Field | Type | Description |
| - | - | - |
| Price | Number | Product price |
| Compare at Price | Number | Compare-at (original) price |
| Unit Price | Number | Per-unit price |
| Cost per Item | Number | Cost of goods per item |
| Field | Type | Description |
| - | - | - |
| Total Inventory | Number | Sum of inventory across all variants |
| Charge Tax | String | Whether tax is charged (`true`/`false`) |
| Physical Product | String | Whether the product requires shipping |
| Inventory Tracked | String | Whether inventory tracking is enabled |
| Field | Type | Description |
| - | - | - |
| SEO Page Title | String | Meta title for SEO |
| SEO Meta Description | String | Meta description for SEO |
***
### Order
Available for: **Order created**, **Order updated**, **Order paid**, **Order fulfilled**, **Refund created**
| Field | Type | Description |
| - | - | - |
| Order Number | Number | Sequential order number |
| Order Name | String | Display name (e.g., `#1001`) |
| Field | Type | Description |
| - | - | - |
| Total Price | Number | Grand total of the order |
| Subtotal Price | Number | Subtotal before tax/shipping |
| Total Discounts | Number | Total discount amount applied |
| Total Tax | Number | Total tax charged |
| Total Line Items Price | Number | Sum of all line item prices |
| Total Outstanding | Number | Amount remaining to be paid |
| Total Weight | Number | Combined weight of items |
| Current Total Price | Number | Current total (after edits) |
| Current Subtotal Price | Number | Current subtotal (after edits) |
| Total Tip Received | Number | Tip amount |
| Field | Type | Description |
| - | - | - |
| Email | String | Email on the order |
| Contact Email | String | Contact email address |
| Phone | String | Phone number |
| Currency | String | Order currency code (e.g., `USD`) |
| Presentment Currency | String | Display currency |
| Financial Status | String | `paid`, `pending`, `refunded`, etc. |
| Fulfillment Status | String | `fulfilled`, `partial`, `unfulfilled` |
| Display Financial Status | String | Human-readable financial status |
| Display Fulfillment Status | String | Human-readable fulfillment status |
| Customer ID | String | Associated customer ID |
| Note | String | Order notes |
| Source Name | String | Where the order originated |
| Tags | String | Order tags |
| Customer Locale | String | Customer's locale |
| Cancel Reason | String | Reason for cancellation |
| Landing Site | String | Landing page URL |
| Payment Gateway Names | String | Payment methods used |
| Field | Type | Description |
| - | - | - |
| Buyer Accepts Marketing | String | Marketing opt-in status |
| Test Order | String | Whether this is a test order |
| Tax Exempt | String | Whether the order is tax exempt |
| Taxes Included | String | Whether prices include tax |
| Confirmed | String | Whether the order is confirmed |
| Edited | String | Whether the order has been edited |
| Duties Included | String | Whether duties are included |
| Field | Type | Description |
| - | - | - |
| Shipping City | String | City |
| Shipping Province | String | Province/state |
| Shipping Country | String | Country |
| Shipping Zip | String | Postal/ZIP code |
| Shipping Address 1 | String | Street address |
| Shipping Phone | String | Phone on address |
| Shipping Name | String | Name on address |
| Field | Type | Description |
| - | - | - |
| Billing City | String | City |
| Billing Province | String | Province/state |
| Billing Country | String | Country |
| Billing Zip | String | Postal/ZIP code |
| Billing Address 1 | String | Street address |
| Billing Phone | String | Phone on address |
| Billing Name | String | Name on address |
| Field | Type | Description |
| - | - | - |
| Customer Email | String | Customer's email |
| Customer First Name | String | Customer's first name |
| Customer Last Name | String | Customer's last name |
| Customer Phone | String | Customer's phone |
***
### Customer
Available for: **Customer created**, **Customer updated**, **Customer deleted**
| Field | Type | Description |
| - | - | - |
| Email | String | Customer email address |
| First Name | String | First name |
| Last Name | String | Last name |
| Phone | String | Phone number |
| Tags | String | Customer tags |
| Accepts Marketing | String | Email marketing opt-in (`true`/`false`) |
| Lifetime Amount Spent | Number | Total amount the customer has spent |
| Lifetime Number of Orders | Number | Total number of orders placed |
| Locale | String | Customer's locale |
| Product Subscriber Status | String | Subscription status |
| Tax Exemptions | String | Tax exemption info |
***
### Returns
Available for: all **Return** trigger types (requested, approved, declined, processing, closed, cancelled, reopened, updated)
| Field | Type | Description |
| - | - | - |
| Status | String | Current return status |
| Return Reason | String | Reason provided for the return |
| Line Item Count | Number | Number of items in the return |
| Total Refund Amount | Number | Total refund value |
| Currency | String | Currency code |
| Order ID | String | ID of the associated order |
| Customer Email | String | Customer's email address |
***
### Cart Abandoned
Available for: **Cart abandoned**
| Field | Type | Description |
| - | - | - |
| Customer Email | String | Customer's email address |
| First Name | String | Customer's first name |
| Last Name | String | Customer's last name |
| Total Price | Number | Cart total value |
| Currency | String | Currency code |
| Line Item Count | Number | Number of items in the cart |
***
## Condition Evaluation
Conditions are evaluated when a webhook is processed:
1. The worker loads the current entity data (enriched via Shopify GraphQL where needed — e.g., collections and inventory totals for products).
2. For each active trigger of the matching type, the evaluator checks every condition row.
3. Each condition's field value is looked up and compared using the specified operator.
4. Results are combined using the condition mode (`all` = AND, `any` = OR).
5. If the result is `true`, the notification is dispatched.
For **Product updated** and **Order updated** triggers, a notification is only sent when actual changes are detected compared to the previous snapshot. This prevents duplicate alerts from Shopify's occasional webhook re-deliveries.
# Dashboard
Source: https://alius-docs.frimty.com/features/dashboard
Overview of the Alius home page — setup guide, metrics, and plan status
## Overview
The **Home** page is the main landing screen when you open Alius. It shows your setup status, activity metrics, current plan, and integration connection states.
***
## Setup Guide
When you first install Alius, the Home page displays a three-step setup checklist:
| Step | Description | Auto-detected |
| - | - | - |
| 1. Connect an integration | Connect Slack, Email, or Telegram on the Integrations page | Detected when any integration is connected |
| 2. Send a test message | Send a test notification to confirm delivery is working | Detected when a test message has been sent successfully |
| 3. Create a trigger | Create at least one trigger | Detected when any trigger exists |
Each step can also be manually checked off using the checkbox, which is useful if setup was completed outside the app's standard flow.
***
## Stock and purchase orders
Below the setup guide, the Home page shows what needs your attention in stock:
| Block | What it shows |
| - | - |
| Out of stock | Selling items that are at zero at any location |
| Need reorder | Items that will run out before a new order can arrive, or that are under your reorder point |
| Open purchase orders | Purchase orders sent to a supplier and not fully received, plus drafts not sent yet |
| Late deliveries | Open purchase orders past their expected date, and how many suppliers have not replied yet |
| Needs reorder | The five items most at risk, with how long they last and how much to order |
| Incoming purchase orders | Your open purchase orders, late ones first, with the supplier's answer |
The at-risk list is the same one the **Stock** page shows, across all locations. "Late" uses your store's timezone.
## Notification activity
Further down: the delivery rate, which hubs your notifications went to, and your most active automations over the last 7 days.
# Integrations
Source: https://alius-docs.frimty.com/features/integrations
Connect Slack, Email, Telegram, and Discord to receive Alius notifications
## Overview
Alius delivers notifications through four hubs: **Slack**, **Email**, **Telegram**, and **Discord**. Each must be connected before it can be selected in a trigger. Connections are managed on the **Integrations** page.
***
## Slack
Slack is connected via **OAuth 2.0**. Alius installs a bot in your workspace that posts messages to selected channels.
### Connecting Slack
1. Go to **Integrations** in the sidebar.
2. Click **Connect to Slack**.
3. You'll be redirected to Slack's OAuth authorization page. Select your workspace and click **Allow**.
4. After authorization, Alius stores the bot token and the status changes to **Connected**.
### Enabling Channels
Once connected, a list of your workspace's public channels appears.
1. Toggle on the channels where Alius should be allowed to post.
2. Click **Save** — the bot automatically joins each enabled channel.
Only enabled channels appear in the trigger form's channel picker. The bot must be a member of a channel to post messages to it.
### Sending a Test Message
Click **Send test notification** to post a test message to all enabled channels. This confirms the token is valid and the bot has channel access.
### Disconnecting Slack
Click **Disconnect** to remove the Slack integration. This clears the bot token, disables all channel mappings, and stops all Slack notifications. Your triggers are preserved and will resume sending once Slack is reconnected.
Alius uses a Slack bot token with permission to read channels and post messages. It does not read your team's private messages.
***
## Email
Email notifications are sent via Resend. You manage a list of verified recipient addresses — only verified and active recipients receive notifications.
### Adding a Recipient
1. Go to **Integrations** → **Email** section.
2. Enter an email address and click **Add Recipient**.
3. Alius sends a verification email to that address.
### Verifying a Recipient
The recipient must click the verification link in the email. Until verified, the address will not receive notifications.
Verification tokens expire. If the link is not clicked in time, you can regenerate the token by editing the recipient and changing the email address, then re-entering it.
### Managing Recipients
Each recipient has two states that can be toggled independently:
| State | Description |
| - | - |
| **Verified** | Set automatically after the recipient clicks the link |
| **Active** | Controls whether this address receives notifications |
A recipient must be both verified **and** active to receive notifications.
To remove a recipient, click the delete icon next to their address.
***
## Telegram
Telegram notifications are sent via a Telegram bot. The bot is linked to a specific chat (personal chat, group, or channel) using a connection token.
### Connecting Telegram
1. Go to **Integrations** → **Telegram** section.
2. Click **Generate Connection Token**. A token is displayed — it is valid for **15 minutes**.
3. Open your Telegram chat (where you want to receive notifications) and send:
```
/connect
```
to the Alius bot.
4. The bot confirms the connection and the status changes to **Connected**.
### Sending a Test Message
Click **Send test notification** to post a test message to the connected chat. This confirms the bot token is valid and the chat ID is correctly linked.
### Disconnecting Telegram
Click **Disconnect** to unlink the chat. This stops all Telegram notifications. Reconnect at any time by generating a new token.
### Rate Limiting
Telegram enforces message rate limits. If Alius receives a rate-limit response (HTTP 429), it automatically retries the message up to 3 times with backoff. If all retries fail, the notification is logged as **Failed** in [Notification History](/features/notification-history).
***
## Discord
Discord notifications are sent via an **incoming webhook** — no OAuth or bot setup is required. You create the webhook inside Discord and paste the URL into Alius.
### Creating a Discord Webhook
1. In Discord, open the channel where you want to receive notifications.
2. Go to **Channel Settings** → **Integrations** → **Webhooks**.
3. Click **New Webhook**, give it a name, and click **Copy Webhook URL**.
### Connecting Discord
1. Go to **Integrations** → **Discord** section.
2. Paste the webhook URL into the **Webhook URL** field.
3. Click **Connect**. Alius validates the URL format and saves it.
4. The status changes to **Connected**.
The webhook URL must start with `https://discord.com/api/webhooks/` or `https://discordapp.com/api/webhooks/`. Any other URL is rejected.
### Sending a Test Message
Click **Send test message** to post a test notification to the connected channel. This confirms the webhook is valid and the channel is accessible.
### Enabling and Pausing
Once connected, use the **Enable notifications** toggle to pause and resume Discord messages without disconnecting. Toggling it off stops all Discord notifications while preserving the webhook URL.
### Disconnecting Discord
Click **Disconnect** to remove the integration. This clears the webhook URL and stops all Discord notifications. Your triggers are preserved and will resume sending once Discord is reconnected.
### Message Format
Discord messages are posted as **embeds** by Alius, using Shopify green (`#008060`) as the accent color. The username shown in the channel is "Alius". If the trigger's content includes an admin link, the embed title links directly to the relevant resource in Shopify Admin.
### Rate Limiting
Discord enforces webhook rate limits. If Alius receives an HTTP 429 response, it reads the `retry_after` value from Discord's response and waits before retrying — up to 3 times. If all retries fail, the notification is logged as **Failed** in [Notification History](/features/notification-history).
# Notification History
Source: https://alius-docs.frimty.com/features/notification-history
View, filter, and search all notification delivery records
## Overview
The **History** page shows a log of every notification Alius has attempted to send. Each entry records what was sent, when, to which hub and recipient, and whether it succeeded.
***
## Notification Statuses
| Status | Description |
| - | - |
| **Sent** | The notification was delivered successfully |
| **Failed** | The delivery attempt failed (see the error message on the entry) |
| **Scheduled** | A batched notification is pending its send window (see [Schedule Types](/features/schedule-types)) |
***
## Log Entry Fields
Each entry in the history log contains:
| Field | Description |
| - | - |
| Trigger title | The name of the trigger that fired |
| Trigger type | The event type (e.g., `order created`, `product updated`) |
| Hub | The notification hub used: Slack, Email, or Telegram |
| Recipient | The specific channel, email address, or Telegram chat |
| Message preview | A short preview of the notification content |
| Timestamp | When the notification was created |
| Error message | Populated only for **Failed** entries — the error returned by the hub |
***
## Filtering
The history log can be filtered along three dimensions simultaneously:
| Filter | Options |
| - | - |
| **Status** | All · Sent · Failed · Scheduled |
| **Type** | All · Products · Orders · Customers · Returns · Cart |
| **Search** | Free-text search on trigger title |
Filters are applied in combination — for example, you can search for failed notifications from order triggers.
***
## Sorting
Results can be sorted by:
* **Date** (newest first by default)
* **Hub** (Slack / Email / Telegram)
* **Status**
***
## Pagination
The history log displays **25 entries per page** by default. Use the pagination controls at the bottom of the page to navigate through older records.
***
## Failed Notifications
When a notification fails, the entry's error message field shows the reason returned by the hub (e.g., invalid token, channel not found, rate limit exceeded). Use this to diagnose delivery issues with your integration.
Common causes:
* **Slack**: Bot token revoked or bot removed from channel
* **Email**: Recipient address bounced or recipient is inactive
* **Telegram**: Chat ID no longer valid, or repeated rate-limit failures after retries exhausted
# Purchase orders
Source: https://alius-docs.frimty.com/features/purchase-orders
Create, send, track and receive purchase orders — from the app or straight from chat
## Overview
A **purchase order (PO)** is what you send a supplier to buy stock. In Alius, one PO has:
* one **supplier**;
* one **destination** — the location the goods go to;
* a list of variants, each with a quantity and a unit cost.
[Stock](/features/stock) tells you *what* to reorder. A PO is how you act on it. The whole loop can run from chat: add to a PO from an alert, get told when it arrives, and receive it with one tap.
Open **Purchase orders** in the app menu. POs are numbered per shop, from **PO-1001** upward.
***
## Life of a purchase order
| Status | What it means |
| - | - |
| **Draft** | Being prepared. Everything is editable. Only drafts can be deleted. |
| **Ordered** | Sent to the supplier. Units show as **incoming** in Shopify. |
| **Partially received** | Some units have arrived. |
| **Received** | Every line has fully arrived. |
| **Cancelled** | Stopped. Units still to come are removed from incoming. |
***
## Creating a PO
There are three ways to start one.
Click **Create purchase order**, then pick a **Supplier** and a **Destination**.
* **Search products to add** — pick variants. Each quantity starts at the Stock page's suggested reorder quantity (or 1).
* **Add supplier's products** — adds every variant this supplier serves at the destination, from its [Suppliers](/features/suppliers) rows.
A line the chosen supplier doesn't normally serve gets a **Usually from …** badge, so you notice before sending.
Select rows at **one location** that share **one supplier**, then click
**Create PO**. Alius saves a draft with each row's **Reorder** quantity and
opens it. If the rows are at different locations or have different
suppliers, a hint says why the button is off.
Tap **Add to PO** on a row of a reorder alert in Slack, Telegram or
Discord. Alius adds the variant to the newest draft for that supplier and
location — or starts a new draft — and replies with a link to review and
send it. Tapping again for the same variant adds to its quantity.
Untracked variants (inventory not tracked in Shopify) can't go on a PO. Alius
leaves them out and tells you which ones.
***
## Costs
| Part | How it works |
| - | - |
| **Unit cost** | In the **supplier's currency**. Prefilled from Shopify's cost per item when the currencies match. |
| **Taxes** | One amount. **Included** — shown, not added. **Added** — goes on top of the total. |
| **Adjustments** | Named amounts such as shipping or fees. Use a negative amount for a discount. |
A line with no unit cost counts as "unknown", not zero — the **Cost summary** then says the total is incomplete. Alius does no currency conversion.
### Purchase order details
**Your reference**, **Note to supplier**, **Internal note** (never shown to the supplier), **Expected arrival**, **Ship date**, **Cancel date**, **Payment terms**, **Supplier currency** and **Tags**.
***
## Sending
Save the draft, then click **Send to supplier**. A PO needs a supplier, a destination and at least one line.
When you send:
1. The supplier gets an email with the order and a **View and confirm order** button. Replies go to your shop's email.
2. Shopify shows the units as **incoming** at the destination.
3. The Stock page shows them in **On order**, and reorder alerts stop for variants the PO fully covers.
After sending, the supplier, destination, currency, costs and lines are **locked** — the supplier already has them. Notes, dates, payment terms and tags stay editable.
***
## The supplier's page
The link in the email opens a simple page for your supplier — **no login needed**, works on a phone. There the supplier can:
* **Confirm order** or **Decline order**;
* set a **Ship date** and **Arrival date**;
* add a **Tracking number** and **Tracking link**, then **Mark as shipped**;
* propose line changes — "I can send 8, not 10", or a new unit cost;
* leave a note for you;
* **Export to PDF**.
The supplier can never receive or cancel your PO — those stay yours.
Every answer shows up in **Supplier feedback** on the PO page and as a message on your Stock alert hubs.
### Proposed changes
A proposal waits for you. **Accept change** or **Reject change** — on the PO page, or with the buttons on the chat message.
* **Accept** updates the PO's lines and moves Shopify's incoming units to match.
* **Reject** keeps the PO as it was.
* Either way, the supplier gets an email with your answer.
### The supplier link
The **Supplier** card on a sent PO has **Copy supplier link** and **Preview as supplier**. If a link was shared with the wrong person, click **Reset link**: every old link stops working. Choose **Reset and email supplier** to send the new link, or **Reset only**.
***
## Receiving
When the goods arrive, open the PO. The **Receive** card lists **Ordered**, **Received** and **Left** for each line.
* **Receive all** — takes everything that is left.
* **Receive now** — type the quantity for each line, then click **Receive**. Use this for a partial delivery.
Received units move from **incoming** to **available** in Shopify at the destination. Each delivery is saved under **Receipts**. Alius never receives more than was ordered, and the same delivery is never counted twice.
If Shopify doesn't answer in time, the page shows **A receipt is waiting for
Shopify to confirm** with a **Retry** button. Retrying is always safe.
***
## Cancelling
Click **Cancel order** on an ordered or partly received PO. Units still to come are removed from incoming in Shopify; units already received stay. The supplier gets a "Cancelled" email listing what was still to ship.
***
## Chat messages
POs post to the same hubs you chose on the Stock **Alerts** page:
| Message | When |
| - | - |
| **PO-1004 sent to Acme** | A PO is sent — lines, units, total, destination, expected date. |
| **PO-1004 arrives today** | The morning of the expected arrival date, with a **Received all** button. |
| **PO-1004: 6 units received** | A delivery is received — in the app or from chat, and by whom. |
| Supplier updates | The supplier confirms, declines, ships or proposes a change. |
**Received all** asks you to confirm first. Tapping it on two hubs never receives the units twice.
Move the expected arrival date and you get a new "arrives today" reminder
for the new date.
***
## Plans
Creating, editing and sending POs needs **Pro** or **Max**.
| | Pro | Max |
| - | - | - |
| Open POs at once | 10 | Unlimited |
A PO is **open** while it is a draft, ordered, or partially received. Received and cancelled POs don't count, so your order history has no limit. At the limit you can still edit, send, receive and cancel the POs you have — you just can't create a new one until you receive or cancel one. This also applies to **Add to PO** from a chat message when it would start a new draft; adding to a draft you already have always works.
Moving from Max to Pro never touches your POs. If you have more than 10 open, they all keep working.
If you downgrade to Free, POs you already sent keep working: you can still open, receive and cancel them, answer supplier changes, and get the "arrives today" reminder. The goods arrive either way. See [Pricing](/guides/pricing).
# Schedule Types
Source: https://alius-docs.frimty.com/features/schedule-types
Control when notifications are sent — immediately or batched over time
## Overview
Every trigger has a **schedule** that controls when its notifications are delivered. Alius supports five schedule options: one immediate and four batched.
***
## Schedule Options
| Schedule | Behavior |
| - | - |
| **Instant** | Notification is sent immediately when the trigger fires |
| **Hourly** | Events are batched; one notification is sent once per hour |
| **Daily** | Events are batched; one notification is sent once per day |
| **Weekly** | Events are batched; one notification is sent once per week |
| **Monthly** | Events are batched; one notification is sent once per month |
The schedule is set per trigger when creating or editing it.
***
## Instant
Instant is the default schedule. The notification is dispatched as soon as the webhook is processed and conditions are met. There is no delay or batching.
Use instant when you need to act on events as they happen — for example, high-value orders, low stock alerts, or abandoned cart recovery.
***
## Batched Schedules (Hourly / Daily / Weekly / Monthly)
When a batched schedule is selected, Alius stores each matching event as a **Scheduled Notification** rather than sending it immediately. At the end of each scheduled interval, the worker collects all pending notifications for that trigger and sends a single consolidated message.
### What a batched notification contains
Each batched notification includes the message content from the most recent event in the batch window. The batch is cleared after sending.
### Batched notifications in History
Pending batched notifications appear in [Notification History](/features/notification-history) with a status of **Scheduled** until they are sent. Once sent, the status changes to **Sent**.
### When to use batched schedules
| Schedule | Use case |
| - | - |
| Hourly | Frequent events where per-event noise is too high (e.g., product updates during a bulk import) |
| Daily | End-of-day summaries — daily order counts, new customer signups |
| Weekly | Weekly digests — inventory changes, return summaries |
| Monthly | Monthly business reviews — aggregate order or customer metrics |
# Stock
Source: https://alius-docs.frimty.com/features/stock
See what runs out at each location, how many units to reorder, and get alerted before it happens
## Overview
**Stock** shows your inventory **per location**. For every variant it answers three questions:
* How many units are at this location right now?
* How fast does it sell here, and when will it run out?
* How many units should you reorder, and when?
Open it from **Stock** in the app menu. Alius reads your Shopify locations and on-hand quantities the first time you open the page, then keeps them up to date as inventory changes.
The first load of a large catalogue takes a few minutes. The page shows
**Reading your inventory** until the quantities arrive — refresh shortly.
***
## The Stock table
Pick a location at the top of the table, or keep **All locations** (the default) to see every location at once. On All locations, rows are grouped by product and the most urgent product comes first.
| Column | What it means |
| - | - |
| **On hand** | Units at this location, including units you can't sell right now. |
| **Unavailable** | On-hand units you can't sell — reserved, committed, damaged, or held as safety stock. |
| **Reorder point** | Your own threshold. Alerts fire when on-hand falls to this number or below. |
| **Per day** | Average units sold per day at this location over the last 30 days. |
| **Runs out in** | Days left at this location at the current sales pace. |
| **Reorder** | Suggested quantity to order now, based on lead time and coverage, minus what is already on order. |
| **On order** | Units on sent [purchase orders](/features/purchase-orders) to this location that have not arrived yet. Click to open the PO. |
| **Status** | Why the variant is on the list — out of stock, running low, or below its reorder point. |
Use **Search stock** to find a product and **Sort by** to change the order. The table shows up to 100 variants per view — the ones closest to running out.
### Acting on selected rows
Tick rows to show two actions:
* **Create PO** — turns the selected rows into a draft [purchase order](/features/purchase-orders), using each row's **Reorder** quantity, then opens it. The rows must be at **one location** and share **one supplier**; if not, a hint says why the button is off.
* **Set reorder point** — sets one reorder point for all selected rows.
### Units on order
Units on sent purchase orders lower the suggested **Reorder** quantity, so you don't order the same units twice. They do **not** change **Runs out in** — those units have not arrived yet.
### Velocity builds up from the day you start
Per-location sales history starts **the day stock tracking is switched on**. Shopify can't tell Alius which location an old order came from, so the past can't be filled in.
* **First days** — a banner says **Velocity is still building**. The table compares on-hand quantities with your reorder points instead of showing a stockout date.
* **Once orders come in** — the table switches to the forecast: **Per day**, **Runs out in** and **Reorder** fill in.
Set reorder points on your key variants on day one. Reorder-point alerts work
right away, with no sales history needed.
***
## Reorder settings (Pro / Max)
Click **Reorder settings** to tune each variant at each location:
| Setting | What it does | Default |
| - | - | - |
| **Reorder point** | Alert when on-hand falls to this number or below. | none |
| **Lead time (days)** | How long a delivery takes to arrive. | 7 days |
| **Coverage (days)** | How many days of sales the next order should cover. | 14 days |
The suggested **Reorder** quantity covers lead time plus coverage at the current sales pace, minus what you already have and what is already on order.
No lead time set here? Alius uses the [supplier's](/features/suppliers) lead time, then the 7-day default.
***
## Share stock (Pro / Max)
When the same product is short at one location and plentiful at another, the short row on the **All locations** view gets a **Share stock** action. It moves units from the other location, without leaving Alius.
* Alius suggests how many units to move. It never takes the other location below its own reorder point.
* Alius checks the other location's **live** quantity in Shopify first. If a sale happened in the meantime, Shopify refuses the move instead of overselling.
Share stock is an inventory adjustment between two locations. It is not a
Shopify transfer, so there is no "in transit" state.
***
## Movement
Click **Movement** on the Stock page. This page compares your locations with each other, so it has no location switcher.
| Section | What it shows |
| - | - |
| **Sells best / worst** | For each product stocked at 2+ locations: where it sells through fastest and slowest. |
| **Dead stock** | Units at a location with no sales there for the last 30 days. |
Sell-through is "units sold ÷ units you had". A warehouse that sold 100 of 1,000 is doing worse than a shop that sold 20 of 25.
Dead stock needs **14 days** of per-location history. Before that, every
product would look dead, so the section says how many days are still needed.
***
## Stock alerts (Pro / Max)
Click **Alerts** on the Stock page to choose what Alius sends and where.
### Reorder alerts
| Option | When it sends |
| - | - |
| **Off** | Nothing. |
| **Real-time** | About a minute after a variant crosses into risk. Variants that cross together at one location arrive as one message. |
| **Daily** | Once a day (05:00 UTC). One message per location listing what runs out there, how many units to order, and from which supplier. |
Each message lists up to 10 variants, plus "N more".
**Purchase orders count.** A variant fully covered by sent purchase orders is not alerted. A partly covered one is still alerted, with "N on order" in its line. A draft PO covers nothing.
**Buttons.** Each row with a [supplier](/features/suppliers) gets two buttons in Slack, Telegram and Discord Bot:
| Button | What it does |
| - | - |
| **Add to PO** | Adds the variant to a draft purchase order for that supplier and location, and replies with a link to review and send it. |
| **Alert supplier** | Emails the supplier a reorder request for that variant. |
**No spam:** a variant is alerted at most **once per day per location**. After that, it stays quiet until it recovers — or gets worse (for example, from "below reorder point" to "out of stock").
### Weekly movement digest
Switch on **Send the weekly movement digest** to get one message every **Monday**:
* units sitting at one location while another runs short, with a suggested transfer;
* products that have not sold anywhere.
Each finding is sent once, then stays quiet until it clears. The digest works alongside reorder alerts and uses the same hubs.
### Notification hub
Pick one or more hubs (Slack, Email, Telegram, Discord, HTTP) and their channels or recipients. Both alerts go to the same place. [Purchase order](/features/purchase-orders) messages — sent, arrives today, received, supplier updates — use these hubs too. See [Integrations](/features/integrations).
### Email suppliers automatically
Switch on **Also email each reorder alert's supplier**. Each reorder alert then sends one email per supplier, listing all of their variants in it.
***
## Plans
| Feature | Free | Pro | Max |
| - | - | - | - |
| Stock table and Movement page | ✅ | ✅ | ✅ |
| Reorder settings (per variant, per location) | ❌ | Up to 50 | Unlimited |
| Share stock | ❌ | ✅ | ✅ |
| Reorder alerts and movement digest | ❌ | ✅ | ✅ |
| [Suppliers](/features/suppliers) | ❌ | ✅ | ✅ |
| [Purchase orders](/features/purchase-orders) open at once | ❌ | 10 | Unlimited |
Downgrading to Free switches off both stock alerts. Your reorder settings
and hub choices are kept, so an upgrade brings them back.
# Suppliers
Source: https://alius-docs.frimty.com/features/suppliers
Save who you reorder from, and which locations and products each supplier serves
## Overview
A **supplier** is who you buy stock from. Once Alius knows who serves each product at each location, it can:
* name the right supplier on every [reorder alert](/features/stock);
* email that supplier a reorder request — automatically or with one tap;
* fill in the supplier on a new [purchase order](/features/purchase-orders);
* use the supplier's lead time in the Stock forecast.
Open **Suppliers** in the app menu, or from the button on the Stock page.
***
## Adding a supplier
Click **Add supplier**. The form has three cards.
### Details
| Field | Notes |
| - | - |
| **Name** | Shown on alerts and purchase orders. |
| **Email** | Where reorder requests and purchase orders are sent. One email is one supplier. |
| **Lead time (days)** | Optional. How long this supplier takes to deliver. Used by the Stock forecast. |
### Contact details
An optional postal address: country/region, address, apartment, city, state/province and postal code. The state and postal code fields follow the country you pick, using the same country list as the Shopify admin.
### What this supplier serves
Tell Alius what this supplier delivers, and where. Each row is a **Location** plus a **Product**:
* Leave **Location** empty to mean "every location".
* Leave **Product** empty to mean "every product".
* In the product picker, tick **all variants** to cover the whole product (new variants added later are covered too), or tick **only some** to cover just those variants.
Rows are saved with the rest of the form — **Discard** undoes them.
***
## Which supplier wins
A variant can match more than one row. The **most specific** row wins:
| Rank | The row names… | Reads as |
| - | - | - |
| 1 | location + variant | "This supplier, for this variant, here" |
| 2 | variant | "Whoever makes this variant" |
| 3 | location + product | "This supplier, for this product, here" |
| 4 | product | "Whoever makes this product" |
| 5 | location | "Whoever serves this location" |
| 6 | nothing | "The shop's default supplier" |
A product or variant row says who **makes** it. A location row only says where it is **kept**. So "Acme makes the S size" beats "Globex supplies the hoodie at the warehouse".
If two rows are equally specific, the oldest one wins.
Most shops need only a few rows: one default supplier with no location and no
product, plus a row for each product that comes from somewhere else.
***
## Lead time
Lead time is used in this order:
1. The lead time you set for the variant in **Reorder settings** on the Stock page.
2. Otherwise, the supplier's **Lead time (days)**.
3. Otherwise, the default of 7 days.
***
## Emails to suppliers
* **On a reorder alert** — each row with a supplier gets an **Alert supplier** button. One tap emails that supplier a reorder request for that variant.
* **Automatically** — on the Stock **Alerts** page, switch on **Also email each reorder alert's supplier**. Each alert then sends one email per supplier, listing all of their variants in it.
Alius never asks a supplier for 0 units. A row with no suggested quantity is left out of the email.
***
## Managing suppliers
The Suppliers list shows each supplier's name, email and lead time. Use **Search suppliers** to find one. Select rows to delete them — their "What this supplier serves" rows are deleted too.
Purchase orders already sent to a deleted supplier keep its name and email.
***
## Plans
Free keeps **1** supplier, Pro keeps **10**, and Max has no limit. Inactive suppliers count too. A downgrade never removes a supplier — you just cannot add more. See [Pricing](/guides/pricing).
# Templates
Source: https://alius-docs.frimty.com/features/templates
Customize notification message content using Markdown and dynamic variables
## Overview
Templates control the text content of notifications. If a trigger has no template assigned, Alius uses a built-in default format. Custom templates let you control exactly what appears in each notification using Markdown and `{{variable}}` placeholders.
***
## Template Types
Each template is scoped to an entity type, which determines which variables are available:
| Type | Available variables |
| - | - |
| Product | `product.*`, `product_previous.*` |
| Order | `order.*` |
| Customer | `customer.*` |
| Returns | `returns.*` |
| Cart | `cart.*` |
***
## Creating a Template
1. Go to **Templates** in the sidebar.
2. Click **Create Template**.
3. Fill in:
* **Title** — Name for the template (e.g., "High-value order alert")
* **Type** — Entity type (Product, Order, Customer, Returns, or Cart)
* **Content** — The message body using Markdown and variables
4. Click **Save**.
The template is then available in the trigger form's template picker.
***
## Markdown Syntax
Templates support a limited Markdown subset:
| Syntax | Output |
| - | - |
| `## Heading` | Bold heading / header block |
| `**bold text**` | Bold text |
| `[label](url)` | Clickable link |
| `---` | Horizontal divider |
| Plain text | Rendered as-is |
Markdown is converted per hub at send time:
* **Slack**: Headings → bold, links → `` format, `---` → divider block
* **Email**: Full HTML rendering with inline CSS
* **Telegram**: Headings → `*bold*`, links → Markdown v1 format, `---` → `──────────`
***
## Color Customization
Templates have optional color settings that apply per hub:
| Setting | Hub | Description | Default |
| - | - | - | - |
| Email Header Color | Email | Background color of the email header bar | `#008060` |
| Email Link Color | Email | Color of hyperlinks in the email body | `#008060` |
| Telegram Background | Telegram | Background color accent in the Telegram message | `#008060` |
Colors are entered as hex values (e.g., `#FF5733`).
***
## Template Priority
When a notification is sent, Alius resolves the message content in this order:
1. **Linked Template** — If the trigger has a `templateId`, the saved template's content is used.
2. **Inline Message Template** — If the trigger has a custom message stored directly on the trigger record.
3. **Default Template + Conditions** — The built-in default for the entity type, automatically extended with any condition fields from the trigger.
4. **Built-in Formatter** — A fallback that generates a readable summary of what changed.
### Auto-Extension with Condition Fields
When a trigger uses the default template and has conditions configured, the default template is automatically extended to include those condition fields. For example, if your trigger has a condition on `inventoryTotal`, the notification will include:
```
Total Inventory: {{product.inventoryTotal}}
Previous Total Inventory: {{product_previous.inventoryTotal}}
```
***
## Built-in Default Templates
If no custom template is selected, Alius uses these defaults:
**Product Updated:**
```
Product Updated: {{product.title}}
Title:
Previous: {{product_previous.title}}
New: {{product.title}}
View Product in Shopify: {{product.adminUrl}}
```
**Order Created:**
```
Order Created: {{order.name}}
Customer: {{order.customerFirstName}} {{order.customerLastName}}
Total: {{order.totalPrice}} {{order.currency}}
View Order in Shopify: {{order.adminUrl}}
```
**Customer Updated:**
```
Customer Updated: {{customer.firstName}} {{customer.lastName}}
Email: {{customer.email}}
Tags: {{customer.tags}}
View Customer in Shopify: {{customer.adminUrl}}
```
**Cart Abandoned:**
```
Cart Abandoned
Customer: {{cart.firstName}} {{cart.lastName}}
Email: {{cart.customerEmail}}
Total: {{cart.totalPrice}} {{cart.currency}}
Items: {{cart.lineItemCount}}
Recovery URL: {{cart.recoveryUrl}}
```
***
## Template Variables Reference
Use `product_previous.*` variants for "previous" values in update notifications.
| Variable | Description |
| - | - |
| `{{product.id}}` | Product ID |
| `{{product.adminUrl}}` | Link to product in Shopify Admin |
| `{{product.title}}` | Product title |
| `{{product.status}}` | `active`, `draft`, or `archived` |
| `{{product.productType}}` | Product type classification |
| `{{product.vendor}}` | Vendor/manufacturer |
| `{{product.tags}}` | Comma-separated tags |
| `{{product.handle}}` | URL handle |
| `{{product.description}}` | Product description (HTML) |
| `{{product.publishedAt}}` | Publication date |
| `{{product.publishedScope}}` | Publication scope |
| `{{product.category}}` | Shopify product category |
| `{{product.isGiftCard}}` | Whether it's a gift card |
| `{{product.requiresSellingPlan}}` | Whether a selling plan is required |
| `{{product.hasOnlyDefaultVariant}}` | Whether only one variant exists |
| `{{product.outOfStockVariants}}` | Whether any variant is out of stock |
| `{{product.collections}}` | Collections the product belongs to |
| `{{product.price}}` | Product price |
| `{{product.compareAtPrice}}` | Compare-at price |
| `{{product.unitPrice}}` | Per-unit price |
| `{{product.costPerItem}}` | Cost of goods per item |
| `{{product.inventoryTotal}}` | Total inventory across all variants |
| `{{product.requiresShipping}}` | Whether the product requires shipping |
| `{{product.inventoryTracked}}` | Whether inventory tracking is enabled |
| `{{product.taxable}}` | Whether tax is charged |
| `{{product.seoTitle}}` | SEO meta title |
| `{{product.seoDescription}}` | SEO meta description |
| `{{product_previous.*}}` | All above fields for the previous state |
| Variable | Description |
| - | - |
| `{{order.id}}` | Order ID |
| `{{order.adminUrl}}` | Link to order in Shopify Admin |
| `{{order.name}}` | Order name (e.g., `#1001`) |
| `{{order.orderNumber}}` | Order number |
| `{{order.totalPrice}}` | Grand total |
| `{{order.subtotalPrice}}` | Subtotal before tax/shipping |
| `{{order.totalDiscounts}}` | Total discount applied |
| `{{order.totalTax}}` | Total tax charged |
| `{{order.totalLineItemsPrice}}` | Sum of all line item prices |
| `{{order.totalOutstanding}}` | Amount remaining to be paid |
| `{{order.totalWeight}}` | Combined item weight |
| `{{order.currentTotalPrice}}` | Current total after edits |
| `{{order.currentSubtotalPrice}}` | Current subtotal after edits |
| `{{order.totalTipReceived}}` | Tip amount |
| `{{order.currency}}` | Currency code |
| `{{order.presentmentCurrency}}` | Display currency |
| `{{order.financialStatus}}` | Financial status |
| `{{order.fulfillmentStatus}}` | Fulfillment status |
| `{{order.displayFinancialStatus}}` | Human-readable financial status |
| `{{order.displayFulfillmentStatus}}` | Human-readable fulfillment status |
| `{{order.cancelReason}}` | Cancellation reason |
| `{{order.paymentGatewayNames}}` | Payment methods used |
| `{{order.email}}` | Email on the order |
| `{{order.phone}}` | Phone number on the order |
| `{{order.customerId}}` | Associated customer ID |
| `{{order.customerEmail}}` | Customer's email |
| `{{order.customerFirstName}}` | Customer's first name |
| `{{order.customerLastName}}` | Customer's last name |
| `{{order.customerPhone}}` | Customer's phone |
| `{{order.buyerAcceptsMarketing}}` | Marketing opt-in status |
| `{{order.locale}}` | Customer locale |
| `{{order.landingSite}}` | Landing page URL |
| `{{order.sourceName}}` | Order source |
| `{{order.tags}}` | Order tags |
| `{{order.note}}` | Order notes |
| `{{order.test}}` | Whether this is a test order |
| `{{order.confirmed}}` | Whether the order is confirmed |
| `{{order.edited}}` | Whether the order has been edited |
| `{{order.taxExempt}}` | Whether the order is tax exempt |
| `{{order.taxesIncluded}}` | Whether prices include tax |
| `{{order.dutiesIncluded}}` | Whether duties are included |
| `{{order.shippingName}}` | Name on shipping address |
| `{{order.shippingAddress1}}` | Shipping street address |
| `{{order.shippingCity}}` | Shipping city |
| `{{order.shippingProvince}}` | Shipping province/state |
| `{{order.shippingCountry}}` | Shipping country |
| `{{order.shippingZip}}` | Shipping postal code |
| `{{order.shippingPhone}}` | Shipping address phone |
| `{{order.billingName}}` | Name on billing address |
| `{{order.billingAddress1}}` | Billing street address |
| `{{order.billingCity}}` | Billing city |
| `{{order.billingProvince}}` | Billing province/state |
| `{{order.billingCountry}}` | Billing country |
| `{{order.billingZip}}` | Billing postal code |
| `{{order.billingPhone}}` | Billing address phone |
| Variable | Description |
| - | - |
| `{{customer.id}}` | Customer ID |
| `{{customer.adminUrl}}` | Link to customer in Shopify Admin |
| `{{customer.email}}` | Email address |
| `{{customer.firstName}}` | First name |
| `{{customer.lastName}}` | Last name |
| `{{customer.phone}}` | Phone number |
| `{{customer.tags}}` | Tags |
| `{{customer.locale}}` | Locale |
| `{{customer.acceptsMarketing}}` | Marketing opt-in status |
| `{{customer.amountSpent}}` | Lifetime amount spent |
| `{{customer.numberOfOrders}}` | Lifetime number of orders |
| `{{customer.productSubscriberStatus}}` | Subscription status |
| `{{customer.taxExemptions}}` | Tax exemption info |
| Variable | Description |
| - | - |
| `{{returns.status}}` | Current return status |
| `{{returns.returnReason}}` | Reason provided for the return |
| `{{returns.lineItemCount}}` | Number of items in the return |
| `{{returns.totalRefundAmount}}` | Total refund value |
| `{{returns.currency}}` | Currency code |
| `{{returns.orderId}}` | ID of the associated order |
| `{{returns.customerEmail}}` | Customer's email address |
| Variable | Description |
| - | - |
| `{{cart.id}}` | Checkout ID |
| `{{cart.recoveryUrl}}` | URL to recover the abandoned cart |
| `{{cart.customerEmail}}` | Customer's email address |
| `{{cart.firstName}}` | Customer's first name |
| `{{cart.lastName}}` | Customer's last name |
| `{{cart.totalPrice}}` | Cart total value |
| `{{cart.currency}}` | Currency code |
| `{{cart.lineItemCount}}` | Number of items in the cart |
# Triggers
Source: https://alius-docs.frimty.com/features/triggers
Define which Shopify events to watch and where to send notifications
## Overview
A trigger is a rule that watches for a specific Shopify event and sends a notification to a hub (Slack, Email, Telegram, or Discord) when that event occurs. Each trigger can be filtered with [conditions](/features/conditions) and scheduled for immediate or batched delivery.
***
## Trigger Types
Alius supports 20 trigger types across six Shopify entities:
### Product
| Trigger Type | Fires when… |
| - | - |
| Product created | A new product is added to the store |
| Product updated | Any field on an existing product changes |
| Product deleted | A product is removed from the store |
### Order
| Trigger Type | Fires when… |
| - | - |
| Order created | A new order is placed |
| Order updated | An existing order's details change |
| Order paid | An order's payment is confirmed |
| Order fulfilled | An order is marked as fulfilled |
### Refund
| Trigger Type | Fires when… |
| - | - |
| Refund created | A refund is issued on an order |
### Customer
| Trigger Type | Fires when… |
| - | - |
| Customer created | A new customer account is created |
| Customer updated | A customer's profile or preferences change |
| Customer deleted | A customer record is removed |
### Returns
| Trigger Type | Fires when… |
| - | - |
| Return requested | A customer submits a return request |
| Return approved | A return request is approved |
| Return declined | A return request is declined |
| Return processing | A return is being processed |
| Return closed | A return is closed |
| Return cancelled | A return is cancelled |
| Return reopened | A previously closed return is reopened |
| Return updated | Any field on a return changes |
### Cart
| Trigger Type | Fires when… |
| - | - |
| Cart abandoned | A checkout is abandoned (no purchase completed) |
***
## Trigger Fields
Each trigger has the following configurable fields:
| Field | Required | Description |
| - | - | - |
| **Title** | Yes | A descriptive name shown in the triggers list |
| **Status** | Yes | Active (live) or Disabled (paused) |
| **Type** | Yes | The Shopify event to watch (see trigger types above) |
| **Notification Hub** | Yes | Where to send the notification: Slack, Email, Telegram, or Discord. Pro plan: select multiple hubs simultaneously |
| **Channels/Recipients** | Yes | For Slack: one or more enabled channels. For Email: verified recipients. For Telegram or Discord: the connected destination |
| **Schedule** | Yes | When to send: Instant, Hourly, Daily, Weekly, or Monthly. See [Schedule Types](/features/schedule-types) |
| **Template** | No | A saved [template](/features/templates) to use. Defaults to the built-in format if not set |
| **Conditions** | No | One or more field-level filters. See [Conditions](/features/conditions) |
***
## Trigger Status
Each trigger has an **Active** / **Disabled** toggle:
* **Active** — The trigger is live and will fire notifications when events occur.
* **Disabled** — The trigger is paused. No notifications are sent, but configuration is preserved.
Triggers can be enabled or disabled from the trigger form or from the triggers list.
***
## Creating a Trigger
Creating a trigger is a two-step process:
**Step 1 — Choose a template**
Clicking **Create Trigger** opens the **template picker** page. You can either:
* Select a **pre-built template** (see [Pre-built Templates](#pre-built-templates) below) to start with a pre-configured type and conditions.
* Click **Blank Template** to start from scratch.
**Step 2 — Fill in the form**
1. Fill in the **Title**.
2. The **Type** and **Conditions** are pre-filled if you chose a template — you can adjust them.
3. Select a **Notification Hub**. On the Free plan this is a single-select dropdown; on Pro it is a multi-select so you can send to several hubs at once.
4. Select the **Channels/Recipients** for each hub.
5. Select a **Schedule** (defaults to Instant; non-instant schedules require Pro).
6. Optionally select a saved **Template**.
7. Click **Create Trigger**.
The trigger starts processing events immediately.
***
## Pre-built Templates
The template picker offers nine ready-made configurations. Selecting one pre-fills the trigger type, category, conditions, and condition mode — all of which can be adjusted before saving.
| Template | Type | Pre-set Condition |
| - | - | - |
| Low Stock | Product updated | Inventory total \< 5 |
| Out of Stock | Product updated | Inventory total = 0 |
| High-Value Order | Order created | Total price > \$500 |
| Abandoned Checkout | Cart abandoned | — |
| New Order | Order created | — |
| Order Refund | Refund created | — |
| Return from Customer | Return requested | — |
| Return from Admin | Return approved | — |
| New Customer | Customer created | — |
Templates are client-side only — no extra data is stored for choosing a template.
***
## Multi-Hub Notifications (Pro)
On the **Pro plan**, a single trigger can send to multiple hubs simultaneously — for example, Slack and Email and Discord all at once.
* The hub selector on the trigger form changes to **multi-select checkboxes**.
* Each selected hub uses its own channel/recipient configuration.
* Each hub+recipient pair produces a separate entry in [Notification History](/features/notification-history).
On the **Free plan**, only one hub can be selected per trigger. A banner in the form explains the restriction and links to the upgrade page.
***
## Editing and Deleting Triggers
* Click any trigger row on the **Triggers** page to open the edit form.
* Use the checkbox column to select multiple triggers and delete them in bulk.
* A confirmation modal appears before deletion.
***
## Trigger Limits
| Plan | Active Trigger Limit |
| - | - |
| Free | 3 |
| Pro | 10 |
| Max | Unlimited |
See [Pricing](/guides/pricing) for all plan details.
When the plan limit is reached:
* The **Create Automation** button is disabled with a warning banner.
* The banner includes an **Upgrade** button linking to Shopify's pricing page.
* The server also enforces the limit — the form submission is rejected if the UI is bypassed.
# Best Practices
Source: https://alius-docs.frimty.com/guides/best-practices
Proven trigger configurations for the most common Shopify store alerts
## Overview
This guide covers the most popular alert setups that Shopify store owners rely on daily. Each recipe includes the exact trigger configuration, recommended conditions, and a suggested custom template — all achievable with Alius's current feature set.
***
## 1. Low Stock Alert
**Why it matters:** Running out of stock on a best-seller means lost revenue and disappointed customers. A low-stock alert gives you lead time to reorder before it's too late.
### Configuration
| Setting | Value |
| - | - |
| **Title** | Low Stock Warning |
| **Type** | Product updated |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Total Inventory | Less than | 10 |
| Inventory Tracked | Equals | true |
### Suggested Template
```
🚨 Low Stock Alert: {{product.title}}
Inventory is running low!
Current Stock: {{product.inventoryTotal}}
Previous Stock: {{product_previous.inventoryTotal}}
Vendor: {{product.vendor}}
Product Type: {{product.productType}}
Status: {{product.status}}
⚡ Reorder now before it's too late!
View Product: {{product.adminUrl}}
```
### Why This Works
* The **Total Inventory** field is the sum of all variant inventory quantities, fetched via the Shopify GraphQL API.
* Adding **Inventory Tracked = true** prevents false alerts for products where inventory isn't tracked (e.g., digital goods, services).
* Alius only fires this alert when the inventory value **actually changes** (thanks to snapshot-based change detection), so you won't get spam from unrelated product updates.
### Variations
| Variation | Condition Change |
| - | - |
| Critical stock (almost out) | Total Inventory \< 3 |
| Warehouse buffer | Total Inventory \< 50 |
| Per-vendor monitoring | Add condition: Vendor Equals "\[Vendor Name]" |
***
## 2. High-Value Order Alert
**Why it matters:** Large orders deserve immediate attention — faster fulfillment, personalized thank-you notes, and fraud review.
### Configuration
| Setting | Value |
| - | - |
| **Title** | High-Value Order |
| **Type** | Order created |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Total Price | Greater than | 200 |
### Suggested Template
```
💰 High-Value Order: {{order.name}}
Total: {{order.totalPrice}} {{order.currency}}
Customer: {{order.customerFirstName}} {{order.customerLastName}}
Email: {{order.email}}
Financial Status: {{order.financialStatus}}
Fulfillment: {{order.fulfillmentStatus}}
Shipping To:
{{order.shippingName}}
{{order.shippingCity}}, {{order.shippingProvince}} {{order.shippingCountry}}
View Order: {{order.adminUrl}}
```
### Variations
| Variation | Condition Change |
| - | - |
| VIP threshold (\$500+) | Total Price > 500 |
| Specific currency | Add: Currency Equals "USD" |
| Exclude test orders | Add: Test Order Equals "false" |
***
## 3. New Customer Welcome Alert
**Why it matters:** New customers are a growth signal. Alerting your team lets you welcome them, trigger onboarding sequences, or flag trends in acquisition.
### Configuration
| Setting | Value |
| - | - |
| **Title** | New Customer Signup |
| **Type** | Customer created |
| **Condition Mode** | (No conditions — fire for all new customers) |
### Suggested Template
```
👋 New Customer: {{customer.firstName}} {{customer.lastName}}
Email: {{customer.email}}
Phone: {{customer.phone}}
Accepts Marketing: {{customer.acceptsMarketing}}
View Customer: {{customer.adminUrl}}
```
### With Conditions (Marketing-Opted-In Customers Only)
| Field | Operator | Value |
| - | - | - |
| Accepts Marketing | Equals | true |
This filters to only customers who opted in to marketing — ideal for triggering welcome email sequences.
***
## 4. Order Fulfillment Status Change
**Why it matters:** Tracking fulfillment status changes helps operations teams stay on top of shipping, identify delays, and update customers proactively.
### Configuration
| Setting | Value |
| - | - |
| **Title** | Order Fulfilled |
| **Type** | Order updated |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Fulfillment Status | Equals | fulfilled |
### Suggested Template
```
📦 Order Fulfilled: {{order.name}}
Customer: {{order.customerFirstName}} {{order.customerLastName}}
Email: {{order.email}}
Total: {{order.totalPrice}} {{order.currency}}
Shipped To:
{{order.shippingCity}}, {{order.shippingCountry}}
View Order: {{order.adminUrl}}
```
### Variations
| Variation | Condition Change |
| - | - |
| Partially fulfilled | Fulfillment Status Equals "partial" |
| Not yet fulfilled | Fulfillment Status Equals "unfulfilled" |
***
## 5. Refund & Cancellation Monitor
**Why it matters:** Spotting refunds and cancellations quickly lets you reach out to unhappy customers, investigate quality issues, and track return rates.
### Configuration (Refund Alert)
| Setting | Value |
| - | - |
| **Title** | Order Refunded |
| **Type** | Order updated |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Financial Status | Equals | refunded |
### Configuration (Cancellation Alert)
| Setting | Value |
| - | - |
| **Title** | Order Cancelled |
| **Type** | Order updated |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Financial Status | Equals | voided |
### Suggested Template (Refund)
```
⚠️ Order Refunded: {{order.name}}
Total Refunded: {{order.totalPrice}} {{order.currency}}
Customer: {{order.customerFirstName}} {{order.customerLastName}}
Email: {{order.email}}
Cancel Reason: {{order.cancelReason}}
View Order: {{order.adminUrl}}
```
***
## 6. Product Price Change Alert
**Why it matters:** Unintended price changes can cost revenue or erode customer trust. Monitoring price changes catches mistakes before they impact sales.
### Configuration
| Setting | Value |
| - | - |
| **Title** | Price Change Monitor |
| **Type** | Product updated |
| **Condition Mode** | (No conditions — monitor all price changes) |
### Suggested Template
```
💲 Price Change: {{product.title}}
Current Price: {{product.price}}
Previous Price: {{product_previous.price}}
Compare at Price: {{product.compareAtPrice}}
Previous Compare at: {{product_previous.compareAtPrice}}
Cost per Item: {{product.costPerItem}}
Vendor: {{product.vendor}}
View Product: {{product.adminUrl}}
```
Since Alius's snapshot system tracks all product fields, this trigger will fire whenever **any** product field changes. The template ensures the price information is always visible even if the change was to a different field. For true price-only alerts, add a condition: **Price Doesn't Equal 0** (to filter out products without prices), or use multiple triggers with specific price thresholds.
### Variation: Significant Price Drop
| Field | Operator | Value |
| - | - | - |
| Price | Less than | 20 |
This alerts you when any product's price drops below \$20 — useful for catching accidental discounts.
***
## 7. International / Regional Order Routing
**Why it matters:** If you ship internationally, certain countries may require customs documentation, different carriers, or longer handling times. Routing these orders to a dedicated Slack channel keeps your logistics team organized.
### Configuration
| Setting | Value |
| - | - |
| **Title** | International Order (Non-US) |
| **Type** | Order created |
| **Channel** | #international-orders |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Shipping Country | Doesn't Equal | US |
### Suggested Template
```
🌍 International Order: {{order.name}}
Shipping To: {{order.shippingCountry}}
{{order.shippingName}}
{{order.shippingAddress1}}
{{order.shippingCity}}, {{order.shippingProvince}} {{order.shippingZip}}
Total: {{order.totalPrice}} {{order.currency}}
Customer: {{order.customerFirstName}} {{order.customerLastName}}
View Order: {{order.adminUrl}}
```
### Variation: Specific Country Alerts
| Goal | Condition |
| - | - |
| Orders from Canada | Shipping Country Equals "CA" |
| EU orders | Shipping Country Contains "DE" (repeat for each EU country, condition mode = **Any**) |
***
## 8. VIP Customer Activity Tracker
**Why it matters:** Your biggest spenders deserve VIP treatment. Track when their profiles are updated so you can maintain personalized service.
### Configuration
| Setting | Value |
| - | - |
| **Title** | VIP Customer Change |
| **Type** | Customer updated |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Lifetime Amount Spent | Greater than | 1000 |
### Suggested Template
```
⭐ VIP Customer Update: {{customer.firstName}} {{customer.lastName}}
Email: {{customer.email}}
Lifetime Spent: {{customer.amountSpent}}
Total Orders: {{customer.numberOfOrders}}
Tags: {{customer.tags}}
View Customer: {{customer.adminUrl}}
```
***
## 9. Product Deleted / Unpublished Monitor
**Why it matters:** Accidental product deletions or status changes to "draft" can make products disappear from your storefront. Catching these immediately prevents lost sales.
### Configuration (Deleted)
| Setting | Value |
| - | - |
| **Title** | Product Deleted Alert |
| **Type** | Product deleted |
| **Condition Mode** | (No conditions — fire for all deletions) |
### Configuration (Unpublished/Archived)
| Setting | Value |
| - | - |
| **Title** | Product Archived |
| **Type** | Product updated |
| **Condition Mode** | Any condition can match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Status | Equals | draft |
| Status | Equals | archived |
### Suggested Template (Deleted)
```
🗑️ Product Deleted: {{product.title}}
This product has been permanently removed from your store.
Vendor: {{product.vendor}}
Type: {{product.productType}}
Tags: {{product.tags}}
```
***
## 10. Tagged Order Routing
**Why it matters:** Many merchants use order tags to flag special handling — wholesale orders, subscription renewals, gift orders, etc. Routing tagged orders to dedicated channels keeps workflows clean.
### Configuration
| Setting | Value |
| - | - |
| **Title** | Wholesale Order |
| **Type** | Order created |
| **Channel** | #wholesale |
| **Condition Mode** | All conditions must match |
**Conditions:**
| Field | Operator | Value |
| - | - | - |
| Tags | Contains | wholesale |
### Suggested Template
```
🏷️ Wholesale Order: {{order.name}}
Tags: {{order.tags}}
Total: {{order.totalPrice}} {{order.currency}}
Customer: {{order.customerFirstName}} {{order.customerLastName}}
Source: {{order.sourceName}}
Payment: {{order.paymentGatewayNames}}
View Order: {{order.adminUrl}}
```
### Variations
| Goal | Condition |
| - | - |
| Gift orders | Tags Contains "gift" |
| Subscription renewal | Tags Contains "subscription" |
| Priority shipping | Tags Contains "rush" or "express" |
***
## Free Plan Strategy
On the **Free plan** (1 trigger limit), here's how to maximize value:
**Use a broad trigger** with a well-crafted template to cover the most ground. The best single-trigger options are:
1. **"Order created" (no conditions)** — Captures every new sale. The most universally useful alert for solo merchants.
2. **"Order created" with Total Price > \[threshold]** — If you get high volume, filter to only significant orders.
3. **"Product updated" with Total Inventory \< 10** — If inventory management is your top priority.
When you're ready for more granular control, upgrade to **Pro** for unlimited triggers and create targeted alerts for each scenario in this guide.
***
## Channel Organization Tips
Use channels like `#orders`, `#inventory-alerts`, `#customer-activity` to keep different alert types separated.
Send critical alerts (low stock, high-value orders) to a channel with Slack notifications enabled. Send informational alerts (new customers, product updates) to a channel with notifications muted.
Send order alerts to the fulfillment team's channel, inventory alerts to operations, and customer alerts to customer success.
Configure per-channel notification preferences in Slack so team members are only interrupted by truly urgent alerts.
# Pricing
Source: https://alius-docs.frimty.com/guides/pricing
Alius Free, Pro, and Max plans — what each plan includes, its limits, and how billing works
## Plans Overview
Alius has three plans. Free covers store alerts and a small working Stock setup — enough to try
reorder settings, the daily reorder alert, [Suppliers](/features/suppliers) and
[Purchase orders](/features/purchase-orders) on a few products. Pro adds Insights, Guards,
real-time reorder alerts and Stock for your whole catalog. Max removes every limit.
**\$0 / month**
* ✅ 3 active triggers
* ✅ All trigger types & conditions
* ✅ All schedule types
* ✅ Custom templates
* ✅ Slack, Email, Telegram, Discord, HTTP
* ✅ One hub per trigger
* ✅ Stock table & Movement page
* ✅ **Reorder settings** for up to 10 variant-locations
* ✅ **Daily** reorder alert & weekly movement digest
* ✅ **1 supplier** and **1 open purchase order**
* ❌ Insights & Guards
* ❌ Real-time reorder alerts & Share stock
**\$9.99 / month**
* ✅ 10 active triggers
* ✅ **Multi-hub** per trigger
* ✅ **AI summaries** on digests
* ✅ **3 Insights** and **3 Guards**
* ✅ **Unlimited** reorder settings
* ✅ **Real-time** reorder alerts & Share stock
* ✅ **Suppliers** — up to 10
* ✅ **Purchase orders** — up to 10 open at once
**\$19.99 / month**
* ✅ **Unlimited** triggers
* ✅ **Unlimited** Insights and Guards
* ✅ **Unlimited** suppliers and open purchase orders
* ✅ Everything in Pro
## Plan Comparison
| Feature | Free | Pro | Max |
| - | - | - | - |
| **Price** | \$0/mo | \$9.99/mo | \$19.99/mo |
| **Automations** | | | |
| Active triggers | 3 | 10 | Unlimited |
| Trigger types & conditions | ✅ | ✅ | ✅ |
| Schedule types (instant & digests) | ✅ | ✅ | ✅ |
| Active Insights (anomaly alerts) | ❌ | 3 | Unlimited |
| Active Guards (risky-change alerts) | ❌ | 3 | Unlimited |
| AI summaries on digests | ❌ | ✅ | ✅ |
| **Delivery** | | | |
| Slack / Email / Telegram / Discord / HTTP | ✅ | ✅ | ✅ |
| Hubs per trigger | 1 | Multiple | Multiple |
| Custom templates | ✅ | ✅ | ✅ |
| Buttons in chat messages | ✅ | ✅ | ✅ |
| **Stock** | | | |
| Stock table & Movement page | ✅ | ✅ | ✅ |
| Reorder settings (variant × location) | 10 | Unlimited | Unlimited |
| Reorder alert | Daily | Daily or real-time | Daily or real-time |
| Weekly movement digest | ✅ | ✅ | ✅ |
| Share stock between locations | ❌ | ✅ | ✅ |
| Suppliers | 1 | 10 | Unlimited |
| Purchase orders — open at once | 1 | 10 | Unlimited |
| **Other** | | | |
| Notification history & dashboard | ✅ | ✅ | ✅ |
Only **active** automations count toward a limit — disabled ones do not use a
slot. A purchase order counts while it is **open**: a draft, ordered, or
partially received. Received and cancelled orders never count, so your order
history has no limit.
***
## Frequently Asked Questions
* **Triggers, Insights, Guards:** only active ones count.
* **Reorder settings:** each variant at each location with its own settings
uses one slot.
* **Suppliers:** every supplier counts, active or inactive.
* **Purchase orders:** only open ones count — drafts, ordered, and partially
received. Receive or cancel an order to free a slot.
Everything you already have keeps working. You just can't add a new one
until you free a slot or upgrade. For example, a Pro store with 10 open
purchase orders can still edit, send, receive and cancel them — it only
can't create an 11th.
No — nothing is deleted.
* Extra triggers, Insights and Guards are set to "disabled". The **oldest**
ones stay active, up to the new plan's limit.
* Extra reorder settings are switched off, oldest kept.
* Suppliers and purchase orders are **never** touched. If you have more
than the new plan allows, they all keep working; you can add new ones
once you are back under the limit.
Upgrade again to turn everything back on.
Stock keeps working, within the Free limits. Your 10 oldest reorder
settings stay on; the rest are switched off. A real-time reorder alert
becomes a daily one. The weekly movement digest and your hub choices stay
as they are. Suppliers are kept. Purchase orders you already sent keep
working — you can still receive and cancel them, and you still get the
"arrives today" reminder.
The features are the same. Max removes the limits: unlimited triggers,
Insights, Guards, suppliers and open purchase orders.
Click **Manage Plan** on the app's home page. Plans are managed by Shopify, and
the charge appears on your Shopify bill. A downgrade takes effect at the end
of the billing period you already paid for.
Your subscription state is synced from Shopify automatically. An active
paid subscription is restored.
# Introduction
Source: https://alius-docs.frimty.com/introduction
What Alius is and how it works
## What is Alius?
**Alius** is a Shopify app that delivers the right store information to **Slack, Email, Telegram, and Discord** at the right time — without you ever opening the Shopify admin.
It does this in two ways:
* **Triggers** — react to a Shopify event (new order, low stock, return…) and alert you instantly. Managed under the **Automations** section.
* **Inventory** — **Stock** shows what runs out at each location and how many units to reorder, and sends reorder alerts. **Suppliers** and **Purchase orders** let you send orders to suppliers and receive them into Shopify — right from chat.
***
## How it works
Connect Slack via OAuth, add verified email recipients, link a Telegram chat using a connection token, or paste a Discord incoming webhook URL. Each hub is configured on the **Integrations** page.
Add a Trigger to watch for events and pick which hub it notifies. Turn on Stock alerts to hear what to reorder at each location.
Alius processes Shopify webhooks in real time and checks your stock at every location, delivering everything to your configured hubs.
***
## Core Concepts
| Concept | Description |
| - | - |
| **Trigger** | A rule that defines which Shopify event to watch, where to send the notification, and optional filters and schedule. |
| **Supplier** | Who you buy from, and which locations and products they serve. |
| **Stock** | Per-location inventory with a stockout forecast, suggested reorder quantities, and reorder alerts. Settings and alerts need Pro/Max. |
| **Purchase order** | An order to one supplier for one location. Sent by email, answered by the supplier on a page, received into Shopify. |
| **Condition** | An optional filter on a trigger — e.g., "only when Total Price > 50" or "only when Vendor equals Nike". |
| **Template** | A reusable message format with dynamic placeholders like `{{product.title}}` or `{{order.totalPrice}}`. |
| **Integration** | A connection to a notification hub: Slack, Email, Telegram, or Discord. |
| **Schedule** | Controls delivery timing: Instant (immediate) or batched (Hourly, Daily, Weekly, Monthly). |
| **Snapshot** | An internal record of the last known state of a product, order, or customer — used to detect what actually changed. |
| **History** | A log of all notification delivery attempts with status, recipient, and error details. |
***
## Supported Events
Alius monitors the following Shopify events:
| Entity | Events |
| - | - |
| **Products** | Created · Updated · Deleted |
| **Orders** | Created · Updated · Paid · Fulfilled |
| **Refunds** | Created |
| **Customers** | Created · Updated · Deleted |
| **Returns** | Requested · Approved · Declined · Processing · Closed · Cancelled · Reopened · Updated |
| **Cart** | Abandoned |
Each event type supports [conditions](/features/conditions) with dozens of filterable fields.
***
## Features
20 trigger types across products, orders, customers, returns, and carts.
Per-location stock, stockout forecast, reorder quantities, and reorder
alerts.
Who you buy from, and which locations and products each one serves.
Send POs to suppliers and receive them into Shopify — even from chat.
Filter triggers with field-level conditions across 50+ fields per entity.
Deliver notifications to Slack, Email, Telegram, or Discord.
Customize message content with Markdown and dynamic `{{variable}}` placeholders.
Send instantly or batch notifications hourly, daily, weekly, or monthly.
View delivery logs with status, recipient, message preview, and error details.
***
## Next Steps
Get up and running in under 5 minutes.
Free, Pro, and Max plan details.
# Quickstart
Source: https://alius-docs.frimty.com/quickstart
Get Alius up and running in under 5 minutes
## Prerequisites
* A **Shopify store** (development or live)
* A notification destination: a **Slack workspace**, an **email address**, a **Telegram chat**, or a **Discord channel with an incoming webhook**
## Step 1 — Install Alius
Install Alius from the Shopify App Store. After installation, Alius appears in your Shopify Admin under **Apps → Alius**.
When you open the app for the first time, the **Home** page displays a setup guide checklist.
## Step 2 — Connect a Notification Hub
Alius supports four notification hubs: **Slack**, **Email**, **Telegram**, and **Discord**. Connect at least one before creating triggers.
Navigate to **Integrations** in the left sidebar and follow the steps for your chosen hub:
**Slack (OAuth):**
1. Click **Connect to Slack**.
2. Authorize on Slack's OAuth page and click **Allow**.
3. Once connected, enable the channels where Alius should post and click **Save**.
**Email:**
1. Enter an email address in the Email section and click **Add Recipient**.
2. The recipient must click the verification link sent to that address.
3. Once verified, toggle the recipient to **Active**.
**Telegram:**
1. Click **Generate Connection Token** — the token is valid for 15 minutes.
2. In your Telegram chat, send `/connect ` to the Alius bot.
3. The bot confirms the connection.
**Discord:**
1. In Discord, open the target channel → **Channel Settings** → **Integrations** → **Webhooks** → **New Webhook**.
2. Copy the webhook URL.
3. Paste it into the **Webhook URL** field in the Discord section and click **Connect**.
See the [Integrations](/features/integrations) page for full details on each hub.
## Step 3 — Send a Test Message
On the **Integrations** page, click **Send test notification** for your connected hub. Confirm the message arrives at the destination.
## Step 4 — Create Your First Trigger
1. Navigate to **Triggers** in the left sidebar.
2. Click **Create Trigger**. You'll land on the **template picker** page.
3. Choose a pre-built template (e.g., "New Order") or click **Blank Template** to start from scratch.
4. Fill in the form:
* **Title:** A descriptive name (e.g., "New Order Alert").
* **Type:** Pre-filled if you chose a template — change it if needed.
* **Notification Hub:** Select your connected hub.
* **Channels/Recipients:** Pick the target channel, email, Telegram chat, or Discord webhook.
5. Click **Create Trigger**.
Alius will now send a notification every time the selected event occurs.
## Step 5 — (Optional) Add Conditions
To filter which events trigger a notification — for example, only orders over \$100:
1. On the trigger form, click **⊕** under "Additional conditions".
2. Set:
* **Field:** Total Price
* **Operator:** Greater than
* **Value:** 100
3. Save the trigger.
See [Conditions](/features/conditions) for the complete list of filterable fields and operators.
## What's Next?
All 20 trigger types and configuration options.
Full setup guide for Slack, Email, Telegram, and Discord.
Customize notification message content.
Filter triggers with 50+ condition fields.