These five playbooks walk through complete flows for a Discord supporter tier, a Telegram-only shop, a subscription switch, a Black Friday sale, and a platform migration.
Discord supporter tier
This walkthrough takes you from a Discord server with no monetization to a working paid
supporter tier in about 20 minutes.
What you will have at the end
- A Discord role that gets granted automatically when someone subscribes on your shop.
- The role is revoked when the subscription is canceled or fails, as long as “Remove role on
cancel” stays on. This setting is on by default.
- A customer dashboard your buyers use to manage their subscription themselves.
Prerequisites
- A Discord server you own (you need
Manage Server permission).
- A Shoppex shop with at least one payment gateway connected. If you do not have one, do
Quickstart first.
Step 1 — Connect Discord and invite the bot
In your Shoppex dashboard, open Settings → Integrations → Discord.
- Click Connect Discord. This is the OAuth step that links your Discord identity to your
Shoppex account.
- Pick the target server from the dropdown that appears.
- Click Invite Bot. Discord opens its OAuth approval flow asking you to authorize the
Shoppex bot on the server you picked.
- The bot requests Manage Roles, View Channels, Send Messages, and Embed
Links. Accept.
- Discord redirects you back to Shoppex with the bot connected.
In your Discord server settings, you will now see the Shoppex bot listed as a member.
Important: its role in the server hierarchy must sit above any role you intend to sell.
This is a Discord rule: bots can only manage roles below their own. If needed, drag the
Shoppex role up in Server Settings → Roles.
Step 2 — Create the supporter role
In Discord → Server Settings → Roles → Create Role. Give it a name like Supporter,
pick a color, set any permissions for private channels you want this role to see.
You can now connect this role to a Shoppex product.
Step 3 — Create the subscription product
Back in Shoppex → Products → New product.
- Type: Subscription (this is the product’s Type field, not the Discord role. The
Discord role comes next.)
- Title: “Supporter — Monthly” (or whatever fits).
- Price: Set monthly amount and billing interval.
Then scroll to the product’s Discord section and:
- Toggle Assign Role on.
- Pick the server.
- Pick the
Supporter role (loaded live from your server).
- Leave Remove role on cancel on (the default) so the role gets revoked when the
subscription ends.
Save the product. It is now live on yourshop.shoppex.io.
Step 4 — Test the flow yourself
Open your shop in an incognito window. Buy the product with one of your own gateways (or use
a Stripe test key if you connected one). You will see:
- Checkout asks you to link your Discord account.
- You authorize through Discord OAuth.
- You pay.
- Within a few seconds, the Supporter role appears on your Discord account.
If anything stalls, the order page in your dashboard tells you exactly which step is pending.
Step 5 — Announce it
Share the product link in your server (or anywhere). Buyers click → checkout → done.
What happens when someone subscribes
Each month:
- The subscription auto-renews against the gateway the buyer used at signup.
- If renewal succeeds, the role stays. Neither you nor the buyer needs to do anything.
- If renewal fails, Shoppex enters a 7-day grace period (configurable in shop settings). The
role stays. The buyer is asked to update payment.
- Once the subscription has two voided invoices total (cumulative across its lifetime, not
only consecutive), Shoppex auto-cancels it. The role is revoked at cancel time.
Buyers can cancel anytime from their customer dashboard. Cancellation behavior depends on the
gateway: see Subscriptions for the specifics. Stripe and
crypto cancel at the end of the billing period. PayPal cancels immediately.
Common questions
“Can I have multiple supporter tiers?” Yes. Create a separate product per tier
(Bronze / Silver / Gold), bound to different roles. A buyer can hold several at once.
“Can I grant roles across multiple servers?” Not from one product. Assign Role binds
to one role on one server. To cover multiple servers, create multiple products and either
bundle them or use addons.
“What if a buyer leaves my Discord server?” Shoppex cannot grant a role to someone who is
not in the server. The order pauses in pending-fulfillment until they rejoin. After they
rejoin, you can re-trigger fulfillment from the order page.
“What if I delete the role?” Shoppex cannot grant a role that no longer exists. Existing
holders lose it implicitly, because the role is gone, and new orders fail to fulfill.
Do not delete a Discord role that is tied to an active subscription. Existing holders lose
the role, and new orders fail to fulfill.
See Subscriptions for trials, plan changes, retries, and pauses on
any subscription product.
Telegram-only shop
This playbook connects a Telegram bot for sales and, if you want, hides the web storefront so
Telegram is the only sales channel.
What you will have at the end
- A Telegram bot connected to your Shoppex shop.
- The bot answers buyer questions and creates payment links right in the chat.
- Broadcasts and journeys to bring buyers back.
- (Optional) The web storefront at
yourshop.shoppex.io disabled, so the bot is the only
sales channel.
Prerequisites
- A Telegram bot you have created with @BotFather on Telegram. You will need its API
token, the long string that BotFather sends you after
/newbot.
- A Shoppex shop with at least one payment gateway connected.
Step 1 — Connect the bot
Open your Shoppex dashboard at Store → Telegram (/store/telegram).
- Click Connect bot or Add bot.
- Paste the bot token from BotFather.
- Save.
Shoppex verifies the token, fetches the bot’s profile, and registers it against your shop.
The bot is now connected and listening.
Step 2 — Turn on the AI sales agent
In the same Telegram page, configure the bot’s Agent. There are three modes:
CUSTOMER_SALES — the bot talks to buyers, answers product questions, creates payment
links when they want to buy.
MERCHANT_ASSISTANT — the bot works for you only: DM it to check orders or get daily
revenue. It does not talk to buyers.
BOTH — the same bot serves buyers and you, distinguished by who is chatting.
For a sales-channel use case, pick CUSTOMER_SALES (or BOTH if you also want to use
the bot yourself).
Step 3 — Test a purchase
DM your bot from a different Telegram account. Ask about a product, or say “I want to
buy X”. The agent will:
- Find the product in your catalog.
- Reply with the product info and a Pay now button.
- Tapping the button opens the Shoppex hosted checkout in Telegram’s in-app browser.
- The buyer pays through your normal gateways.
- Order confirmation is delivered both through email and (if the buyer linked Discord/Telegram
to their customer profile) directly in the chat.
The payment itself happens on checkout.shoppex.io, not inside Telegram natively. The bot
generates a Shoppex payment link and hands it over through an inline button.
Step 4 — Build out user management
Once buyers start interacting, the Users section of the Telegram dashboard fills up.
You can:
- See who has chatted with the bot (with last-seen, total interactions).
- Toggle per-user notification settings.
- Build Segments, saved filters like “buyers in the last 30 days” or “VIPs over $500”.
Step 5 — Set up broadcasts and journeys
For ongoing engagement:
Broadcasts are one-off announcements to a list. Draft a message, pick a segment or all
users, schedule it for later, or send immediately. Statuses: DRAFT, SCHEDULED, SENDING,
COMPLETED, CANCELLED, FAILED.
Journeys are automated triggers. They fire when an event happens for a user. Available
trigger types:
ORDER_COMPLETED — thank-you flow after a purchase.
ABANDONED_CART — nudge buyers who opened checkout but did not pay.
PAYMENT_REMINDER — invoice past due reminder.
SUBSCRIPTION_RENEWAL — renewal heads-up.
MANUAL — fired by you or the API on demand.
Journeys can branch and wait, for example “if a buyer has not paid after 4 hours, send the
discount code”.
Step 6 — (Optional) Disable the web storefront
If you do not want anyone visiting yourshop.shoppex.io, turn off the managed storefront from
Settings → Shop. The field is managedStorefrontEnabled. Turn it off, and optionally add
a redirect URL, for example to your Telegram bot’s t.me link.
After that, the public storefront URL no longer serves your shop. The Telegram bot is the
only entry point. Payment links and direct checkout URLs still work. They do not depend on
the storefront.
Common questions
“Can the bot accept payment directly in Telegram (no redirect)?” Not currently. Shoppex
generates a Shoppex-hosted checkout URL and the bot sends it as an inline button. The buyer
taps, pays in Telegram’s in-app browser. There is no native Telegram Stars or native Telegram
payments integration.
“Can buyers manage their subscription from the bot?” Yes for queries through the agent (“show
me my subscriptions”), but cancel and upgrade actions still go through their customer
dashboard on Shoppex.
“Multiple bots for the same shop?” Each shop can connect multiple bots. This is useful for
testing in a separate bot before you swap the primary bot, or for running different language
versions.
Switch to recurring
This playbook moves a product line from single-use codes, like Steam keys or activation
tokens, to an auto-renewing subscription.
It keeps the old product running, launches the new one, and moves customers over during the
renewal cycle. This is the safest migration path.
Why not edit the existing product?
Technically Shoppex allows changing a product’s type (the type field is mutable on update).
But changing SERIALS to SUBSCRIPTION on a live product does not carry over what you
actually need. It creates no automatic Stripe plan, migrates no past buyers to the new
billing terms, and handles no pending serial deliveries.
The clean path is to create a new subscription product alongside the old one, then
deactivate the old one once customers have moved.
Step 1 — Create the subscription product
Open Products → New product, the same page used in Discord supporter tier above:
- Type: Subscription
- Title: the new name (for example “Pro Access — Monthly”)
- Price: monthly amount
- Billing interval: Day / Week / Month / Year (and a count, for example interval=Month,
count=1 for monthly)
- Trial period: optional, up to 60 days
In the Discord section (if applicable), bind a supporter role with Assign Role so
subscribers get access automatically. See Discord supporter tier
above for the full Discord setup.
If your old product delivered files or serials on each purchase, set the subscription
product’s delivery type to match. Subscriptions can deliver SERIALS, FILE, SERVICE,
or DYNAMIC content on each renewal.
Save the product. It is now live on your storefront.
Step 2 — Announce the change to existing buyers
Email or message your existing customer list. Be explicit:
- The old product (one-time codes) is staying available through a specific date.
- The new subscription product is now live. Mention its benefits: for example a lower
monthly price, better access, or automatic renewal.
- After the cutover date, only the subscription product will be sold.
Tools available to you: the built-in email marketing (Marketing → Email), Telegram
broadcasts if you have a bot, and Discord announcements.
Step 3 — Move the old buyers
There is no automated way to convert a buyer’s past one-time purchase into a subscription.
The payment method changes from one-off to recurring, and the gateway agreement is different.
The buyer must subscribe again on their own.
The most reliable way to nudge them: offer a discount coupon on the first month of
subscription, restricted to existing customers. Create the coupon at Discounts
(/coupons):
- Type:
PERCENTAGE (or FIXED)
- Value: whatever feels right (20-50% on first month is typical for migration)
validUntil: a hard cutoff
maxUses: total count to cap exposure
Share the code in the same announcement. See Black Friday sale below for the full set of
coupon fields and limits.
Step 4 — Wind down the old product
When the cutover date arrives, deactivate the old product instead of deleting it. From the
old product’s settings, toggle it inactive. It disappears from your storefront, but the past
orders, delivered codes, and customer records all stay intact.
Do not delete the old product. Deleting it breaks historical order references. Toggle it
inactive instead.
What about Discord roles already granted?
If the old product granted a Discord role, those grants stay. The buyer keeps the role until
you remove it manually. Most merchants either:
- Let the old grants stand as a goodwill gesture (existing customers keep access forever).
- Set a date and bulk-revoke from the Discord side, with a clear announcement.
Subscription-bound roles are auto-revoked on cancel (when Remove role on cancel is on for
the subscription product), so the role lifecycle is automatic going forward.
Common questions
“Will the new subscription auto-charge buyers who had recurring billing somewhere else?”
No. Recurring billing is per-product per-buyer per-gateway. The new subscription is a fresh
authorization. The buyer goes through checkout once to set it up.
“Can I keep both running indefinitely?” Yes. Some merchants keep a one-time purchase
option for buyers who prefer not to subscribe, alongside the subscription as the default. Make
sure the pricing makes the subscription the clearly better deal.
Black Friday sale
This two-week walkthrough runs a major sale on Shoppex, built around Black Friday but equally
usable for Cyber Monday, end-of-quarter sales, or a launch.
What you will do
- Prep your catalog (which products are on sale, by how much).
- Create coupon codes, with limits and product-targeting.
- Build the buyer list to email and Telegram-blast.
- Schedule the email campaign for the moment the sale opens.
- Track conversions live and react if something underperforms.
- Run the post-mortem.
Two weeks before — prep
Pick the discount strategy. Coupon types Shoppex supports:
PERCENTAGE — N% off the order.
FIXED — fixed-amount discount.
(There is no built-in BOGO. For buy-one-get-one, use bundle products instead.)
For each coupon, configurable limits:
maxUses — total redemptions across all buyers (cap the exposure).
minOrderAmount — minimum order subtotal to be eligible.
maxDiscount — cap the absolute discount (useful for percent codes on big orders).
validFrom / validUntil — time window. Coupon code returns invalid outside these times.
- Product / variant binding — restrict to specific products. Without bindings, coupon
applies to anything.
Decide your codes:
- A general code (
BF25 for 25% off everything, capped at $X).
- Product-line specific codes (
PRO-BF for the Pro tier only).
- VIP code with bigger discount, low max-uses, shared only with your top customers.
Create them at Discounts (/coupons).
Build your email lists and segments. In Marketing → Email (/marketing/email), your
list of buyers is automatically maintained. Build segments based on what you want to target:
- All past buyers.
- Buyers in the last 90 days (recent and warm).
- High-value buyers (LTV > $X).
- Trial-only buyers (never converted to paid).
Segments are saved filters. Once you build one, it stays current as new customers come in.
Draft the email. Email Marketing’s template system is MJML-based. You can either:
- Use the builder to drag-and-drop the email.
- Write MJML directly if you want pixel-precise control.
Personalize the email with variables: first name, the buyer’s most-bought category, or the
discount code itself. These variables come from the campaign-recipient context.
Send a test to yourself before you schedule the campaign. A broken template can render
differently in each mail client.
Build a parallel Telegram blast (if you use Telegram). The same idea works on the
Telegram side. Store → Telegram → Broadcasts → New broadcast.
- Pick the target segment.
- Compose the message (include the coupon code or a deeplink).
- Schedule for the same moment as the email.
Sale day — go live
Schedule everything in advance. Do not manually click “Send” at 9am. Set the schedule the
night before instead. Both campaigns (emailMarketingCampaigns.scheduleAt) and Telegram
broadcasts support scheduled send. You wake up to the campaigns already going out.
Make sure your coupons’ validFrom matches the announcement time. If you email at 9am with
a code that says “valid from 10am”, buyers will hit “invalid code” on the first 100 tries,
and you will lose them.
Watch the dashboard. During the sale, watch these live indicators:
- Analytics → Revenue (
/analytics) — running revenue total.
- Orders page — orders coming in, filterable.
- Email campaign status — sent / delivered / opened / clicked counts, available per
campaign.
- Telegram broadcasts — same kind of stats, per broadcast.
Shoppex does not have a built-in coupon analytics dashboard. To see how many sales each code
drove, filter Orders by coupon code. Every order with a redeemed coupon has the code attached,
so you can read the count and revenue from there.
React if something underperforms. If the email got delivered but conversions are flat,
consider:
- A follow-up email 12-24 hours later with a different angle (urgency, social proof).
- Lower the coupon’s
minOrderAmount if you are getting “cart abandoned because code did not
apply” complaints.
- Create a deeper discount code for an off-hours segment.
If conversions are too strong on a wholesale-margin product, you can mark the coupon
inactive during the sale. Buyers who already redeemed it are unaffected, but the code stops
working for everyone else.
After the sale — post-mortem
Within a few days of close:
- Filter Orders by each coupon code. Count: total redemptions, average order value, total
revenue.
- Compare the results against the same week last month, or last year if you have the data.
This shows the real lift from the sale, not only orders from your existing buyers.
- Check Email Marketing stats: open rate, click rate, conversion rate per campaign.
- Note which segment converted best. That is where you focus for the next campaign.
Save the coupons, but mark them inactive. Keeping the codes intact preserves your historical
record, since orders that redeemed them stay linked.
Common pitfalls
- Forgetting
maxUses on a percent code shared publicly. If someone leaks it, you end up
refunding a thousand orders. Always cap maxUses.
- Email templates that break on iOS Mail. Test before scheduling. MJML compiles to
cross-client HTML but you still want to eyeball it.
- Coupon stacking. Shoppex applies one coupon per cart. If buyers complain that they
cannot use both codes, that is expected. Pick which coupon wins, usually the larger
discount.
- Shipping a sale on a day where one gateway is down. Test Stripe, PayPal, crypto
before the announcement goes out.
Migrate to Shoppex
This guide migrates an existing shop from Billgang, Sell.app, SellAuth, or
Komerza to Shoppex, using the same flow for every platform except the export step.
The export step is the only part that differs per platform. The whole migration usually takes
one to two hours of active work, plus a few hours of DNS propagation in the background.
What you will have at the end
- All your products live on Shoppex with the same SKUs.
- Payment gateways connected to your own accounts.
- Custom domain pointing at Shoppex (optional).
- Old shop links redirecting (manual on your side).
- No data lost.
You are looking for: products with prices and descriptions, license keys / serial pools,
and customer order history if available. Most platforms expose this under “Data Export”,
“Backup”, or “Tools” in their dashboard. Exact menu paths shift over time, so check the
current vendor docs if anything has moved.
The data shape you need is the same regardless of platform. The dump needs one row per
product, and one row per remaining serial or license key. If you have that, in CSV or JSON,
you can re-import everything.
You do not need to re-upload customers. Shoppex creates new customer records as buyers come
in. Save the export anyway: it is your archive.
Step 2 — Sign up for Shoppex and pick your shop URL
At dashboard.shoppex.io, create an account. Pick a slug for
your default URL (for example yourshop.shoppex.io).
If you plan to use a custom domain, the slug does not matter long-term. Buyers will reach
the custom domain instead.
Step 3 — Connect payment gateways
This is the biggest difference from your old platform: you connect your own gateway
accounts, not Shoppex’s. Open Settings → Payment gateways. Set up each one you want:
- Stripe — paste publishable and secret key from your Stripe dashboard.
- PayPal SDK — paste client ID and secret from PayPal Developer Console.
- PayPal F&F — your PayPal Business email.
- Cash App — your
$cashtag and Gmail forwarding.
- Crypto — your wallet addresses, or Cryptomus / Oxapay API keys.
See Payment gateways for the full per-provider walkthrough.
Important: if you were using merchant-of-record on the old platform (some platforms
operate as MoR by default), you will need to switch to your own gateways now. Shoppex does
not operate as MoR. Funds settle directly to your own Stripe, PayPal, or wallet accounts.
Step 4 — Recreate your products
For each product on your old shop:
- Products → New product in Shoppex.
- Set the same title, description, price.
- Pick the fulfillment mode that matches:
- Files → File.
- License keys / activation codes / Steam keys → Serials or Licenses (Licenses if
you need HWID-locking).
- Discord access → Subscription, and assign a Discord role from the product’s Discord
section, the same role-binding steps as Discord supporter tier
above.
- Monthly billing → Subscription.
- Custom service / boost / design → Service.
- If it is a serials product, paste your old key pool into the Serials tab.
If you have many products, doing this by hand is tedious. The Developer
API lets you script it. Write a small migration tool that reads your
old export and sends one product at a time to /dev/v1/products. There is no bulk-create
endpoint. Do not run too many requests at once, and respect the rate limit. The contracts are
documented in API Reference → Products.
Step 5 — Move your custom domain
You can choose between two strategies, depending on how much downtime you can tolerate.
Cleanest: dual-domain transition. Keep your old shop running on its current domain. Set
up Shoppex on a new domain (for example new.yourbrand.com or yourbrand.shop). Test
thoroughly. When ready, swap DNS so the main domain points at Shoppex.
This means you have two shops live at the same time for a few days while you confirm
Shoppex works for your buyers. You have no revenue gap during the switch.
Fastest: direct swap. Update DNS on the day you are ready. Old shop goes dark when DNS
propagates.
For the actual DNS setup, see Custom domain.
Step 6 — Redirect your old product links
Shoppex URLs look different from your old platform’s. Old buyers, old social posts, and
search-engine results will hit dead URLs unless you redirect.
If you control the old platform’s domain, set up a redirect rule. For Cloudflare:
- Add the old domain to Cloudflare.
- Rules → Redirect Rules → “If URL contains
/product/, then 301 to
https://yourbrand.shoppex.io/product/{path}”.
For domains you cannot redirect, for example third-party platforms hosting old links, there
is nothing to do. You lose those click-throughs.
Step 7 — Notify your customers
Send an email or Discord announcement explaining the move. Include:
- The new shop URL.
- Tell buyers that existing subscriptions on the old platform do not carry over. Stripe and
PayPal do not transfer subscriptions between merchants, so buyers must re-authorize the
recurring charge on Shoppex.
- A link to your support channel for questions.
The subscription point is the most painful part of any migration. Communicate this clearly.
Step 8 — Shut down the old shop
Monitor the new shop for a week or two. Check that there are no support tickets about missing
items, that search results are updated, and that social posts point at the new shop. Then
close the old account. Keep the export file permanently. It is your historical record.
Common pitfalls
- Subscriptions do not migrate. This is the biggest surprise for most merchants. Buyers
must re-subscribe on Shoppex with their own payment method. Plan a transition window of a
month where you message them, ideally with a discount code to make it easier.
- License keys you sold but never delivered, for example ones still in the old shop’s
pool, go into the Shoppex Serials pool. Once sold and delivered, they stay with the buyer
forever.
- Customer wallet balances on the old shop cannot transfer. If buyers had store credit
on your old platform, you can manually re-credit their Shoppex wallet from the Customers
page as a goodwill gesture.
- Disputes filed on old gateway accounts stay with those gateways. Watch your old
Stripe / PayPal dashboards for a few months after the cut-over.