Skip to main content

Django Affiliate System

A flexible, production ready Django package for managing affiliate marketing programs with referral tracking, commissions, and payouts.

Features

  • Referral Link Management - Create and track custom referral links
  • Detailed Analytics - Track clicks, conversions, and revenue
  • Commission System - Flexible commission rules (percentage or flat rate)
  • Payout Management - Handle affiliate payouts with multiple methods
  • Optional Multi-Tenancy - Support multiple platforms with isolated data
  • Attribution Models - First-click, last-click, or custom attribution
  • Secure & Production-Ready - Built with Django best practices

Installation

pip install django-affiliate-system

Quick Start

1. Add to Installed Apps

# settings.py
INSTALLED_APPS = [
    # ... other apps
    'django_affiliate_system',
]

2. Configure Settings

# settings.py
AFFILIATE_SYSTEM = {
    # Required
    'DOMAIN_PROTOCOL': 'https',  # or 'http' for local dev
    'DOMAIN': 'yourdomain.com',

    # Optional - Defaults shown
    'DEFAULT_COMMISSION_RATE': 10.0,  # 10%
    'COOKIE_DURATION_DAYS': 30,
    'DEFAULT_REDIRECT_URL': '/',
    'ENABLE_MULTI_TENANCY': False,  # Set True for multi-tenant
    'ENABLE_SESSIONS': False,  # Set True for multi-touch attribution
    'DEFAULT_ATTRIBUTION_MODEL': 'last_click',
    'DEFAULT_PAYOUT_THRESHOLD': 50.0,
    'AUTO_APPROVE_COMMISSIONS': False,

    # CORS (if tracking from different domains)
    'ALLOWED_CORS_ORIGINS': [
        'https://yourdomain.com',
    ],
}

3. Add Middleware (Optional)

# settings.py
MIDDLEWARE = [
    # ... other middleware
    'django_affiliate_system.middleware.AffiliateTrackingMiddleware',
    # Optional: Only if using multi-tenancy
    # 'django_affiliate_system.middleware.TenantMiddleware',
    # Optional: Only if tracking from different domains
    # 'django_affiliate_system.middleware.CORSMiddleware',
]

4. Include URLs

# urls.py
from django.urls import path, include
from django_affiliate_system.views import ReferralLinkRedirectView

urlpatterns = [
    # ... other urls
    path('affiliates/', include('django_affiliate_system.urls')),

    # Referral link redirect handler
    path('r/<slug:slug>/',
         ReferralLinkRedirectView.as_view(),
         name='referral-redirect'),
]

5. Run Migrations

python manage.py migrate

Usage

Creating an Affiliate

from django.contrib.auth import get_user_model
from django_affiliate_system.models import Affiliate

User = get_user_model()
user = User.objects.get(email='affiliate@example.com')

# Create affiliate (code is auto-generated if not provided)
affiliate = Affiliate.objects.create(
    user=user,
    code='MYAFFILIATE',  # Optional: auto-generated if omitted
    is_active=True,
    payout_threshold=50.0,
    payout_method='paypal'
)
from django_affiliate_system.models import ReferralLink

link = ReferralLink.objects.create(
    affiliate=affiliate,
    slug='summer-sale-2024',  # Must be unique
    destination_url='https://yourdomain.com/products',
    campaign_name='Summer Sale 2024'
)

# Full referral URL: https://yourdomain.com/?ref=summer-sale-2024

Tracking Events

Use the public API endpoint to track clicks and conversions:

import requests

# Track a click
requests.post('https://yourdomain.com/affiliates/api/referral-actions/track/', json={
    'referral_code': 'MYAFFILIATE',  # or 'referral_slug': 'summer-sale-2024'
    'event_type': 'click',
    'metadata': {
        'source': 'email_campaign',
        'utm_source': 'newsletter'
    }
})

# Track a conversion
requests.post('https://yourdomain.com/affiliates/api/referral-actions/track/', json={
    'referral_code': 'MYAFFILIATE',
    'event_type': 'purchase',
    'is_conversion': True,
    'conversion_value': 99.99,
    'metadata': {
        'order_id': '12345'
    }
})

Setting Commission Rules

from django_affiliate_system.models import CommissionRule

# Percentage-based commission
CommissionRule.objects.create(
    name='Purchase Commission',
    action_type='purchase',
    is_percentage=True,
    value=10.0,  # 10%
    min_value=5.0,  # Minimum $5
    max_value=100.0,  # Maximum $100
    is_active=True,
    priority=1
)

# Flat rate commission
CommissionRule.objects.create(
    name='Signup Bonus',
    action_type='signup',
    is_percentage=False,
    value=25.0,  # $25 flat
    is_active=True,
    priority=1
)

API Endpoints

All endpoints require authentication except tracking endpoints.

Affiliate Endpoints

  • GET /affiliates/affiliates/ - List affiliates (or get own profile)
  • GET /affiliates/affiliates/stats/ - Get affiliate statistics
  • POST /affiliates/affiliates/ - Create affiliate (admin only)
  • GET /affiliates/referral-links/ - List referral links
  • POST /affiliates/referral-links/ - Create referral link
  • GET /affiliates/referral-links/{id}/ - Get referral link details

Tracking Endpoints (Public)

  • POST /affiliates/api/referral-actions/track/ - Track any event

Commission Endpoints

  • GET /affiliates/commissions/ - List commissions
  • POST /affiliates/commissions/{id}/approve/ - Approve commission (admin)
  • POST /affiliates/commissions/{id}/reject/ - Reject commission (admin)

Payout Endpoints

  • GET /affiliates/payouts/ - List payouts
  • POST /affiliates/payouts/request/ - Request payout (affiliate)

Getting Affiliate Statistics

# Via API
GET /affiliates/affiliates/stats/?date_from=2024-01-01&date_to=2024-12-31

# Response includes:
# - total_clicks, total_conversions, conversion_rate
# - total_earnings, pending_earnings, paid_earnings
# - top_links, traffic_sources, etc.

Frontend Integration

JavaScript Tracking Example

// Track clicks automatically
document.querySelectorAll("a[data-affiliate-link]").forEach((link) => {
  link.addEventListener("click", async (e) => {
    await fetch("/affiliates/api/referral-actions/track/", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        referral_code: e.target.dataset.affiliateCode,
        event_type: "click",
        metadata: {
          page_url: window.location.href,
          referrer: document.referrer,
        },
      }),
    });
  });
});

// Track conversion after purchase
async function trackPurchase(affiliateCode, orderValue) {
  await fetch("/affiliates/api/referral-actions/track/", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      referral_code: affiliateCode,
      event_type: "purchase",
      is_conversion: true,
      conversion_value: orderValue,
    }),
  });
}

Advanced Features

Multi-Tenancy

Enable multi-tenancy to support multiple platforms:

# settings.py
AFFILIATE_SYSTEM = {
    'ENABLE_MULTI_TENANCY': True,
    # ...
}

# Add middleware
MIDDLEWARE = [
    'django_affiliate_system.middleware.TenantMiddleware',
    # ...
]
# Create tenants
from django_affiliate_system.models import Tenant

tenant = Tenant.objects.create(
    name='Platform A',
    slug='platform-a',
    subdomain='platforma',  # platforma.yourdomain.com
    destination_url='https://platforma.com',
    owner=admin_user
)

Multi-Touch Attribution

Track user journeys across multiple touchpoints:

# settings.py
AFFILIATE_SYSTEM = {
    'ENABLE_SESSIONS': True,
    'DEFAULT_ATTRIBUTION_MODEL': 'first_click',  # or 'last_click'
}

# Track with session ID
requests.post('/affiliates/api/referral-actions/track/', json={
    'referral_code': 'MYAFFILIATE',
    'event_type': 'click',
    'session_id': 'user-session-123',
    'use_sessions': True
})

Custom Commission Logic

Override commission calculation:

# your_app/services.py
from django_affiliate_system.services.commision import create_commission
from django_affiliate_system.models import Commission

def create_custom_commission(action):
    # Your custom logic here
    commission = Commission.objects.create(
        affiliate=action.referral_link.affiliate,
        referral_action=action,
        amount=calculate_custom_amount(action),
        rate=0,
        status='pending'
    )
    return commission

Admin Interface

The package automatically registers all models in Django admin with:

  • List/filter/search functionality
  • CSV export
  • Inline editing where appropriate

Access at: /admin/django_affiliate_system/

Testing

# Run tests
python manage.py test django_affiliate_system

# With coverage
coverage run --source='django_affiliate_system' manage.py test
coverage report

Troubleshooting

Referral codes not being tracked

Check that:

  1. AffiliateTrackingMiddleware is installed
  2. Cookies are enabled in browser
  3. Domain matches cookie domain

Commissions not being created

Verify:

  1. Commission rules exist for the action type
  2. Rules are active (is_active=True)
  3. Check logs for errors

Multi-tenancy not working

Ensure:

  1. ENABLE_MULTI_TENANCY is True
  2. TenantMiddleware is installed
  3. Subdomain DNS is configured correctly

Contributing

Contributions are welcome! See CONTRIBUTING.md for setup instructions, how to run tests, and the PR process.

License

This project is licensed under the MIT License.

Support

Metadata

Release files for django-affiliate-system 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-affiliate-system 0.1.0
File Size Uploaded
django_affiliate_system-0.1.0.tar.gz 36.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-affiliate-system 0.1.0
File Interpreter ABI Platform
django_affiliate_system-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 79.7 kB

Release files / django_affiliate_system-0.1.0.tar.gz

Download URL django_affiliate_system-0.1.0.tar.gz
Size 36.8 kB
Tags Source
SHA-256 checksum
How to use checksums
178ad73b61aa942ad980caacc5c65089bf8feefa0ae97254ef3457bb7f924c53
BLAKE2b-256 checksum
How to use checksums
2e912fc17cc5c9450d6ff17da187411c28406a2f308d9500e4496b8bbd9ef88a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / django_affiliate_system-0.1.0-py3-none-any.whl

Download URL django_affiliate_system-0.1.0-py3-none-any.whl
Size 42.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4d1886cc5cd075ef92b756a71061fe69eee268edbfacf735e39c1e2c108f6f23
BLAKE2b-256 checksum
How to use checksums
6e67c133c18cba27faf0091e527c573621cce818a7a631eef1c081864a433d08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page