← back to Watches
database/migrations/003-affiliates.sql
35 lines
-- Migration 003: Affiliate System
CREATE TABLE IF NOT EXISTS affiliate_programs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(100) NOT NULL UNIQUE,
base_url VARCHAR(500) NOT NULL,
tracking_param VARCHAR(50) DEFAULT 'ref',
commission_rate NUMERIC(5,2),
logo_url VARCHAR(500),
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS affiliate_clicks (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users(id),
watch_id UUID REFERENCES watches(id),
program_id UUID NOT NULL REFERENCES affiliate_programs(id),
clicked_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
ip_address INET,
user_agent TEXT,
converted BOOLEAN DEFAULT false,
commission NUMERIC(10,2)
);
CREATE INDEX idx_clicks_program ON affiliate_clicks(program_id);
CREATE INDEX idx_clicks_user ON affiliate_clicks(user_id);
CREATE INDEX idx_clicks_date ON affiliate_clicks(clicked_at);
INSERT INTO affiliate_programs (name, base_url, tracking_param, commission_rate) VALUES
('Chrono24', 'https://www.chrono24.com', 'ref', 2.5),
('eBay', 'https://www.ebay.com', 'campid', 4.0),
('Jomashop', 'https://www.jomashop.com', 'aid', 3.0),
('Bobs Watches', 'https://www.bobswatches.com', 'ref', 2.0)
ON CONFLICT (name) DO NOTHING;