Get started in 2 steps
Create a Non-Stripe Transactions relay
In the Viably dashboard, click "+ New Relay" โ Transactions โ Non-Stripe Transactions. Give it a name, pick your Slack channels, and hit Create. You'll get a Bearer token and relay URL immediately.
POST your payload from your payment handler
After a successful payment in your backend, send a POST to the relay URL with your Bearer token in the Authorization header. Viably formats it and posts to Slack within seconds.
Authorization: Bearer <token> and store it in an environment variable โ never hardcode it.Payload reference
| Field | Status | Notes |
|---|---|---|
amount | required | Integer in minor currency units โ e.g. 4990 for $49.90. Divided by 100 before display. Also summed across events for batch totals and periodic revenue reports โ if missing or sent as a decimal, report figures will be wrong. |
currency | required | ISO 4217 code โ e.g. "USD", "EUR", "IDR". Defaults to USD if absent, but explicit is better. |
name | recommended | Customer full name. Shown as card subtitle with country flag if country is also provided. Falls back to email if absent. |
email | recommended | Customer email. Shown as a labelled field in the card body when name is also present. |
description | recommended | What was purchased โ shown as "Product". Falls back to the product field if absent. |
source | optional | Origin site or app (e.g. pay.myapp.com). Shown in the message footer. Suppresses the missing-source hint. |
title | optional | Overrides the default card header. Useful for branding โ e.g. '๐ฐ New Sale on Acme Pay'. |
submitted_at | optional | ISO 8601 timestamp of the transaction (e.g. "2026-04-27T08:30:00Z"). Shown as "Submitted at". |
phone | optional | Customer phone number. |
city | optional | Customer city. Joined with country into a "Location" field โ e.g. "Jakarta, ID". |
country | optional | ISO 3166-1 alpha-2 code โ e.g. "US", "ID", "SG". Drives the country flag emoji next to the customer name. |
amount must be an integer in the smallest currency unit, consistent with Stripe and most payment processors. Send 4990 for $49.90 โ not 49.90. Viably divides by 100 before display and sums raw integers for batch totals and periodic reports. Sending major units will make every revenue figure 100ร too large.Code examples
const VIABLY_TOKEN = process.env.VIABLY_RELAY_TOKEN;
const VIABLY_URL = "https://hq.viably.app/relay";
await fetch(VIABLY_URL, {
method: "POST",
headers: {
"Authorization": `Bearer ${VIABLY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
amount: 4990, // required โ minor units (4990 = $49.90)
currency: "USD", // required โ ISO 4217
name: "Samuel Chan", // recommended
email: "[email protected]", // recommended
description: "Pro Plan โ Monthly", // recommended โ shown as Product
source: "pay.myapp.com", // optional โ shown in message footer
title: "๐ฐ New Transaction", // optional โ overrides card header
submitted_at: new Date().toISOString(), // optional โ ISO 8601
phone: "+6287712121212", // optional
city: "Jakarta", // optional
country: "ID", // optional โ ISO 3166-1 alpha-2
}),
});channels array to the payload: "channels": ["C0XXXXXXX"]. Viably routes to those channels instead of the endpoint default, as long as the bot is a member.Periodic reporting
Revenue total
Viably sums the amount values across all events in the batch window and displays a Total Revenue figure. The sum is computed from the raw integers you send, so the minor-unit convention is load-bearing โ a stray decimal will corrupt every report total.
Transaction carousel
Up to 20 transactions are shown newest-first as swipeable cards. Each card shows amount and submission time as the title, customer name with country flag as the subtitle, and email, phone, city, and product in the body.
Revenue sparkline
When events span more than one time bucket, a sparkline (e.g. โโโโโโ
โโ) shows the relative revenue distribution across buckets at a glance โ taller bars mean more revenue in that slot.
Period label
A 1-day window shows a single date (e.g. Apr 25). A multi-day window shows a date range (e.g. Apr 19 โ Apr 25). All dates are rendered in your workspace's configured timezone.