{{ t('title_dashboard') }}
{{ s.label }}
{{ s.value }}
{{ t('lbl_kpi_clicks_mtd') }}
{{ dashExtra.clicks_mtd || 0 }}
{{ t('lbl_kpi_ftds_mtd') }}
{{ dashExtra.ftds_mtd || 0 }}
{{ dashExtra.ftds_pct >= 0 ? '+' : '' }}{{ dashExtra.ftds_pct }}%
{{ t('lbl_kpi_regs_mtd') }}
{{ dashExtra.registrations_mtd || 0 }}
{{ dashExtra.registrations_pct >= 0 ? '+' : '' }}{{ dashExtra.registrations_pct }}%
{{ t('lbl_kpi_conv_rate') }}
{{ dashExtra.conversion_rate || '0.00' }}%
{{ t('lbl_kpi_comm_mtd') }}
${{ (dashExtra.commission_mtd||0).toFixed(2) }}
{{ t('lbl_kpi_dep_ytd') }}
${{ (dashExtra.deposits_ytd||0).toFixed(2) }}
{{ t('lbl_ftds_by_day') }}
{{ t('lbl_clicks_by_country') }}
{{ i+1 }}
{{ c.country || 'Unknown' }}
{{ c.clicks }}
{{ t('no_data') }}
{{ t('welcome') }}, {{ userName }}
{{ t('welcome_sub') }}
{{ t('title_users') }} {{ t('btn_new_user') }}
👥 User Accounts
📋 Product Applications
{{ adminProductApps.filter(a=>a.status==='pending').length }}
No pending product applications.
Affiliate Email Country Product Vertical Owner Applied Actions
{{ a.affiliate_name }}{{ a.company_name }}
{{ a.affiliate_email }}
{{ a.country || '—' }}
{{ a.product_name }}
{{ a.vertical }}
{{ a.owner_name || '—' }}
{{ a.created_at?.slice(0,10) }}
✓ Approve
✕ Reject
{{ t('opt_all_roles') }}
{{ t('opt_affiliates') }}
{{ t('opt_owners') }}
{{ t('opt_admins') }}
{{ t('opt_all_status') }}
{{ t('status_pending') }}
{{ t('status_active') }}
{{ t('status_suspended') }}
Rejected
{{ t('col_name') }} {{ t('col_email') }} {{ t('col_role') }} {{ t('col_status') }} {{ t('col_payments') }} Via Company Products {{ t('col_joined') }} {{ t('col_action') }}
{{ t('loading') }}
{{ u.name }}
{{ u.email }}
{{ u.role }}
{{ u.status }}
{{ t('lbl_pay_frozen') }}
{{ t('lbl_pay_active') }}
{{ u.invited_by_brand }} —
{{ pname }}
{{ pname }}
—
{{ u.created_at?.slice(0,10) }}
👁 Review
👁 View
✓
✕
🚫 Suspend
↩ Activate
Confirm
Cancel
🗑 Remove
🔒 Freeze
🔓 Release
💰 Bonus
{{ t('title_products') }}
+ Add Product
{{ t('col_name') }} {{ t('col_vertical') }} Company {{ t('col_status') }} {{ t('col_action') }}
{{ t('loading') }}
{{ p.name }}
{{ p.vertical }}
{{ p.brand_name }}
—
{{ p.status }}
✏ Edit
⚙ Integration
{{ t('btn_approve') }}
{{ t('btn_pause') }}
{{ t('btn_activate') }}
Confirm
Delete
Cancel
{{ t('title_conversions') }} {{ t('btn_change_player') }}
{{ t('col_affiliate') }} {{ t('col_product') }} {{ t('col_player_id') }} {{ t('col_event') }} {{ t('col_amount') }} {{ t('col_commission') }} {{ t('col_status') }} {{ t('col_date') }}
{{ c.affiliate_name }}
{{ c.product_name }}
{{ c.external_id || '—' }}
{{ c.event_type }}
${{ c.amount }}
${{ c.commission }}
{{ c.status }}
{{ c.created_at?.slice(0,10) }}
No conversions yet.
{{ t('title_payouts') }}
{{ t('col_affiliate') }} {{ t('col_amount') }} {{ t('col_method') }} {{ t('col_status') }} {{ t('col_date') }} {{ t('col_action') }}
{{ p.affiliate_name }}
${{ p.amount }}
{{ p.method }}
{{ p.status }}
{{ p.created_at?.slice(0,10) }}
{{ t('btn_approve') }}
{{ t('btn_mark_paid') }}
{{ t('btn_reject') }}
No payout requests yet.
{{ t('title_my_products') }}
{{ t('col_name') }} {{ t('col_vertical') }} {{ t('th_url') }} {{ t('col_status') }} {{ t('col_action') }}
{{ p.name }}
{{ p.vertical }}
{{ p.url.slice(0,30) }}…
{{ t('status_'+p.status) || p.status }}
{{ t('btn_set_commission') }}
🖼️ Banners
{{ t('title_my_affiliates') }}
{{ t('th_name') }} {{ t('th_email') }} {{ t('th_product') }} {{ t('th_tracking_code') }} {{ t('th_status') }} {{ t('th_joined') }}
{{ a.name }} {{ a.email }} {{ a.product_name }}
{{ a.tracking_code }}
{{ t('status_'+a.status) || a.status }}
{{ a.created_at?.slice(0,10) }}
{{ t('title_my_conversions') }}
{{ t('th_affiliate') }} {{ t('th_event') }} {{ t('th_amount') }} {{ t('th_commission') }} {{ t('th_status') }} {{ t('th_date') }}
{{ c.affiliate_name }}
{{ c.event_type }}
${{ c.amount }}
${{ c.commission }}
{{ t('status_'+c.status) || c.status }}
{{ c.created_at?.slice(0,10) }}
{{ t('no_conversions') }}
{{ t('title_campaigns') }} {{ t('btn_add_campaign') }}
{{ t('col_name') }} {{ t('col_product') }} {{ t('col_status') }} {{ t('th_start') }} {{ t('th_end') }} {{ t('col_action') }}
{{ c.name }} {{ c.product_name }}
{{ t('status_'+c.status) || c.status }}
{{ c.start_date || '—' }} {{ c.end_date || '—' }}
Sure?
Cancel
Delete
{{ t('no_campaigns') }}
{{ t('title_browse') }}
{{ p.name }}
{{ p.vertical }}
{{ p.description }}
{{ p.model?.toUpperCase() }}
${{ p.cpa_amount }} CPA
{{ p.rev_pct }}% RevShare
No commission plan set
{{ applyingId===p.id ? '⏳ Applying…' : t('btn_apply_promote') }}
⏳ Pending Approval
✓ Approved
✗ Rejected
🎮 My Products
+ Apply for More
{{ l.product_name }}
{{ l.vertical }}{{ l.campaign_name ? ' · '+l.campaign_name : '' }}
Active
Model
{{ l.model?.toUpperCase() }}
RevShare
{{ l.rev_pct }}%
No commission plan set yet
Your Tracking Link
{{ API_BASE }}/t/{{ l.tracking_code }}{{ getSubIdSuffix(l.tracking_code) }}
✓ Copied!
📋
Sub IDs (optional)
Pending Approval
{{ l.product_name }}
{{ l.vertical }}
⏳ Pending
🎮
No products yet
Browse available products and apply to start promoting.
Browse Products →
{{ t('title_my_conv') }}
{{ t('th_product') }} {{ t('th_event') }} {{ t('th_amount') }} {{ t('th_commission') }} {{ t('th_status') }} {{ t('th_date') }}
{{ c.product_name }}
{{ c.event_type }}
${{ c.amount }}
${{ c.commission }}
{{ t('status_'+c.status) || c.status }}
{{ c.created_at?.slice(0,10) }}
{{ t('title_earnings') }}
{{ t('th_type') }} {{ t('th_amount') }} {{ lang==='es'?'Saldo Después':'Balance After' }} {{ t('th_note') }} {{ t('th_date') }}
{{ e.type }}
${{ Math.abs(e.amount).toFixed(2) }}
${{ e.balance_after?.toFixed(2) }}
{{ e.note || '—' }}
{{ e.created_at?.slice(0,10) }}
{{ t('title_my_payouts') }}
{{ t('lbl_available_balance') }}
${{ stats.find(s=>s.label==='Balance')?.raw?.toFixed(2) || '0.00' }}
{{ t('lbl_payout_history') }}
{{ t('th_amount') }} {{ t('th_method') }} {{ t('th_status') }} {{ t('th_date') }}
${{ p.amount }} {{ p.method }}
{{ p.status }}
{{ p.created_at?.slice(0,10) }}
{{ t('no_payouts') }}
{{ t('tab_overview') }}
{{ t('tab_players') }}
{{ t('tab_traffic') }}
{{ t('tab_activity') }}
{{ t('tab_monthly') }}
{{ t('tab_ftd_day') }}
{{ t('tab_media') }}
{{ t('lbl_player_report') }} {{ t('btn_export_csv2') }}
{{ t('th_player_id') }} {{ t('th_affiliate') }} {{ t('th_product') }} {{ t('th_events') }} {{ t('th_total_deposit') }} {{ t('th_commission') }} {{ t('th_first_seen') }}
{{ p.player_id }}
{{ p.affiliate_name }}
{{ p.product_name }}
{{ p.event_types }}
${{ (p.total_deposit||0).toFixed(2) }}
${{ (p.commission||0).toFixed(2) }}
{{ p.first_seen?.slice(0,10) }}
{{ t('no_player_data') }}
{{ t('lbl_by_traffic_source') }}
{{ t('th_source') }} {{ t('th_clicks') }} {{ t('th_unique') }} {{ t('th_affiliate') }}
{{ s.source }}
{{ s.clicks }}
{{ s.unique_clicks }}
{{ s.affiliates }}
No data
{{ t('lbl_by_country') }}
{{ t('th_country') }} {{ t('th_clicks') }} {{ t('th_unique') }}
{{ c.country }} {{ c.clicks }} {{ c.unique_clicks||c.clicks }}
{{ t('no_data') }}
{{ t('lbl_affiliate_activity') }}
{{ t('th_name') }} {{ t('th_email') }} {{ t('th_clicks') }} {{ t('th_conversions') }} {{ t('th_commission') }} {{ t('lbl_last_click') }}
{{ a.name }}
{{ a.email }}
{{ a.clicks||0 }}
{{ a.conversions||0 }}
${{ (a.commission||0).toFixed(2) }}
{{ a.last_click?.slice(0,16) || '—' }}
{{ t('lbl_no_activity') }}
Monthly Clicks (last 12 months)
Monthly Conversions & Commission
{{ t('lbl_monthly_trend') }} {{ t('btn_export_csv2') }}
{{ t('th_month') }} {{ t('th_clicks') }} {{ t('th_conversions') }} {{ t('th_commission') }}
{{ m.month }}
{{ m.clicks || 0 }}
{{ m.conversions || 0 }}
${{ (m.commission||0).toFixed(2) }}
{{ t('no_monthly_data') }}
{{ t('lbl_ftds_by_day') }}
{{ t('th_day') }} {{ t('th_ftds') }} {{ t('th_share') }}
{{ d.day }}
{{ d.ftds }}
{{ ftdDayTotal>0 ? Math.round((d.ftds/ftdDayTotal)*100) : 0 }}%
{{ t('no_ftd_data') }}
{{ t('lbl_media_by_type') }} {{ t('btn_export_csv2') }}
{{ t('th_type') }} {{ t('th_items') }} {{ t('th_downloads') }}
{{ m.type }}
{{ m.count }}
{{ m.downloads || 0 }}
{{ t('no_media_data') }}
{{ t('lbl_media_by_cat') }}
{{ t('th_category') }} {{ t('th_items') }}
{{ m.category || (lang==='es'?'Sin categoría':'Uncategorized') }}
{{ m.count }}
{{ t('no_data') }}
{{ t('lbl_recent_uploads') }}
{{ lang==='es'?'Título':'Title' }} {{ t('th_type') }} {{ lang==='es'?'Dimensiones':'Dimensions' }} {{ lang==='es'?'Idioma':'Language' }} {{ lang==='es'?'Subido':'Uploaded' }}
{{ m.title }}
{{ m.type }}
{{ m.width && m.height ? m.width+'×'+m.height : '—' }}
{{ m.language }} —
{{ m.created_at?.slice(0,10) }}
{{ t('no_recent_uploads') }}
{{ t('th_clicks') }}
{{ reportData.clicks || 0 }}
{{ t('th_conversions') }}
{{ reportData.conversions || 0 }}
{{ t('th_commission') }}
${{ (reportData.commission||0).toFixed(2) }}
{{ t('lbl_stat_affiliates') }}
{{ reportData.active_affiliates || 0 }}
{{ t('lbl_stat_volume') }}
${{ (reportData.volume||0).toFixed(2) }}
Performance by Product
Product Clicks Conv. Commission
{{ p.name }} {{ p.clicks }} {{ p.conversions }}
${{ p.commission?.toFixed(2) }}
{{ t('lbl_top_affiliates') }}
⬇ CSV
# {{ t('th_name') }} {{ t('th_email') }} {{ t('th_clicks') }} {{ t('th_conversions') }} {{ t('th_conv_rate') }} {{ t('th_commission') }}
{{ i+1 }}
{{ a.name }}
{{ a.email }}
{{ a.clicks||0 }}
{{ a.conversions||0 }}
{{ a.conv_rate||0 }}%
${{ (a.commission||0).toFixed(2) }}
{{ t('lbl_clicks_by_country') }}
{{ t('th_country') }} {{ t('th_clicks') }}
{{ c.country || 'Unknown' }} {{ c.clicks }}
{{ t('lbl_product_perf') }}
⬇ CSV
{{ t('th_product') }} {{ t('col_vertical') }} {{ t('th_clicks') }} {{ t('th_conversions') }} {{ t('th_conv_rate') }} {{ t('th_commission') }}
{{ p.name }} {{ p.vertical }} {{ p.clicks||0 }}
{{ p.conversions||0 }} {{ p.conv_rate||0 }}%
${{ (p.commission||0).toFixed(2) }}
👥 Affiliates
Accounts
Search
Add Affiliate
Pending Approvals {{ pendingApps }}
Name Email Product Tracking Code Status Joined
{{ a.name }}
{{ a.email }}
{{ a.product_name }}
{{ a.tracking_code }}
{{ a.status }}
{{ a.created_at?.slice(0,10) }}
No affiliates yet.
Add Affiliate Directly
Add an existing affiliate account directly to one of your products (auto-approved, no application needed).
Affiliate Email *
Product *
— Select product —
{{ p.name }}
Add Affiliate
{{ addAffMsg }}
{{ addAffMsg }}
No pending applications.
Affiliate Email Country Product Applied Documents Actions
{{ a.affiliate_name }}{{ a.company_name }}
{{ a.affiliate_email }}
{{ a.country || '—' }}
{{ a.product_name }}
{{ a.created_at?.slice(0,10) }}
📄 View Docs
None
Approve
Reject
{{ t('title_applications') }}
{{ t('no_applications') }}
{{ t('th_affiliate') }} {{ t('th_email') }} {{ t('th_product') }} {{ t('th_applied') }} {{ t('th_actions') }}
{{ a.affiliate_name }}
{{ a.affiliate_email }}
{{ a.product_name }}
{{ a.created_at?.slice(0,10) }}
{{ t('btn_approve_promote') }}
{{ t('btn_reject_promote') }}
{{ t('title_security') }}
{{ t('lbl_how_it_works') }}
{{ t('lbl_2fa_step1') }}
{{ t('lbl_2fa_step2') }}
{{ t('lbl_2fa_step3') }}
{{ t('lbl_2fa_step4') }}
⚠ {{ t('lbl_2fa_warning_title') }} — {{ t('lbl_2fa_warning_body') }}
🎨 {{ lang==='es'?'Marca Blanca':'White-Label Branding' }}
{{ t('lbl_live_preview') }}
{{ brandForm.company_name || 'Your Company' }}
AFFILIATE PORTAL
Email
Password
Sign In
{{ brandForm.footer_text }}
{{ t('lbl_custom_domain_setup') }}
To use your own domain for the affiliate portal:
Add a CNAME record in your DNS:
Type: CNAME
Name: {{ brandForm.custom_domain ? brandForm.custom_domain.split('.')[0] : 'affiliates' }}
Value: p24-affiliate.pages.dev
2. Enter the full domain above and save.
3. Contact admin to activate SSL for your domain.
🎨 Owner Branding Management
{{ t('lbl_all_owners') }}
Owner Company Name Primary Color Custom Domain Action
{{ b.owner_name }}
{{ b.company_name || '—' }}
{{ b.primary_color }}
Default
{{ b.custom_domain }}
—
Edit
🚨 Fraud Detection
Total Duplicate Clicks
{{ fraudData.summary?.total_dup || 0 }}
Affiliates with Dups
{{ fraudData.summary?.affected_affiliates || 0 }}
Suspended
{{ fraudData.suspended?.length || 0 }}
Top Duplicate Click Offenders
Affiliate Email Duplicate Clicks Last Seen Action
{{ a.name }}
{{ a.email }}
{{ a.dup_count }}
{{ a.last_seen?.slice(0,16) }}
Confirm Suspend
Cancel
Suspend & Flag
No duplicate click offenders detected
Currently Suspended Affiliates
Name Email Suspended Since Action
{{ a.name }} {{ a.email }}
{{ (a.suspended_since || a.updated_at || a.created_at)?.slice(0,10) }}
Reinstate
No suspended affiliates
🎯 Pixels & Tags
{{ t('btn_add_pixel') }}
{{ t('lbl_your_pixels') }}
{{ t('lbl_pixels_desc') }}
{{ t('th_platform') }} {{ t('th_pixel_id_col') }} {{ t('th_event_name') }} {{ t('col_product') }} {{ t('th_server_api') }} {{ t('col_status') }} {{ t('th_actions') }}
{{ px.platform }}
{{ px.pixel_id }}
{{ px.event_name }}
{{ px.product_name || (lang==='es'?'Todos los Productos':'All Products') }}
{{ (px.platform==='facebook'||px.platform==='tiktok') && px.access_token ? '✅' : '—' }}
{{ px.is_active ? t('lbl_pixel_active') : t('lbl_pixel_paused') }}
{{ px.is_active ? t('btn_pause') : t('btn_activate') }}
{{ t('btn_delete') }}
Delete this pixel?
Yes, Delete
Cancel
{{ t('no_pixels') }}
🖼️ {{ t('nav_media') }} {{ t('btn_add_media') }}
{{ t('opt_all_types') }}
{{ lang==='es'?'Banner':'Banner' }}
{{ lang==='es'?'Logo':'Logo' }}
{{ lang==='es'?'Video':'Video' }}
{{ lang==='es'?'Plantilla de Email':'Email Template' }}
{{ lang==='es'?'Página de Destino':'Landing Page' }}
{{ m.name }}
{{ m.product_name || 'All Products' }} · {{ m.size || '—' }}
{{ m.type }}
{{ m.status }}
{{ lang==='es'?'Ver':'View' }}
{{ t('btn_delete') }}
{{ t('no_media_yet') }}
🎟️ {{ t('nav_promos') }} {{ t('btn_add_promo') }}
{{ t('th_code') }} {{ t('col_product') }} {{ t('col_owner') }} {{ t('col_affiliate') }} {{ t('col_type') }} {{ t('th_value') }} {{ t('th_uses') }} {{ t('th_expires') }} {{ t('col_status') }} {{ t('col_action') }}
{{ p.code }}
{{ p.product_name || (lang==='es'?'Todos':'All') }}
{{ p.owner_name || '—' }}
{{ p.affiliate_name || (lang==='es'?'Todos':'All') }}
{{ p.bonus_type }}
{{ p.bonus_value || '—' }}
{{ p.uses_count||0 }}{{ p.max_uses ? '/'+p.max_uses : '' }}
{{ p.expires_at?.slice(0,10) || t('lbl_never_expires') }}
{{ p.status }}
Sure?
Cancel
{{ t('btn_delete') }}
{{ t('no_promos') }}
🖼️ Media Management
+ Add Media
📚 Library
📊 Media Report
All Products
{{ p.name }}
All Status
Active
Inactive
ID Name Type Product Status Tracking Link Action
#{{ m.id }}
{{ m.title }}
{{ m.width }}×{{ m.height }}
{{ m.media_type }}
{{ m.product_name || '—' }}
{{ m.status }}
...?mid={{ m.id }}
Copy
👁 Preview
Edit
Del
No media yet. Add banners and creatives for your affiliates.
ℹ️ How banners reach affiliates:
Banners you upload here are automatically visible to affiliates in their Creatives page — as long as they are approved for the linked product. No manual sharing needed.
The Tracking Link is for click-through attribution: copy it, replace {TRACKING_CODE} with the affiliate's actual code, then they embed the banner image with that link as the click destination.
ID Media Type Status Clicks Unique Regs FTDs Revenue CTR
#{{ m.id }}
{{ m.title }}
{{ m.media_type }}
{{ m.status }}
{{ m.clicks }}
{{ m.unique_clicks }}
{{ m.registrations }}
{{ m.ftds }}
${{ m.revenue?.toFixed(2) }}
{{ m.unique_clicks>0 ? ((m.conversions/m.unique_clicks)*100).toFixed(1)+'%' : '—' }}
No media performance data yet.
🎟️ {{ t('nav_promos') }} {{ t('btn_add_promo') }}
{{ t('th_code') }} {{ t('col_product') }} {{ t('col_affiliate') }} {{ t('col_type') }} {{ t('th_value') }} {{ t('th_uses') }} {{ t('th_expires') }} {{ t('col_action') }}
{{ p.code }}
{{ p.product_name || '—' }}
{{ p.affiliate_name || (lang==='es'?'Todos':'All') }}
{{ p.bonus_type }}
{{ p.bonus_value || '—' }}
{{ p.uses_count||0 }}{{ p.max_uses ? '/'+p.max_uses : '' }}
{{ p.expires_at?.slice(0,10) || t('lbl_never_expires') }}
{{ t('btn_delete') }}
{{ t('no_promos') }}
🖼️ {{ t('title_creatives') }}
{{ t('lbl_creatives_desc') }}
{{ m.title || m.name }}
{{ m.product_name || (lang==='es'?'Todos los Productos':'All Products') }} · {{ m.media_type || m.type }}
⬇ {{ t('btn_download') }}
🔗 Copy Link
{{ t('lbl_no_creatives_aff') }}
💎 Commission Management
Product Settings
Custom Plans
CPA CAP Usage
No products with commission rules yet.
+ New Custom Plan
Affiliate Product Plan Model CPA Rev% CAP Carryover Action
{{ p.affiliate_name }}{{ p.affiliate_email }}
{{ p.product_name }}
{{ p.plan_name }}
{{ p.model }}
${{ p.cpa_amount || '—' }}
{{ p.rev_pct ? p.rev_pct+'%' : '—' }}
{{ p.cpa_cap ? p.cpa_cap+'/'+p.cpa_cap_period : '—' }}
{{ p.negative_carryover ? 'Yes' : 'No' }}
Delete
No custom plans. All affiliates use the default product commission.
Current Period CPA CAP Usage
Affiliate Product Used Limit % Used Period
{{ c.affiliate_name }}
{{ c.product_name }}
{{ c.count }}
{{ c.cap_limit || '∞' }}
{{ Math.round((c.count/c.cap_limit)*100) }}%
No cap
{{ c.period }}
No CPA activity this period
💎 Commission Settings
Set commission rules first via My Products.
🤝 Referral Commission
Referral Relationships
Referrer Sub-Affiliate Joined Their Earnings Referral Earned
{{ r.referrer_name }}{{ r.referrer_email }}
{{ r.referee_name }}{{ r.referee_email }}
{{ r.created_at?.slice(0,10) }}
—
${{ (r.total_referral_earned||0).toFixed(2) }}
No referral relationships yet
🧾 Invoices + Create Invoice
Invoice # Affiliate Amount Status Created Actions
{{ inv.invoice_number || '#'+inv.id }}
{{ inv.affiliate_name }}{{ inv.affiliate_email }}
${{ inv.amount?.toFixed(2) }} {{ inv.currency }}
{{ inv.status }}
{{ inv.created_at?.slice(0,10) }}
Send
Mark Paid
Del
No invoices yet. They are auto-created when payouts are approved.
💬 Messages + Compose
To Subject Type Date
{{ m.is_broadcast ? '📢 All Affiliates' : (m.to_name||m.to_id) }}
{{ m.subject }}
{{ m.is_broadcast ? 'Broadcast' : 'Direct' }}
{{ m.created_at?.slice(0,16) }}
No messages sent yet
🎟️ Available Promo Codes
Use these promo codes in your promotions. Click a code to copy it.
Code Product Bonus Type Value Expires
{{ p.code }} ✓ Copied!
{{ p.product_name || 'All Products' }}
{{ p.bonus_type }}
{{ p.bonus_value || '—' }}
{{ p.expires_at?.slice(0,10) || 'Never' }}
No promo codes available for your products yet.
🤝 Refer & Earn
Your Referral Link
Share this link to recruit other affiliates. You earn a % of their commissions automatically.
{{ refLinkFull }} ✓ Copied!
Code: {{ refCode }}
Sub-Affiliates
{{ myReferrals.length }}
Total Earned
${{ refEarningsTotal.toFixed(2) }}
How It Works
1. Share your referral link with other marketers
2. When they register and get approved, they become your sub-affiliate
3. Every time they earn a commission, you automatically earn a percentage
4. Your referral earnings appear in your earnings ledger
My Sub-Affiliates
Name Email Status Their Clicks Their Conversions Joined
{{ r.name }}
{{ r.email }}
{{ r.status }}
{{ r.clicks || 0 }}
{{ r.their_commission?.toFixed(2) ? '$'+r.their_commission.toFixed(2) : '—' }}
{{ r.created_at?.slice(0,10) }}
No sub-affiliates yet. Share your referral link to get started!
🧾 My Invoices
Invoice # Amount Status Created Paid
{{ inv.invoice_number || '#'+inv.id }}
${{ Number(inv.amount).toFixed(2) }} {{ inv.currency }}
{{ inv.status }}
{{ inv.created_at?.slice(0,10) }}
{{ inv.paid_at?.slice(0,10) || '—' }}
👁 View
No invoices yet. Invoices are generated automatically when your payout is approved.
🧾 Invoice Details
✕ Close
{{ selectedInvoice.invoice_number || '#'+selectedInvoice.id }}
${{ selectedInvoice.amount?.toFixed(2) }} {{ selectedInvoice.currency }}
{{ selectedInvoice.status }}
Invoice #
{{ selectedInvoice.invoice_number || '—' }}
Payout Reference
{{ selectedInvoice.payout_id ? '#'+selectedInvoice.payout_id : '—' }}
Amount
${{ selectedInvoice.amount?.toFixed(2) }} {{ selectedInvoice.currency }}
Status
{{ selectedInvoice.status }}
Created
{{ selectedInvoice.created_at?.slice(0,10) || '—' }}
Sent
{{ selectedInvoice.sent_at?.slice(0,10) || '—' }}
Paid
{{ selectedInvoice.paid_at?.slice(0,10) || '—' }}
Notes
{{ selectedInvoice.notes }}
Close
💬 Messages
Mark All Read
{{ m.subject }} New
{{ m.created_at?.slice(0,16) }}
{{ m.body }}
No messages yet.
🔑 {{ t('nav_docs_tokens') }}
+ {{ t('docs_create_token') }}
{{ t('docs_token_desc') }}
Name
Token
Type
Expires
Created
No tokens yet. Create one to share docs.
{{ t.name }}
{{ t.token }}
📋
{{ t.type }}
{{ t.expires_at || '—' }}
{{ t.created_at?.slice(0,10) }}
Sure?
Cancel
Revoke
📖 Docs URLs
Brands:
https://p24-docs.pages.dev?key={token}
→ shows brand docs
Affiliates:
https://p24-docs.pages.dev?key={token}
→ shows affiliate docs
🏢 Companies + Add Company
Company Manager Website Products Status Action
{{ b.owner_name }}
—
{{ b.website }} —
{{ b.product_count || 0 }} products
{{ b.status }}
Edit
Sure?
Cancel
Del
No companies yet. Add a company to group your products.
🏢 My Companies + Add Company
Company Website Products Color
{{ b.website }} —
{{ b.product_count || 0 }} products
{{ b.primary_color }}
No companies yet.
🔌 Integration
Per-product technical integration details. Share these with your development team to complete the connection and start UAT.
{{ p.name }}
{{ p.status }}
INTEGRATION TOKEN
{{ p.integration_token || '—' }}
VERTICAL
{{ p.vertical }}
POSTBACK URL
https://p24-affiliate-api.savio-sami.workers.dev/postback?token={{ p.integration_token }}&event={event}&click_id={click_id}&amount={amount}¤cy={currency}
Copy URL
SETUP NOTES
{{ p.setup_notes }}
No products yet.
💳 Payments & Invoices
+ Create Invoice
Invoice # Affiliate Amount Status Date Notes
{{ inv.invoice_number }}
{{ inv.affiliate_name || '—' }}
{{ inv.affiliate_email }}
${{ inv.amount }} {{ inv.currency }}
{{ inv.status }}
{{ inv.created_at?.slice(0,10) }}
{{ inv.notes || '—' }}
No invoices yet.
🔐 {{ t('title_team_access') }}
{{ t('btn_add_team_member') }}
{{ t('th_name') }} {{ t('th_email') }} {{ t('th_sections') }} {{ t('th_access_level') }} {{ t('th_status') }} {{ t('th_actions') }}
{{ m.name }}
{{ m.email }}
{{ s }}
{{ m.access_level }}
{{ m.status }}
{{ t('btn_remove') }}
{{ t('lbl_no_team_members') }}
💱 Exchange Rates (from USD)
Add / Update Rate
{{ rateMsg }}
Current Rates
From To Rate Updated Action
USD
{{ r.to_currency }}
{{ r.rate }}
{{ r.updated_at?.slice(0,16) }}
Sure?
Cancel
Delete
No exchange rates configured
🌍 Country Tax Rules
Add / Update Rule
{{ taxMsg }}
Country Tax Rules
Country Tax Rate Applies To Action
{{ t.country }}
{{ t.tax_rate }}%
{{ t.applies_to }}
Sure?
Cancel
Delete
No tax rules configured
✅ Payment Qualification Rules
Add Rule
Apply globally (all affiliates)
Add Rule
{{ qualMsg }}
Active Rules
Type Min Clicks Min Conv. Min Balance Action
{{ q.is_global ? 'Global' : 'Product' }}
{{ q.min_clicks || 0 }}
{{ q.min_conversions || 0 }}
${{ q.min_balance || 0 }}
Sure?
Cancel
Delete
No qualification rules — all affiliates can request payout