Developer

Configuration examples

Copy-paste schemas for welcome bots, moderation, tickets and economy.

Real bottly_config.json files you can adapt. Each one is valid as-is.

Welcome bot

{
  "version": 1,
  "settings": {
    "welcome_channel": {
      "type": "channel",
      "label": "Welcome channel",
      "description": "Where the greeting is posted.",
      "editable": true,
      "required": true
    },
    "welcome_message": {
      "type": "textarea",
      "label": "Welcome message",
      "description": "Use {user} for a mention and {server} for the server name.",
      "default": "Welcome {user} to {server}!",
      "editable": true
    },
    "accent_color": {
      "type": "color",
      "label": "Embed colour",
      "default": "#5865F2",
      "editable": true
    }
  }
}


Moderation bot with a select and a range

{
  "version": 1,
  "settings": {
    "log_channel": { "type": "channel", "label": "Mod-log channel", "editable": true, "required": true },
    "mute_role":   { "type": "role",    "label": "Mute role",       "editable": true, "required": true },
    "warn_action": {
      "type": "select",
      "label": "Action after 3 warnings",
      "default": "mute",
      "editable": true,
      "options": [
        { "label": "Mute",   "value": "mute" },
        { "label": "Kick",   "value": "kick" },
        { "label": "Ban",    "value": "ban" },
        { "label": "Nothing","value": "none" }
      ]
    },
    "mute_minutes": { "type": "number", "label": "Mute length (minutes)", "default": 60, "min": 1, "max": 10080, "editable": true },
    "dm_on_action": { "type": "boolean", "label": "DM the member", "default": true, "editable": true },
    "internal_api": { "type": "url", "label": "Internal endpoint", "editable": false, "internal": true }
  }
}


The last entry shows the two flags that matter: editable: false means buyers can see nothing to change, and internal: true hides it from them completely.

Ticket bot, grouped with categories

{
  "version": 1,
  "settings": {
    "panel_channel":  { "type": "channel", "label": "Panel channel",  "category": "Setup",      "editable": true, "required": true },
    "ticket_category":{ "type": "channel", "label": "Ticket category","category": "Setup",      "editable": true, "required": true },
    "support_role":   { "type": "role",    "label": "Support role",   "category": "Permissions","editable": true, "required": true },
    "open_emoji":     { "type": "emoji",   "label": "Open button emoji", "default": "🎫", "category": "Appearance", "editable": true },
    "max_open":       { "type": "number",  "label": "Max open tickets per member", "default": 1, "min": 1, "max": 10, "category": "Limits", "editable": true }
  }
}


Settings that share a category are grouped together in the buyer's form.

Validation rules the backend enforces
keys start with a letter, then letters, numbers or underscores (max 49 characters)
select needs at least one option, and option values must be unique
number rejects min greater than max
color must be a six-digit hex like #5865F2
role, channel and user must be Discord IDs (digits only)
url must be http or https
defaults are validated against their own type — a bad default blocks publishing