Skip to content

Database Schema

This bot uses a simple SQLite database to store sales, refunds, subscriptions, and statistics. Below is a description of each table and its columns.

Tables

stats

Tracks overall statistics for sales, refunds, revenue, and subscriptions.

Column Type Description
id INTEGER Always 1 (single row for stats)
totalSales INTEGER Total number of sales
totalRevenue REAL Total revenue from sales
totalRefunds INTEGER Total number of refunds
refundedAmount REAL Total amount refunded
subscriptions INTEGER Total number of subscriptions
CREATE TABLE IF NOT EXISTS stats (
    id INTEGER PRIMARY KEY CHECK (id = 1),
    totalSales INTEGER DEFAULT 0,
    totalRevenue REAL DEFAULT 0,
    totalRefunds INTEGER DEFAULT 0,
    refundedAmount REAL DEFAULT 0,
    subscriptions INTEGER DEFAULT 0
);

sales

Stores all sales and refund records.

Column Type Description
id TEXT Unique sale or refund ID
type TEXT 'sale' or 'refund'
products TEXT Product names (comma-separated)
amount REAL Sale or refund amount
currency TEXT Currency code (default 'USD')
customer TEXT Customer name or ID
date TEXT ISO date string
coupon TEXT Coupon code used (if any)
discount REAL Discount amount (if any)
originalDate TEXT Original sale date (for refunds)
CREATE TABLE IF NOT EXISTS sales (
    id TEXT PRIMARY KEY,
    type TEXT NOT NULL,
    products TEXT,
    amount REAL NOT NULL,
    currency TEXT DEFAULT 'USD',
    customer TEXT,
    date TEXT NOT NULL,
    coupon TEXT,
    discount REAL DEFAULT 0,
    originalDate TEXT
);

subscriptions

Stores all subscription records.

Column Type Description
id TEXT Unique subscription ID
type TEXT Subscription event type
product TEXT Product name
plan TEXT Subscription plan name
customer TEXT Customer name or ID
date TEXT ISO date string
CREATE TABLE IF NOT EXISTS subscriptions (
    id TEXT PRIMARY KEY,
    type TEXT NOT NULL,
    product TEXT,
    plan TEXT,
    customer TEXT,
    date TEXT NOT NULL
);

Indexes

Indexes are used to speed up queries on date and type columns.

CREATE INDEX IF NOT EXISTS idx_sales_date ON sales(date);
CREATE INDEX IF NOT EXISTS idx_sales_type ON sales(type);
CREATE INDEX IF NOT EXISTS idx_subscriptions_date ON subscriptions(date);

Note: Editing the schema is not recommended unless you know what you are doing. For query details, see queries.md.