{{ t('title_dashboard') }}
{{ s.label }}
{{ s.value }}
Clicks (MTD)
{{ dashExtra.clicks_mtd || 0 }}
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') }}
{{ 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') }} {{ t('col_joined') }} {{ t('col_action') }}
{{ u.name }}
{{ u.email }}
{{ u.role }}
{{ u.status }}
{{ t('lbl_pay_frozen') }}
{{ t('lbl_pay_active') }}
{{ u.created_at?.slice(0,10) }}
{{ t('btn_review') }}
{{ t('btn_approve') }}
{{ t('btn_reject') }}
{{ t('btn_view_user') }}
{{ t('btn_suspend') }}
{{ t('btn_activate') }}
🗑 Remove
{{ t('btn_freeze') }}
{{ t('btn_release') }}
{{ t('btn_bonus') }}
{{ t('title_products') }}
{{ t('col_name') }} {{ t('col_vertical') }} {{ t('col_owner') }} {{ t('col_status') }} {{ t('col_action') }}
{{ p.name }}
{{ p.vertical }}
{{ p.owner_name }}
{{ p.status }}
{{ t('btn_approve') }}
{{ t('btn_pause') }}
{{ t('btn_activate') }}
{{ 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) }}
{{ 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') }}
{{ t('title_my_products') }} {{ t('btn_add_product') }}
{{ 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') }}
{{ 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('title_campaigns') }} {{ t('btn_add_campaign') }}
{{ t('col_name') }} {{ t('col_product') }} {{ t('col_status') }} {{ t('th_start') }} {{ t('th_end') }}
{{ c.name }} {{ c.product_name }}
{{ t('status_'+c.status) || c.status }}
{{ c.start_date || '—' }} {{ c.end_date || '—' }}
{{ t('title_browse') }}
{{ p.name }}
{{ p.vertical }}
{{ p.description }}
{{ p.model?.toUpperCase() }}
${{ p.cpa_amount }} CPA
{{ p.rev_pct }}% RevShare
{{ applyingId===p.id ? '⏳ Applying…' : t('btn_apply_promote') }}
⏳ Pending Approval
✓ Approved
✗ Rejected
{{ t('title_my_links') }}
{{ t('no_links') }}
{{ 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('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) }}
{{ lang==='es'?'Afiliados Activos':'Active Affiliates' }}
{{ reportData.active_affiliates || 0 }}
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) }}
{{ 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') }}
1. Click Generate QR Code and scan with Google Authenticator, Authy, or any TOTP app.
2. Enter the 6-digit code shown in your app to verify and activate.
3. Next time you log in, after entering your password you'll be asked for a 6-digit code.
4. Codes expire every 30 seconds .
⚠ Save your secret key — if you lose access to your authenticator app and don't have the secret, you'll need database access to recover.
🎨 {{ 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) }}
Suspend & Flag
No duplicate click offenders detected
Currently Suspended Affiliates
Name Email Suspended Since Action
{{ a.name }} {{ a.email }}
{{ 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') }}
{{ 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 }}
{{ t('btn_delete') }}
{{ t('no_promos') }}
🖼️ {{ lang==='es'?'Mis Medios':'My Media' }} {{ t('btn_add_media') }}
{{ m.name }}
{{ m.size || '—' }} · {{ m.type }}
{{ lang==='es'?'Ver':'View' }}
{{ t('btn_delete') }}
{{ t('no_owner_media') }}
🎟️ {{ 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.name }}
{{ m.product_name || (lang==='es'?'Todos los Productos':'All Products') }} · {{ m.type }}
{{ t('btn_download') }}
{{ 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) }}
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
🏷️ Brands + Add Brand
Brand Owner Website Products Status Action
{{ b.owner_name || '—' }}
{{ b.website }} —
{{ b.product_count || 0 }} products
{{ b.status }}
Edit
Del
No brands yet. Add a brand to categorize your products.
🏷️ My Brands + Add Brand
Brand Website Products Color
{{ b.website }} —
{{ b.product_count || 0 }} products
{{ b.primary_color }}
No brands yet.
💱 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) }}
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 }}
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 }}
Delete
No qualification rules — all affiliates can request payout