How Guild works
Everything you need to run your store — from setting up your first product to automating access with Discord, license keys, and courses.
On this page
Getting Started
When you first open your dashboard, Guild walks you through a short setup wizard. It has four steps:
- 1
Store brand — Add your store name, logo, and description.
- 2
Connect Stripe — Link your Stripe account so you can receive payments. Guild uses Stripe Connect — your money goes directly to your bank.
- 3
Set pricing — Choose a one-time price or a recurring subscription for your first product.
- 4
Create your product — Name your product, set it live, and you're ready to sell.
Tip: You only do this once. After setup, your dashboard is always at guildly.co/dashboard.
Products & Plans
A product is what you sell — a community, course, tool, or any digital offering. Each product can have multiple plans (pricing tiers).
One-time purchase
Charge once. Buyer gets lifetime access.
Subscription
Charge monthly or yearly. Access continues as long as they pay.
Free plan
Set price to $0 for a free tier.
Trial period
Offer a free trial before billing starts.
Each plan can unlock different apps (see below) — so a higher-tier subscriber can get a premium Discord role or extra course content while a free member gets basic access.
Tip: To create a new plan: Dashboard → your product → Settings → Pricing → Add plan.
Apps & Integrations
Apps let you automatically deliver access to external platforms when someone buys. You assign apps to plans — so each pricing tier can unlock different things.
Discord
Most popularAutomatically assign Discord roles when someone buys, and remove them if they cancel or lapse. You can also log events to a channel and optionally kick members when access ends.
- 1.Go to your product → Apps → Add app → Discord
- 2.Connect your Discord server with the bot invite link
- 3.Choose which role to assign for each plan
- 4.Members get the role instantly after purchase
Telegram
Grant access to a private Telegram group or channel on purchase. Access is revoked automatically on cancellation.
- 1.Add the Guild bot to your Telegram group or channel
- 2.Go to Apps → Telegram → paste your group/channel link
- 3.Assign the app to a plan
Course
Sell structured video courses. Add chapters and lessons, embed videos, and members watch inside Guild.
- 1.Go to Apps → Course → Create course
- 2.Add chapters and lessons
- 3.Assign the course app to a plan
License Key
Automatically generate a unique license key for each buyer. Set max activations and optionally attach a download URL.
- 1.Go to Apps → License Key → Configure
- 2.Set max activations (default: 1 device)
- 3.Optionally add a download URL
- 4.Buyers receive their key in their account
Guide
Publish a written guide, tutorial, or knowledge base that's only accessible to members.
- 1.Go to Apps → Guide → Create guide
- 2.Write your content with the rich text editor
- 3.Assign to a plan
License Keys
When you enable the License Key app, Guild auto-generates a unique key for every buyer. Keys look like GLD-XXXX-XXXX-XXXX-XXXX.
Auto-generated
Created instantly on purchase — no manual work.
Max activations
Set how many devices a single key can activate (default: 1).
HWID binding
On first activation, the key locks to the buyer's hardware ID. Future activations from different hardware are blocked until a reset.
Download URL
Optionally attach a file download link to the key.
Buyer HWID reset
Buyers can clear their bound hardware ID themselves (unless you disable it). Useful when they switch machines.
Revoke anytime
Go to Dashboard → License Keys to view all keys and revoke any of them.
Buyers can view their license key in their account at guildly.co/account under their purchase. If you set Allow buyer reset to off in your app config, buyers must contact you to reset their hardware.
Tip: To view and manage all issued keys: Dashboard → your product → License Keys. Filter by Active, Revoked, or Expired.
License Key API
Guild exposes a public REST API for license key validation and activation — meant for your software to call at startup or install time. No user authentication is needed for the public endpoints; just the key string.
Base URL: https://guildly.co/api/license-keys
/api/license-keys/{key}Public — no auth requiredCheck if a key is valid. Optionally pass a hardware ID to verify the key is bound to the correct device.
Parameters
keypathrequiredThe license key string (e.g. GLD-ABCD-EF23-GH45-JK67)hwidqueryHardware ID to check against the bound device. Validation fails if the key is bound to a different HWID.Success Response
{
"valid": true,
"status": "ACTIVE",
"reason": null,
"key": "GLD-ABCD-EF23-GH45-JK67",
"activationCount": 1,
"maxActivations": 3,
"hwid": "your-device-hwid",
"hwidResetCount": 0,
"expiresAt": null,
"product": {
"name": "My Software",
"slug": "my-software",
"image": null
}
}Error Responses
// Key not found
{ "valid": false, "error": "License key not found" }
// HWID mismatch
{
"valid": false,
"status": "ACTIVE",
"reason": "Hardware ID mismatch",
...
}- Validate does NOT consume an activation or bind an HWID. Use /activate for that.
- If the key has expired, status is updated to EXPIRED automatically.
- Subscription-linked keys also check that the membership is still active.
/api/license-keys/{key}/activatePublic — no auth requiredActivate a key and optionally bind it to a hardware ID. Call this when a user installs or first launches your software.
Parameters
keypathrequiredThe license key stringhwidbodyHardware identifier for this device. On first call, the key is permanently bound to this HWID. Re-activating with the same HWID is free (no activation count used).metadatabodyAny JSON object — stored in the activation log (e.g. { version: '2.1.0', os: 'Windows 11' }).Request Body
// POST body
{
"hwid": "cpu-serial-or-machine-id",
"metadata": {
"appVersion": "2.1.0",
"os": "Windows 11"
}
}Success Response
// 201 — first activation (or new device slot used)
{
"valid": true,
"activated": true,
"bound": true,
"status": "ACTIVE",
"key": "GLD-ABCD-EF23-GH45-JK67",
"activationCount": 1,
"maxActivations": 3,
"hwid": "cpu-serial-or-machine-id",
"hwidResetCount": 0,
"expiresAt": null,
"product": { "name": "My Software", "slug": "my-software", "image": null }
}
// 200 — re-activation on same HWID (count NOT incremented)
{ "valid": true, "activated": true, "bound": true, ... }Error Responses
// 403 — HWID bound to different device
{
"valid": false,
"activated": false,
"reason": "Hardware ID mismatch — this key is bound to another device"
}
// 400 — max activations reached
{
"valid": false,
"activated": false,
"reason": "Maximum activations reached"
}
// 403 — key revoked or expired
{ "valid": false, "activated": false, "reason": "Key has been revoked" }
{ "valid": false, "activated": false, "reason": "Key has expired" }- Re-activating the same HWID returns 200 and does NOT increment activationCount.
- The activation log (metadata.activations) stores up to the last 50 activations — including IP, user-agent, timestamp, and any metadata you passed.
- If no hwid is provided, the key is activated without hardware binding.
/api/license-keys/{key}/deactivateAuthenticated — buyer must be signed in to their Guild accountClear the bound HWID so the key can be activated on a new device. Call this when a buyer switches machines. The seller can disable this per-product.
Parameters
keypathrequiredThe license key string (not the ID)Success Response
{
"success": true,
"message": "License deactivated — HWID cleared"
}Error Responses
// 403 — buyer reset is disabled by the seller
{ "error": "Device reset is disabled for this product. Contact the seller." }
// 400 — key is not active
{ "error": "License key is not active" }
// 401 — not signed in
{ "error": "Unauthorized" }- Clears the hwid field to null and increments hwidResetCount.
- Does NOT decrement activationCount.
- Sellers can disable buyer resets in the License Key app config (allowBuyerReset: false). If disabled, buyers must contact the seller.
- After calling this, the key can be re-activated on a new device via /activate.
/api/license-keys/{id}/reset-hwidAuthenticated — buyer must be signed in to their Guild accountSame as /deactivate but addressed by the license key database ID instead of the key string. Useful when you have the ID from the Guild API.
Parameters
idpathrequiredThe license key database ID (cuid — e.g. clxyz1234...), NOT the key stringSuccess Response
{
"id": "clxyz1234...",
"key": "GLD-ABCD-EF23-GH45-JK67",
"hwid": null,
"hwidResetCount": 2,
"status": "ACTIVE"
}Error Responses
// 400 — not active
{ "error": "License key is not active" }
// 401 / 403 — not signed in or wrong user
{ "error": "Unauthorized" }- Use this endpoint when you have the key's database ID (e.g. from your own backend). Use /deactivate when you only have the key string.
- Does NOT check the allowBuyerReset flag — this is a separate code path.
/api/license-keys/{key}/revokeAuthenticated — seller/store owner onlyPermanently revoke a license key. The key will be invalid for all future activations and validations.
Parameters
keypathrequiredThe license key stringSuccess Response
{ "success": true }Error Responses
// 400 — already revoked
{ "error": "Key is already revoked" }
// 403 — not the seller
{ "error": "Forbidden" }
// 404 — not found
{ "error": "License key not found" }- Revocation is permanent. There is no un-revoke endpoint.
- Only the store owner can revoke. Buyers cannot.
- Revoked keys return valid: false with status: REVOKED on validation.
/api/products/{id}/license-keysAuthenticated — seller/store owner onlyList all license keys for a product with pagination and optional status filtering.
Parameters
idpathrequiredProduct IDstatusqueryFilter: ACTIVE | REVOKED | EXPIREDpagequeryPage number (default: 1)limitqueryResults per page (default: 50, max: 100)Success Response
{
"keys": [
{
"id": "clxyz1234...",
"key": "GLD-ABCD-EF23-GH45-JK67",
"status": "ACTIVE",
"activationCount": 1,
"maxActivations": 3,
"hwid": "some-device-hwid",
"hwidResetCount": 0,
"activatedAt": "2026-01-01T00:00:00.000Z",
"expiresAt": null,
"revokedAt": null,
"membership": {
"id": "...",
"status": "ACTIVE",
"user": { "email": "[email protected]", "name": "Jane Doe" }
}
}
],
"total": 42,
"page": 1,
"totalPages": 1
}- membership.user contains the buyer's name and email.
- metadata.activations holds the full activation log per key (last 50 entries).
HTTP Status Code Reference
| Status | Meaning | When |
|---|---|---|
| 200 | OK | Valid check or re-activation on same HWID |
| 201 | Created | First activation — new activation slot consumed |
| 400 | Bad Request | Key not active, already revoked, max activations reached |
| 401 | Unauthorized | Endpoint requires login but no session cookie present |
| 403 | Forbidden | HWID mismatch, wrong user, buyer reset disabled |
| 404 | Not Found | Key or product not found |
| 500 | Server Error | Unexpected internal error |
Tip: Typical integration: (1) call /activate on first launch with your device HWID — if the key is valid you get activated: true. (2) On subsequent launches call /validate?hwid=... — fast and doesn't count as a new activation.
Checkout Links
A checkout link is a shareable URL that takes someone directly to a payment page for your product. No embed, no code — just a link.
Use them in emails, social posts, bio links, QR codes, or anywhere you want to sell.
- 1
Go to Dashboard → Links — Find the Checkout Links section in your dashboard.
- 2
Create a link — Choose a product and plan. Optionally set a custom name or expiry.
- 3
Copy and share — Paste the link anywhere. Guild tracks conversions automatically.
Coupons
Create discount codes that buyers can apply at checkout.
Percentage off
e.g. "LAUNCH20" for 20% off
Fixed amount off
e.g. "$10 off" any purchase
Usage limits
Cap how many times a coupon can be used.
Expiry date
Set a date after which the coupon stops working.
Tip: Dashboard → your product → Coupons → Create coupon.
Affiliates
The affiliate program lets other people promote your product and earn a commission on sales they refer.
- 1
Enable affiliates — Dashboard → your product → Affiliates → turn on the program and set your commission rate (%).
- 2
Affiliates apply — Anyone can apply to be your affiliate. You approve or reject applications.
- 3
They share their link — Each approved affiliate gets a unique referral code (e.g. ?ref=THEIRCODE).
- 4
You both earn — When a sale comes through their link, they earn their commission. You can see all referral sales in your dashboard.
Tip: Commissions are tracked automatically. You can see pending and approved earnings per affiliate.
Payouts
Guild uses Stripe Connect — meaning your payments go directly to your connected Stripe account. Guild never holds your money.
1% platform fee
Guild charges 1% on each sale. Stripe's standard processing fees also apply.
Direct payouts
Stripe pays out to your bank on their normal schedule (usually 2 business days).
Payout history
View all past payouts at Dashboard → Payouts.
Stripe dashboard
For detailed payout breakdowns, log into your Stripe account directly.
Members
The Members section shows everyone who has access to your product.
Active members
Currently paying or lifetime access holders.
Waitlist
Collect emails before you launch. Convert waitlist signups to members when you go live.
Import
Migrating from another platform? Import your existing member list via CSV.
Team members
Add collaborators to your store who can manage products, members, and more.
Storefront Builder
Every store gets a public storefront page — a landing page for your product that you can fully customize without writing any code.
Go to Dashboard → Storefront to edit it. You can add, remove, and reorder these section types:
Embed on Your Site
Want to sell directly from your own website? You have two options:
iframe embed
Drop this snippet anywhere on your site to show a checkout widget:
<iframe src="https://guildly.co/embed/YOUR-PRODUCT-SLUG" width="100%" height="480" frameborder="0" ></iframe>
Checkout API
Build your own checkout button using our public API. See the full API reference at /docs/api.
Tip: Your product slug is visible in your product URL — e.g. if your product page is guildly.co/p/my-course, your slug is my-course.
Team Members
You can invite other people to help manage your store. Team members can access the dashboard but do not have billing or Stripe access.
- 1
Go to Dashboard → your product → Team
- 2
Invite by email — The person will receive an invite to join your store.
- 3
They accept — Once accepted, they can log in and manage your store alongside you.
Still have questions?
We're happy to help — usually within a few hours.
Email [email protected]