{"id":35173244,"url":"https://github.com/mesumbinshaukat/affiliate-system-codeigniter-4","last_synced_at":"2026-04-28T10:07:14.082Z","repository":{"id":327098597,"uuid":"1107664237","full_name":"mesumbinshaukat/Affiliate-System-Codeigniter-4","owner":"mesumbinshaukat","description":"A complete affiliate marketing platform built with CodeIgniter 4, allowing users to create and share curated product lists with integrated Bol.com affiliate tracking.","archived":false,"fork":false,"pushed_at":"2026-02-25T11:41:39.000Z","size":8542,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-25T13:19:14.732Z","etag":null,"topics":["affiliate-marketing","affiliate-tracking-system","codeigniter"],"latest_commit_sha":null,"homepage":"https://maakjelijstje.nl/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mesumbinshaukat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-01T12:56:03.000Z","updated_at":"2026-02-25T11:41:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mesumbinshaukat/Affiliate-System-Codeigniter-4","commit_stats":null,"previous_names":["mesumbinshaukat/affiliate-system-codeigniter-4"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mesumbinshaukat/Affiliate-System-Codeigniter-4","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesumbinshaukat%2FAffiliate-System-Codeigniter-4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesumbinshaukat%2FAffiliate-System-Codeigniter-4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesumbinshaukat%2FAffiliate-System-Codeigniter-4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesumbinshaukat%2FAffiliate-System-Codeigniter-4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mesumbinshaukat","download_url":"https://codeload.github.com/mesumbinshaukat/Affiliate-System-Codeigniter-4/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mesumbinshaukat%2FAffiliate-System-Codeigniter-4/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32375778,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T09:24:15.638Z","status":"ssl_error","status_checked_at":"2026-04-28T09:24:15.071Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["affiliate-marketing","affiliate-tracking-system","codeigniter"],"created_at":"2025-12-28T21:37:15.455Z","updated_at":"2026-04-28T10:07:14.075Z","avatar_url":"https://github.com/mesumbinshaukat.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Maakjelijstje.nl Clone - Affiliate List Platform\n\nA complete affiliate marketing platform built with CodeIgniter 4, allowing users to create and share curated product lists with integrated Bol.com affiliate tracking and commission management.\n\n## Features\n\n### Public Features\n- Browse curated product lists\n- Category-based filtering with age restrictions\n- Search functionality\n- Responsive design with Bootstrap 5\n- Social sharing (Facebook, WhatsApp, Copy Link)\n- SEO-friendly URLs\n- Drawing/Lottery system (Loten Trekken)\n\n### User Features\n- User registration and authentication with optional gender field\n- User profile management with age calculation\n- Create and manage product lists\n- **Co-owner collaboration** - Invite others to co-manage lists\n- **Section organization** - Organize products into custom sections\n- **Group Gift crowdfunding** - Enable contributions for expensive items\n- Search products via Bol.com API with advanced filters\n- Personalized product suggestions based on age and gender\n- Professional product filters (sort, category, price range)\n- Drag-and-drop product ordering\n- List status management (Draft, Published, Private)\n- Personal analytics dashboard with sales and commission tracking\n- Click tracking for affiliate links with subId attribution\n- Sales and commission history\n- Drawing/Lottery event creation and management\n\n### Admin Features\n- Complete user management\n- List moderation and featured lists\n- Category management with age restrictions\n- Comprehensive analytics with sales overview\n- Affiliate source management\n- Site-wide settings\n- Click tracking and statistics\n- Sales and commission tracking by user\n- Drawing/Lottery management\n- Commission report viewing\n\n### Affiliate System\n- Bol.com Marketing Catalog API v1 integration\n- Bol.com Affiliate Reporting API v2 integration\n- Automatic affiliate link generation with subId tracking\n- Click tracking with anonymized IPs (GDPR compliant)\n- Product database with caching\n- Redirect tracking system\n- Commission attribution via subId (user_id_list_id format)\n- Sales data storage and reporting\n- Scheduled commission report fetching\n- Commission status tracking (pending, approved, rejected)\n\n### Special Features\n- **Automated Event Reminder System**\n  - Set event dates (birthdays, anniversaries, etc.) for lists\n  - Automated email reminders to collaborators\n  - Customizable reminder intervals (e.g., 30, 14, 7 days before)\n  - Smart scheduling with cron job support\n  - Beautiful HTML email templates\n  - Prevents duplicate reminders\n  - Tracks sent/pending/failed reminders\n- **Group Gift / Crowdfunding System**\n  - Enable group contributions for expensive items\n  - Set funding goals for products\n  - Track contributions with progress bars\n  - Anonymous contribution option\n  - Contributor list with messages\n  - Real-time funding progress\n- **Co-Owner / Collaboration System**\n  - Invite co-owners to edit lists\n  - Accept/reject collaboration invitations\n  - Share list management permissions\n  - Section management for co-owners\n  - Full CRUD permissions for collaborators\n- Drawing/Lottery System (Loten Trekken)\n  - Create drawing events\n  - Invite participants\n  - Random lot drawing\n  - Participant status tracking\n- Gender-based personalization\n- Age-based product recommendations\n- Advanced product filtering\n- Commission management system\n\n## Technology Stack\n\n- **Backend**: CodeIgniter 4.4+\n- **Database**: MySQL/MariaDB\n- **Frontend**: Bootstrap 5, jQuery, Font Awesome\n- **API**: Bol.com Affiliate API\n\n## Installation\n\n### Prerequisites\n\n- PHP 7.4 or higher\n- MySQL 5.7+ or MariaDB 10.3+\n- Composer\n- XAMPP/WAMP/LAMP or similar (for local development)\n\n### Step 1: Install Dependencies\n\n```bash\ncomposer install\n```\n\n### Step 2: Configure Environment\n\n1. Copy the `.env` file (already created)\n2. Update database credentials in `.env`:\n   ```\n   database.default.hostname = localhost\n   database.default.database = lijstje_db\n   database.default.username = root\n   database.default.password = \n   database.default.port = 3306\n   ```\n\n3. Add your Bol.com API credentials:\n   ```\n   BOL_CLIENT_ID = your_client_id\n   BOL_CLIENT_SECRET = your_client_secret\n   BOL_AFFILIATE_ID = your_affiliate_id\n   ```\n\n### Step 3: Create Database\n\nCreate a new database named `lijstje_db` in phpMyAdmin or via command line:\n\n```sql\nCREATE DATABASE lijstje_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\n```\n\n### Step 4: Run Migrations\n\nRun the database migrations to create all tables:\n\n```bash\nphp spark migrate\n```\n\n**Alternative: Run migrations via browser (for shared hosting without CLI access):**\n\n1. Visit `http://your-domain/run_migration_bol_sales.php` to set up Bol.com sales tracking\n2. Visit `http://your-domain/run_migration_gender.php` to add gender field and personalization\n3. Delete these files after running for security\n\n### Step 5: Seed Initial Data\n\nRun the seeder to populate initial data (admin user, categories, etc.):\n\n```bash\nphp spark db:seed InitialSeeder\n```\n\n### Step 6: Generate Encryption Key\n\nGenerate a secure encryption key:\n\n```bash\nphp spark key:generate\n```\n\nThis will automatically update your `.env` file.\n\n### Step 7: Set Permissions\n\nEnsure the `writable` directory is writable:\n\n```bash\nchmod -R 777 writable/\n```\n\nOn Windows, right-click the `writable` folder → Properties → Security → Edit → Add write permissions.\n\n### Step 8: Start Development Server\n\n```bash\nphp spark serve\n```\n\nOr configure Apache/Nginx to point to the `public` folder.\n\n## Default Credentials\n\nAfter running the seeder, you can login with:\n\n- **Email**: admin@Maakjelijstje.nl\n- **Password**: Admin@123\n\n**Important**: Change these credentials immediately after first login!\n\n## Project Structure\n\n```\n├── app/\n│   ├── Config/          # Configuration files\n│   ├── Controllers/     # Application controllers\n│   ├── Database/        # Migrations and seeders\n│   ├── Filters/         # Authentication filters\n│   ├── Libraries/       # Custom libraries (API, Tracker)\n│   ├── Models/          # Database models\n│   └── Views/           # View templates\n├── public/              # Public web root\n│   ├── index.php        # Front controller\n│   └── .htaccess        # Apache rewrite rules\n├── writable/            # Cache, logs, sessions, uploads\n├── .env                 # Environment configuration\n├── composer.json        # PHP dependencies\n└── spark                # CLI tool\n```\n\n## Usage Guide\n\n### For Users\n\n1. **Register an Account**\n   - Go to `/register`\n   - Fill in your details (gender is optional)\n   - Login with your credentials\n\n2. **Update Your Profile**\n   - Go to `/user/profile`\n   - Update personal information\n   - Set your gender for personalized suggestions\n   - Your age is automatically calculated from date of birth\n\n3. **Create a List**\n   - Navigate to Dashboard → Create List\n   - Enter title, description, and category\n   - Save as draft or publish immediately\n\n4. **Add Products with Personalization**\n   - Edit your list\n   - Go to Products tab\n   - View personalized suggestions based on your age and gender\n   - Use advanced filters: sort by price/popularity, filter by category, set price range\n   - Search for specific products from Bol.com\n   - Click \"Add\" to include them in your list\n\n5. **Organize with Sections** (Optional)\n   - Go to Products tab\n   - Click \"Nieuwe Sectie\" to create sections\n   - Examples: \"Sieraden\", \"Tech\", \"Lifetime Wensen\"\n   - Assign products to sections when adding or after\n\n6. **Enable Group Gifts** (Optional)\n   - For expensive items, toggle \"Groepscadeau\"\n   - Set a target amount (funding goal)\n   - Friends can contribute money towards the item\n   - Track progress with real-time updates\n\n7. **Set Event Date \u0026 Reminders** (Optional)\n   - Set an event date (e.g., your birthday: February 19)\n   - Enable \"Stuur automatische e-mail herinneringen\"\n   - Customize reminder intervals (default: 30, 14, 7 days before)\n   - Collaborators automatically receive email reminders\n   - Example: Birthday on Feb 19 → Reminders on Jan 20, Feb 5, Feb 12\n\n8. **Invite Co-Owners** (Optional)\n   - Go to \"Samenwerken\" tab\n   - Enter email to invite someone\n   - They can help manage the list once accepted\n\n9. **Publish and Share**\n   - Set list status to \"Published\"\n   - Share the public URL with others\n   - Track clicks and commissions in your analytics\n\n10. **View Sales \u0026 Commissions**\n   - Go to Dashboard → Analytics\n   - View your sales history\n   - Track commission status (pending, approved, rejected)\n   - See total earned commissions\n\n11. **Create Drawing Events (Loten Trekken)**\n   - Go to Drawings section\n   - Create new drawing event\n   - Invite participants\n   - Draw lots to randomly assign participants\n   - Track participant responses\n\n### For Admins\n\n1. **Access Admin Panel**\n   - Login with admin credentials\n   - Navigate to `/admin`\n\n2. **Manage Users**\n   - View all registered users\n   - Edit user roles and status\n   - Block or delete users\n   - View user profile information including gender\n\n3. **Manage Lists**\n   - View all lists\n   - Feature lists on homepage\n   - Delete inappropriate content\n   - View list analytics\n\n4. **Manage Categories**\n   - Create new categories\n   - Edit existing categories\n   - Set Font Awesome icons\n   - Configure age restrictions (min_age, max_age)\n\n5. **View Analytics**\n   - Track total clicks and traffic\n   - See top products and lists\n   - Monitor daily statistics\n   - View sales and commission overview\n   - Track commissions by user\n   - View commission status breakdown\n\n6. **Manage Sales \u0026 Commissions**\n   - View all sales records with user attribution\n   - Track commission status (pending, approved, rejected)\n   - See total commissions earned\n   - Monitor sales by user\n   - View product information for each sale\n\n7. **Manage Drawing Events**\n   - View all drawing events\n   - View participant details\n   - Delete drawing events\n   - Monitor drawing statistics\n\n8. **Configure Affiliate Sources**\n   - Enable/disable affiliate sources\n   - Manage API credentials\n   - Monitor API health\n\n## API Integration\n\n### Bol.com API Setup\n\n1. Register for Bol.com Partner Program\n2. Get API credentials from partner dashboard\n3. Add credentials to `.env` file:\n   ```\n   BOL_CLIENT_ID = your_client_id\n   BOL_CLIENT_SECRET = your_client_secret\n   BOL_AFFILIATE_ID = your_affiliate_id\n   ```\n4. The system will automatically:\n   - Authenticate via OAuth 2.0\n   - Search products with advanced filters\n   - Generate affiliate links with subId tracking\n   - Track clicks and commissions\n   - Fetch commission reports\n\n### Bol.com API Features\n\n**Marketing Catalog API v1:**\n- Product search with filters (sort, category, price range)\n- Personalized suggestions based on age and gender\n- Popular products listing\n- Product details and ratings\n\n**Affiliate Reporting API v2:**\n- Commission reports\n- Order reports\n- Promotion reports\n- Scheduled daily fetching via cron job\n\n### Commission Tracking System\n\nThe system tracks commissions through:\n1. **SubId Attribution**: Each affiliate link includes a unique subId (user_id_list_id)\n2. **Click Logging**: Clicks are recorded with the subId\n3. **Report Fetching**: Daily scheduled task fetches commission reports from Bol.com\n4. **Sales Storage**: Commission data is stored in the sales table\n5. **Status Tracking**: Commissions tracked as pending, approved, or rejected\n\n**Scheduled Report Fetching:**\n```bash\n# Run manually\nphp spark fetch:bol-reports\n\n# Run with custom date range\nphp spark fetch:bol-reports --start-date=2024-12-01 --end-date=2024-12-15\n\n# Dry run (preview without saving)\nphp spark fetch:bol-reports --dry-run\n```\n\n**Cron Job Setup (for automated daily fetching):**\n```bash\n# Linux/Unix - Add to crontab\n0 2 * * * cd /path/to/project \u0026\u0026 php spark fetch:bol-reports\n\n# Windows Task Scheduler\nProgram: C:\\php\\php.exe\nArguments: spark fetch:bol-reports\nStart in: C:\\path\\to\\project\n```\n\n### Adding More Affiliate Sources\n\nTo add additional affiliate sources (Amazon, Coolblue, etc.):\n\n1. Create a new library in `app/Libraries/` (e.g., `AmazonAPI.php`)\n2. Implement similar methods as `BolComAPI.php`\n3. Add source to database via admin panel\n4. Update product search to support multiple sources\n\n## Database Schema\n\n### Main Tables\n\n- **users**: User accounts and profiles (includes gender field, date_of_birth)\n- **lists**: Product lists created by users\n- **products**: Product information from APIs\n- **list_products**: Many-to-many relationship\n- **categories**: List categories (includes min_age, max_age for age restrictions)\n- **clicks**: Affiliate click tracking (includes sub_id for commission attribution)\n- **affiliate_sources**: API source configuration\n- **settings**: Site-wide settings\n- **sales**: Commission and sales data from Bol.com API\n- **drawings**: Drawing/Lottery events\n- **drawing_participants**: Participants in drawing events\n- **list_sections**: Sections for organizing products within lists\n- **list_collaborators**: Co-owners/collaborators for lists\n- **list_invitations**: Collaboration invitation tracking\n- **contributions**: Group gift contributions and crowdfunding\n\n### New Fields Added\n\n**users table:**\n- `gender` (ENUM: 'male', 'female', 'other') - Optional, for personalization\n- `date_of_birth` - Used for age calculation and personalized suggestions\n\n**categories table:**\n- `min_age` - Minimum age for products in this category\n- `max_age` - Maximum age for products in this category\n\n**clicks table:**\n- `sub_id` - Tracking ID for commission attribution (format: user_id_list_id)\n\n**sales table (new):**\n- `sub_id` - Tracking ID from affiliate link\n- `order_id` - Bol.com order ID\n- `product_id` - Bol.com product ID\n- `quantity` - Number of items\n- `commission` - Commission amount in EUR\n- `revenue_excl_vat` - Order revenue\n- `status` - Commission status (pending, approved, rejected)\n- `user_id` - List owner user ID\n- `list_id` - List ID\n\n**list_products table:**\n- `is_group_gift` - Enable group contributions (0 or 1)\n- `target_amount` - Funding goal in EUR\n- `section_id` - Reference to list_sections table\n\n**contributions table (new):**\n- `list_product_id` - Reference to list_products\n- `contributor_name` - Name of contributor\n- `contributor_email` - Optional email for notifications\n- `amount` - Contribution amount in EUR\n- `message` - Optional message from contributor\n- `is_anonymous` - Hide contributor name (0 or 1)\n- `status` - Contribution status (pending, completed, refunded)\n\n**list_collaborators table (new):**\n- `list_id` - Reference to lists\n- `user_id` - Collaborator user ID\n- `role` - Collaborator role (owner, editor)\n- `invited_by` - User who sent invitation\n- `invited_at` - Invitation timestamp\n- `accepted_at` - Acceptance timestamp\n\n**list_invitations table (new):**\n- `list_id` - Reference to lists\n- `inviter_id` - User sending invitation\n- `invitee_email` - Email of invited user\n- `invitee_id` - User ID once accepted\n- `token` - Unique invitation token\n- `status` - Invitation status (pending, accepted, rejected, expired)\n- `expires_at` - Expiration date (default 7 days)\n\n## Security Features\n\n- Password hashing with bcrypt\n- CSRF protection (can be enabled in filters)\n- SQL injection prevention via Query Builder\n- XSS protection with output escaping\n- IP anonymization for GDPR compliance\n- Role-based access control\n\n## Performance Optimization\n\n- Database query optimization with joins\n- Session-based authentication\n- Prepared statements for all queries\n- Efficient pagination\n- Asset CDN usage (Bootstrap, jQuery, Font Awesome)\n\n## Customization\n\n### Changing Colors\n\nEdit the CSS variables in `app/Views/layouts/main.php`:\n\n```css\n:root {\n    --primary-color: #2563eb;\n    --secondary-color: #64748b;\n    --success-color: #10b981;\n    --danger-color: #ef4444;\n}\n```\n\n### Adding Custom Fields\n\n1. Create migration for new column\n2. Update model's `$allowedFields`\n3. Add form field in view\n4. Update controller to handle new field\n\n## Troubleshooting\n\n### Database Connection Error\n- Verify MySQL is running\n- Check database credentials in `.env`\n- Ensure database exists\n\n### 404 Errors\n- Check `.htaccess` is present in `public/`\n- Verify `mod_rewrite` is enabled in Apache\n- Ensure `app.baseURL` is correct in `.env`\n\n### Bol.com API Not Working\n- Verify API credentials are correct\n- Check if credentials are properly set in `.env`\n- API may not work without valid credentials (will show friendly error)\n\n### Permission Denied\n- Ensure `writable/` directory has write permissions\n- Check file ownership on Linux/Mac\n\n## Development\n\n### Running Migrations\n\n```bash\n# Run all migrations\nphp spark migrate\n\n# Rollback last migration\nphp spark migrate:rollback\n\n# Reset database\nphp spark migrate:refresh\n```\n\n### Creating New Migration\n\n```bash\nphp spark make:migration CreateTableName\n```\n\n### Creating New Controller\n\n```bash\nphp spark make:controller ControllerName\n```\n\n### Creating New Model\n\n```bash\nphp spark make:model ModelName\n```\n\n## Automated Reminder System Setup\n\n### Prerequisites\n- Email configuration in `.env`\n- Cron job access on your server\n\n### Configure Email Settings\n\nIn your `.env` file, set up email:\n```\nemail.fromEmail = noreply@lijst.je\nemail.fromName = Lijst.je\nemail.SMTPHost = smtp.gmail.com\nemail.SMTPUser = your-email@gmail.com\nemail.SMTPPass = your-password\nemail.SMTPPort = 587\nemail.SMTPCrypto = tls\n```\n\n### Set Up Cron Job\n\nAdd this to your crontab to send reminders daily at 9:00 AM:\n\n```bash\n# Open crontab\ncrontab -e\n\n# Add this line (adjust path to your project)\n0 9 * * * cd /path/to/project \u0026\u0026 php spark reminders:send\n```\n\n**Alternative: Manual Testing**\n```bash\n# Test reminder system manually\nphp spark reminders:send\n```\n\n### How It Works\n\n1. **User creates a list** with event date (e.g., Birthday: Feb 19, 2025)\n2. **User enables reminders** with intervals (30, 14, 7 days before)\n3. **System generates reminder records** for all collaborators\n4. **Cron job runs daily** and checks for pending reminders\n5. **Emails are sent** X days before the event\n6. **Status tracked** (pending → sent/failed)\n\n### Example Flow\n\n```\nList: \"John's Birthday\"\nEvent Date: February 19, 2025\nCollaborators: alice@email.com, bob@email.com\nReminder Intervals: 30,14,7\n\nReminders Sent:\n- January 20, 2025 (30 days before) → Alice \u0026 Bob\n- February 5, 2025 (14 days before) → Alice \u0026 Bob  \n- February 12, 2025 (7 days before) → Alice \u0026 Bob\n```\n\n## Production Deployment\n\n1. Set `CI_ENVIRONMENT = production` in `.env`\n2. Disable debug mode\n3. Enable CSRF protection in `app/Config/Filters.php`\n4. Set proper file permissions (755 for directories, 644 for files)\n5. Configure SSL certificate\n6. Set up proper backup system\n7. **Configure cron jobs:**\n   - Daily reminder emails: `0 9 * * * php spark reminders:send`\n   - Commission sync: As per existing schedule\n8. Use production database credentials\n9. Enable caching for better performance\n10. Configure production email SMTP settings\n\n## License\n\nThis project is open-source and available under the MIT License.\n\n## Support\n\nFor issues and questions:\n- Check the documentation\n- Review CodeIgniter 4 documentation\n- Check database migrations are run correctly\n\n## Credits\n\n- Built with CodeIgniter 4\n- Bootstrap 5 for UI\n- Font Awesome for icons\n- Bol.com for affiliate products\n\n## Advanced Features Documentation\n\n### Gender \u0026 Personalization System\n\n**User Profile Management:**\n- Optional gender field (male, female, other)\n- Automatic age calculation from date of birth\n- Profile editing at `/user/profile`\n\n**Personalized Product Suggestions:**\n- Suggestions based on user age and gender\n- Dutch search terms: \"cadeaus voor {age} jarige {gender}\"\n- Fallback to popular products if no personalization data\n- Displayed in list editor above category suggestions\n\n**Advanced Product Filters:**\n- Sort options: Relevance, Price (Low-High, High-Low), Popularity, Rating\n- Category filtering with product counts\n- Price range filtering (min-max)\n- Dynamic filter UI populated from API response\n\n### Sales \u0026 Commission System\n\n**Commission Attribution:**\n- SubId format: `user_id_list_id` (e.g., `10_45`)\n- Automatically appended to all affiliate links\n- Tracked through entire customer journey\n- Stored in clicks table for reference\n\n**Sales Data Storage:**\n- Order ID from Bol.com\n- Commission amount in EUR\n- Product information\n- Commission status tracking\n- User and list attribution\n\n**Commission Status Values:**\n- `pending` - Reported by Bol.com, awaiting approval\n- `approved` - Commission confirmed and ready for payout\n- `rejected` - Commission rejected (returns, fraud, etc.)\n\n**Scheduled Report Fetching:**\n- Daily automated fetching via cron job\n- Manual fetching with custom date ranges\n- Dry-run mode for testing\n- Duplicate prevention (orderExists check)\n- Comprehensive error logging\n\n### Drawing/Lottery System (Loten Trekken)\n\n**Event Management:**\n- Create drawing events with title and description\n- Set event date\n- Track event status (pending, drawn, completed)\n\n**Participant Management:**\n- Invite users to participate\n- Track participant status (pending, accepted, declined)\n- Assign wish lists to participants\n- Random lot drawing\n\n**Features:**\n- Email notifications for invitations\n- Participant response tracking\n- Random assignment of participants\n- Wish list viewing for assigned person\n\n### Dashboard Analytics\n\n**User Dashboard:**\n- Total lists, clicks, and sales count\n- Commission statistics (approved, pending, rejected)\n- Total earned commissions\n- Sales history table\n- Click history\n\n**Admin Dashboard:**\n- Global sales statistics\n- Top users by commission\n- Complete sales history with user attribution\n- Commission status breakdown\n- Sales by user ranking\n\n## Troubleshooting\n\n### Database Connection Error\n- Verify MySQL is running\n- Check database credentials in `.env`\n- Ensure database exists\n- Try browser-based migration runners if CLI unavailable\n\n### 404 Errors\n- Check `.htaccess` is present in `public/`\n- Verify `mod_rewrite` is enabled in Apache\n- Ensure `app.baseURL` is correct in `.env`\n\n### Bol.com API Not Working\n- Verify API credentials are correct in `.env`\n- Check if credentials are properly set\n- API may not work without valid credentials (will show friendly error)\n- Verify OAuth token generation is working\n\n### Permission Denied\n- Ensure `writable/` directory has write permissions\n- Check file ownership on Linux/Mac\n- Verify `public/` folder is accessible\n\n### Commission Reports Not Fetching\n- Verify cron job is configured correctly\n- Check application logs for API errors\n- Ensure Bol.com API credentials are valid\n- Verify date format is YYYY-MM-DD\n- Check if orders have been placed with affiliate links\n\n### Personalized Suggestions Not Showing\n- Verify user has date_of_birth set\n- Check gender field is populated (optional but recommended)\n- Verify Bol.com API credentials are valid\n- Check application logs for API errors\n\n### Gender Field Not Appearing\n- Run migration: `php spark migrate`\n- Or use browser migration runner: `/run_migration_gender.php`\n- Clear browser cache if field still not visible\n\n## Changelog\n\n### Version 2.0.0 (Major Update)\n- Gender field and personalization system\n- Personalized product suggestions based on age/gender\n- Advanced product filters (sort, category, price)\n- Bol.com Affiliate Reporting API v2 integration\n- Commission tracking and sales management\n- Scheduled report fetching with cron jobs\n- Sales dashboard for users and admins\n- Drawing/Lottery system (Loten Trekken)\n- User profile management\n- Age-based product recommendations\n- Commission status tracking\n\n### Version 1.0.0 (Initial Release)\n- Complete user authentication system\n- List creation and management\n- Bol.com Marketing Catalog API v1 integration\n- Admin dashboard\n- Click tracking with subId support\n- Analytics\n- Category management with age restrictions\n- Responsive design\n- Drawing event creation and management\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmesumbinshaukat%2Faffiliate-system-codeigniter-4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmesumbinshaukat%2Faffiliate-system-codeigniter-4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmesumbinshaukat%2Faffiliate-system-codeigniter-4/lists"}