// ========================================== // 8. ACTIVE CAMPAIGNS TAB & DISPATCH CONTROLLER // ========================================== if (!function_exists('art_manager_render_campaigns_tab')) { function art_manager_render_campaigns_tab() { global $wpdb; $taxonomy = art_get_admin_master_taxonomies(); if (isset($_POST['art_delete_campaign']) && isset($_POST['camp_id_delete'])) { $del_id = intval($_POST['camp_id_delete']); $wpdb->delete($wpdb->prefix . 'art_pitches', array('campaign_id' => $del_id)); $wpdb->delete($wpdb->prefix . 'art_campaigns', array('id' => $del_id)); echo '

πŸ—‘οΈ Campaign permanently purged from systems.

'; } if (isset($_POST['art_complete_campaign']) && isset($_POST['camp_id_complete'])) { $wpdb->update($wpdb->prefix . 'art_campaigns', array('status' => 'completed'), array('id' => intval($_POST['camp_id_complete']))); echo '

βœ“ Campaign marked as completed and moved to history logs.

'; } // DIRECT BOUNTY CONVERT / BLAST FROM ACTIVE CAMPAIGN TAB if (isset($_POST['art_quick_convert_bounty']) && isset($_POST['camp_id_bounty'])) { $b_id = intval($_POST['camp_id_bounty']); $b_budget = floatval($_POST['bounty_budget']); $b_notes = sanitize_textarea_field($_POST['bounty_notes']); $wpdb->update($wpdb->prefix . 'art_campaigns', array( 'on_bounty_board' => 1, 'bounty_budget' => $b_budget, 'bounty_notes' => $b_notes ), array('id' => $b_id)); $active_curators = $wpdb->get_results("SELECT MIN(id) as id, email, MAX(name) as name FROM {$wpdb->prefix}art_curators WHERE account_status = 'active' GROUP BY email"); $already_pitched_emails = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT c.email FROM {$wpdb->prefix}art_pitches p JOIN {$wpdb->prefix}art_curators c ON p.curator_id = c.id WHERE p.campaign_id = %d", $b_id)); $dispatch_count = 0; $dash_url = home_url('/curator-dashboard/'); foreach ($active_curators as $curator) { if (in_array($curator->email, $already_pitched_emails)) continue; $wpdb->insert($wpdb->prefix . 'art_pitches', array( 'campaign_id' => $b_id, 'curator_id' => $curator->id, 'status' => 'pending', 'payout_status' => 'unpaid', 'curator_token' => wp_generate_password(32, false), 'sent_at' => current_time('mysql') )); $subject = "🚨 OPEN BOUNTY: Claim Your Spot!"; $body = "
"; $body .= "

Hey " . esc_html($curator->name) . ",

"; $body .= "

An exciting Open Bounty has just been deployed to the network!

"; $body .= "

Please Note: This is a network-wide open bounty, not a direct targeted pitch. The song may not perfectly fit your playlist's specific vibe.

"; $body .= "
    "; $body .= "
  • First Come, First Serve: Limited budget pool. Spots close automatically once the budget depletes.
  • "; $body .= "
  • Select Your Playlist: If you accept the track, you can choose which of your approved playlists you placed it on directly inside the dashboard.
  • "; $body .= "
  • Payment Terms: You ONLY get paid if you ACCEPT and add the song. You do not get paid for declining.
  • "; $body .= "
  • No Penalties: Zero negative impact on your Trust Score (XP) if you skip or decline it.
  • "; $body .= "
"; if (!empty($b_notes)) { $body .= "
Admin Notes:
" . nl2br(esc_html($b_notes)) . "
"; } $body .= "

View Bounty & Claim βž”

"; $body .= "
"; art_manager_send_email($curator->email, $subject, $body); $dispatch_count++; } if ($dispatch_count > 0) { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}art_campaigns SET target_curators = target_curators + %d WHERE id = %d", $dispatch_count, $b_id)); echo '

⚑ Campaign successfully converted to Open Bounty AND blasted to ' . $dispatch_count . ' active curators!

'; } else { echo '

⚑ Campaign updated to Open Bounty. (All active curators were already pitched).

'; } } // RESEND BOUNTY EMAILS HANDLER (GROUPED BY EMAIL SO 1 PER CURATOR) if (isset($_POST['art_resend_bounty_emails']) && isset($_POST['camp_id_resend_bounty'])) { $resend_id = intval($_POST['camp_id_resend_bounty']); $camp = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE id = %d", $resend_id)); if ($camp) { $pending_pitches = $wpdb->get_results($wpdb->prepare(" SELECT MAX(p.id) as pitch_id, cur.name, cur.email FROM {$wpdb->prefix}art_pitches p JOIN {$wpdb->prefix}art_curators cur ON p.curator_id = cur.id WHERE p.campaign_id = %d AND p.status = 'pending' GROUP BY cur.email ", $resend_id)); $resend_count = 0; $dash_url = home_url('/curator-dashboard/'); foreach ($pending_pitches as $pp) { $subject = "🚨 OPEN BOUNTY REMINDER: Claim Your Spot!"; $body = "
"; $body .= "

Hey " . esc_html($pp->name) . ",

"; $body .= "

This is a quick reminder that an Open Bounty track is active in your queue!

"; $body .= "

Please Note: This is a network-wide open bounty, not a direct targeted pitch. The song may not perfectly fit your playlist's specific vibe.

"; $body .= "
    "; $body .= "
  • First Come, First Serve: Limited budget pool remaining. Spots close automatically once the budget depletes.
  • "; $body .= "
  • Select Your Playlist: If you accept the track, you can choose which of your approved playlists you placed it on directly inside the dashboard.
  • "; $body .= "
  • Payment Terms: You ONLY get paid if you ACCEPT and add the song. You do not get paid for declining.
  • "; $body .= "
  • No Penalties: Zero negative impact on your Trust Score (XP) if you skip or decline it.
  • "; $body .= "
"; if (!empty($camp->bounty_notes)) { $body .= "
Admin Notes:
" . nl2br(esc_html($camp->bounty_notes)) . "
"; } $body .= "

View Bounty & Claim βž”

"; $body .= "
"; art_manager_send_email($pp->email, $subject, $body); $resend_count++; } echo '

βœ“ Successfully re-dispatched Open Bounty emails to ' . $resend_count . ' pending curators!

'; } } if (isset($_POST['art_dispatch_campaign_v2'])) { $woo_order_id = sanitize_text_field($_POST['woo_order_id']); $artist_email = sanitize_email($_POST['artist_email']); $song_link = esc_url_raw($_POST['song_link']); $genre = sanitize_text_field($_POST['genre']); $on_bounty = isset($_POST['on_bounty_board']) ? 1 : 0; $is_fasttrack = isset($_POST['is_fasttrack']) ? 1 : 0; $bounty_budget = isset($_POST['bounty_budget']) ? floatval($_POST['bounty_budget']) : 0.00; $bounty_notes = isset($_POST['bounty_notes']) ? sanitize_textarea_field($_POST['bounty_notes']) : ''; $order_num = !empty($woo_order_id) ? $woo_order_id : 'AR-' . strtoupper(wp_generate_password(6, false)); $magic_token = wp_generate_password(32, false); $wpdb->insert($wpdb->prefix . 'art_campaigns', array( 'artist_email' => $artist_email, 'song_link' => $song_link, 'genre' => $genre, 'target_curators' => 0, 'order_number' => $order_num, 'magic_token' => $magic_token, 'status' => 'active', 'on_bounty_board' => $on_bounty, 'is_fasttrack' => $is_fasttrack, 'bounty_budget' => $bounty_budget, 'bounty_notes' => $bounty_notes )); $camp_id = $wpdb->insert_id; $curators_to_pitch = array(); if ($on_bounty) { // If Open Bounty, group by email to send exactly ONE email and ONE pitch $curators_to_pitch = $wpdb->get_results("SELECT MIN(id) as id, email, MAX(name) as name FROM {$wpdb->prefix}art_curators WHERE account_status = 'active' GROUP BY email"); } else { $selected_curators = isset($_POST['selected_curators']) ? $_POST['selected_curators'] : array(); if (!empty($selected_curators)) { $placeholders = implode(',', array_fill(0, count($selected_curators), '%d')); $curators_to_pitch = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_curators WHERE id IN ($placeholders) AND account_status = 'active'", $selected_curators)); } } $dispatch_count = 0; $dash_url = home_url('/curator-dashboard/'); foreach ($curators_to_pitch as $curator) { $wpdb->insert($wpdb->prefix . 'art_pitches', array( 'campaign_id' => $camp_id, 'curator_id' => $curator->id, 'status' => 'pending', 'payout_status' => 'unpaid', 'curator_token' => wp_generate_password(32, false), 'sent_at' => current_time('mysql') )); if ($on_bounty) { $subject = "🚨 OPEN BOUNTY: Claim Your Spot!"; $body = "
"; $body .= "

Hey " . esc_html($curator->name) . ",

"; $body .= "

An exciting Open Bounty has just been deployed to the network!

"; $body .= "

Please Note: This is a network-wide open bounty, not a direct targeted pitch. The song may not perfectly fit your playlist's specific vibe.

"; $body .= "
    "; $body .= "
  • First Come, First Serve: Limited budget pool. Spots close automatically once the budget depletes.
  • "; $body .= "
  • Select Your Playlist: If you accept the track, you can choose which of your approved playlists you placed it on directly inside the dashboard.
  • "; $body .= "
  • Payment Terms: You ONLY get paid if you ACCEPT and add the song. You do not get paid for declining.
  • "; $body .= "
  • No Penalties: Zero negative impact on your Trust Score (XP) if you skip or decline it.
  • "; $body .= "
"; if (!empty($bounty_notes)) { $body .= "
Admin Notes:
" . nl2br(esc_html($bounty_notes)) . "
"; } $body .= "

View Bounty & Claim βž”

"; $body .= "
"; } else { $subject = "🎡 A new track is waiting for your review!"; $body = "
"; $body .= "

Hey " . esc_html($curator->name) . ",

"; $body .= "

Great news! We just assigned a brand new track directly to your dashboard for you to check out.

"; $body .= "

Whenever you have a moment, drop in, take a listen, and let the artist know what you think.

"; $body .= "

Review Your Track Now βž”

"; $body .= "
"; } art_manager_send_email($curator->email, $subject, $body); $dispatch_count++; } $wpdb->update("{$wpdb->prefix}art_campaigns", array('target_curators' => $dispatch_count), array('id' => $camp_id)); echo '

βœ“ Distribution Campaign deployed successfully (' . $dispatch_count . ' notification alerts sent).

'; } $active_campaigns = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE status = 'active' ORDER BY id DESC"); $completed_campaigns = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE status = 'completed' ORDER BY id DESC LIMIT 50"); echo '

πŸš€ Deploy New Tracking Campaign




'; foreach ($taxonomy['genres'] as $category => $items) { echo '

' . esc_html($category) . '

'; echo '
'; foreach ($items as $g_item) { echo ''; } echo '
'; } echo '
'; foreach ($taxonomy['moods'] as $category => $items) { echo '

' . esc_html($category) . '

'; echo '
'; foreach ($items as $m_item) { echo ''; } echo '
'; } echo '

Overrides target matrix. Automatically emails every active curator in the network once.

Flags campaign for premium processing.

'; echo '

🟒 Active Running System Campaigns

'; echo ''; if(empty($active_campaigns)) { echo ''; } else { foreach($active_campaigns as $camp) { // Check Unread Admin Reviews $unread = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}art_pitches WHERE campaign_id = %d AND status IN ('accepted', 'declined') AND admin_seen = 0", $camp->id)); $unread_badge = $unread > 0 ? ''.$unread.' New Update' : ''; $bounty_info = ""; if (intval($camp->on_bounty_board) === 1) { $spent = floatval($wpdb->get_var($wpdb->prepare("SELECT SUM(earned_fee) FROM {$wpdb->prefix}art_pitches WHERE campaign_id = %d AND status = 'accepted'", $camp->id))); $orig_budget = floatval($camp->bounty_budget); $rem_budget = max(0, $orig_budget - $spent); $bounty_info = '
⚑ BOUNTY: Spent $' . number_format($spent,2) . ' / $' . number_format($orig_budget,2) . '
πŸ’° Remaining Pool: $' . number_format($rem_budget,2) . ''; } echo ''; } } echo '
Order RefSong Stream DetailsTarget MappingsStatus & Bounty BudgetActions
No track distribution campaigns are running currently.
'.esc_html($camp->order_number).' '.$unread_badge.' Listen Link β†—
Genre: '.esc_html($camp->genre).'
Target Count: '.intval($camp->target_curators).' '.strtoupper($camp->status).''.$bounty_info.' View Breakdown '; if (intval($camp->on_bounty_board) === 1) { echo '
'; } echo '

⚑ Deploy Open Bounty for Order '.$camp->order_number.'

'; echo '

πŸ“ Completed Campaigns History

'; echo ''; if(empty($completed_campaigns)) { echo ''; } else { foreach($completed_campaigns as $camp) { echo ''; } } echo '
Order RefSong Stream DetailsTarget MappingsStatusActions
No completed campaigns stored.
'.esc_html($camp->order_number).' Listen Link β†—
Genre: '.esc_html($camp->genre).'
Target Count: '.intval($camp->target_curators).' '.strtoupper($camp->status).' View Breakdown
'; echo ''; } } // ========================================== // 9. INDIVIDUAL CAMPAIGN AUDIT BREAKDOWN VIEW & EXTENSION // ========================================== if (!function_exists('art_manager_render_campaign_details')) { function art_manager_render_campaign_details($campaign_id) { global $wpdb; $c = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE id = %d", $campaign_id)); if (!$c) { echo '

Campaign record missing.

'; return; } $taxonomy = art_get_admin_master_taxonomies(); // Clear Unread Admin Flag now that we are looking at it $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}art_pitches SET admin_seen = 1 WHERE campaign_id = %d AND status IN ('accepted', 'declined') AND admin_seen = 0", $campaign_id)); if (isset($_POST['art_add_curators_existing'])) { $selected_curators = isset($_POST['selected_curators']) ? $_POST['selected_curators'] : array(); $dispatch_count = 0; $dash_url = home_url('/curator-dashboard/'); // Get already pitched curator IDs for this specific campaign to prevent duplicates $already_pitched = $wpdb->get_col($wpdb->prepare("SELECT curator_id FROM {$wpdb->prefix}art_pitches WHERE campaign_id = %d", $campaign_id)); foreach ($selected_curators as $cid) { $curator_id_int = intval($cid); // SKIP IF CURATOR WAS ALREADY CONTACTED FOR THIS CAMPAIGN if (in_array($curator_id_int, $already_pitched)) { continue; } $curator = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_curators WHERE id = %d", $curator_id_int)); if (!$curator) continue; $wpdb->insert($wpdb->prefix . 'art_pitches', array( 'campaign_id' => $campaign_id, 'curator_id' => $curator->id, 'status' => 'pending', 'payout_status' => 'unpaid', 'curator_token' => wp_generate_password(32, false), 'sent_at' => current_time('mysql') )); if (intval($c->on_bounty_board) === 1 && floatval($c->bounty_budget) > 0) { $subject = "🚨 OPEN BOUNTY: Claim Your Spot!"; $body = "
"; $body .= "

Hey " . esc_html($curator->name) . ",

"; $body .= "

An exciting Open Bounty has just been deployed to the network!

"; $body .= "

Please Note: This is a network-wide open bounty, not a direct targeted pitch. The song may not perfectly fit your playlist's specific vibe.

"; $body .= "
    "; $body .= "
  • First Come, First Serve: Limited budget pool. Spots close automatically once the budget depletes.
  • "; $body .= "
  • Select Your Playlist: If you accept the track, you can choose which of your approved playlists you placed it on directly inside the dashboard.
  • "; $body .= "
  • Payment Terms: You ONLY get paid if you ACCEPT and add the song. You do not get paid for declining.
  • "; $body .= "
  • No Penalties: Zero negative impact on your Trust Score (XP) if you skip or decline it.
  • "; $body .= "
"; if (!empty($c->bounty_notes)) { $body .= "
Admin Notes:
" . nl2br(esc_html($c->bounty_notes)) . "
"; } $body .= "

View Bounty & Claim βž”

"; $body .= "
"; } else { $subject = "🎡 A new track is waiting for your review!"; $body = "
"; $body .= "

Hey " . esc_html($curator->name) . ",

"; $body .= "

Great news! We just assigned a brand new track directly to your dashboard for you to check out.

"; $body .= "

Whenever you have a moment, drop in, take a listen, and let the artist know what you think.

"; $body .= "

Review Your Track Now βž”

"; $body .= "
"; } art_manager_send_email($curator->email, $subject, $body); $dispatch_count++; } if ($dispatch_count > 0) { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}art_campaigns SET target_curators = target_curators + %d WHERE id = %d", $dispatch_count, $campaign_id)); $c = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE id = %d", $campaign_id)); echo '

βœ“ Added ' . $dispatch_count . ' new curators to this running campaign successfully.

'; } else { echo '

Notice: All selected curators were already previously contacted for this campaign. No duplicate emails were sent.

'; } } if (isset($_POST['art_update_bounty_budget'])) { $b_budget = floatval($_POST['bounty_budget']); $b_notes = sanitize_textarea_field($_POST['bounty_notes']); $b_active = ($b_budget > 0) ? 1 : 0; $wpdb->update($wpdb->prefix . 'art_campaigns', array('bounty_budget' => $b_budget, 'bounty_notes' => $b_notes, 'on_bounty_board' => $b_active), array('id' => $campaign_id)); $c = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE id = %d", $campaign_id)); echo '

βœ“ Bounty logic and budget parameters updated successfully.

'; } // UPDATE BOUNTY LOGIC AND BLAST TO ALL if (isset($_POST['art_blast_bounty_all_active'])) { $b_budget = floatval($_POST['bounty_budget']); $b_notes = sanitize_textarea_field($_POST['bounty_notes']); $wpdb->update($wpdb->prefix . 'art_campaigns', array('bounty_budget' => $b_budget, 'bounty_notes' => $b_notes, 'on_bounty_board' => 1), array('id' => $campaign_id)); $active_curators = $wpdb->get_results("SELECT MIN(id) as id, email, MAX(name) as name FROM {$wpdb->prefix}art_curators WHERE account_status = 'active' GROUP BY email"); $already_pitched_emails = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT c.email FROM {$wpdb->prefix}art_pitches p JOIN {$wpdb->prefix}art_curators c ON p.curator_id = c.id WHERE p.campaign_id = %d", $campaign_id)); $dispatch_count = 0; $dash_url = home_url('/curator-dashboard/'); foreach ($active_curators as $curator) { if (in_array($curator->email, $already_pitched_emails)) continue; $wpdb->insert($wpdb->prefix . 'art_pitches', array( 'campaign_id' => $campaign_id, 'curator_id' => $curator->id, 'status' => 'pending', 'payout_status' => 'unpaid', 'curator_token' => wp_generate_password(32, false), 'sent_at' => current_time('mysql') )); $subject = "🚨 OPEN BOUNTY: Claim Your Spot!"; $body = "
"; $body .= "

Hey " . esc_html($curator->name) . ",

"; $body .= "

An exciting Open Bounty has just been deployed to the network!

"; $body .= "

Please Note: This is a network-wide open bounty, not a direct targeted pitch. The song may not perfectly fit your playlist's specific vibe.

"; $body .= "
    "; $body .= "
  • First Come, First Serve: Limited budget pool. Spots close automatically once the budget depletes.
  • "; $body .= "
  • Select Your Playlist: If you accept the track, you can choose which of your approved playlists you placed it on directly inside the dashboard.
  • "; $body .= "
  • Payment Terms: You ONLY get paid if you ACCEPT and add the song. You do not get paid for declining.
  • "; $body .= "
  • No Penalties: Zero negative impact on your Trust Score (XP) if you skip or decline it.
  • "; $body .= "
"; if (!empty($b_notes)) { $body .= "
Admin Notes:
" . nl2br(esc_html($b_notes)) . "
"; } $body .= "

View Bounty & Claim βž”

"; $body .= "
"; art_manager_send_email($curator->email, $subject, $body); $dispatch_count++; } if ($dispatch_count > 0) { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}art_campaigns SET target_curators = target_curators + %d WHERE id = %d", $dispatch_count, $campaign_id)); $c = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE id = %d", $campaign_id)); echo '

βœ“ Open Bounty successfully blasted to ' . $dispatch_count . ' active curators!

'; } else { echo '

Notice: All active curators have already been contacted for this campaign.

'; } } // RESEND BOUNTY EMAILS HANDLER (GROUPED BY EMAIL SO 1 PER CURATOR) if (isset($_POST['art_resend_bounty_emails']) && isset($_POST['camp_id_resend_bounty'])) { $resend_id = intval($_POST['camp_id_resend_bounty']); $camp = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}art_campaigns WHERE id = %d", $resend_id)); if ($camp) { $pending_pitches = $wpdb->get_results($wpdb->prepare(" SELECT MAX(p.id) as pitch_id, cur.name, cur.email FROM {$wpdb->prefix}art_pitches p JOIN {$wpdb->prefix}art_curators cur ON p.curator_id = cur.id WHERE p.campaign_id = %d AND p.status = 'pending' GROUP BY cur.email ", $resend_id)); $resend_count = 0; $dash_url = home_url('/curator-dashboard/'); foreach ($pending_pitches as $pp) { $subject = "🚨 OPEN BOUNTY REMINDER: Claim Your Spot!"; $body = "
"; $body .= "

Hey " . esc_html($pp->name) . ",

"; $body .= "

This is a quick reminder that an Open Bounty track is active in your queue!

"; $body .= "

Please Note: This is a network-wide open bounty, not a direct targeted pitch. The song may not perfectly fit your playlist's specific vibe.

"; $body .= "
    "; $body .= "
  • First Come, First Serve: Limited budget pool remaining. Spots close automatically once the budget depletes.
  • "; $body .= "
  • Select Your Playlist: If you accept the track, you can choose which of your approved playlists you placed it on directly inside the dashboard.
  • "; $body .= "
  • Payment Terms: You ONLY get paid if you ACCEPT and add the song. You do not get paid for declining.
  • "; $body .= "
  • No Penalties: Zero negative impact on your Trust Score (XP) if you skip or decline it.
  • "; $body .= "
"; if (!empty($camp->bounty_notes)) { $body .= "
Admin Notes:
" . nl2br(esc_html($camp->bounty_notes)) . "
"; } $body .= "

View Bounty & Claim βž”

"; $body .= "
"; art_manager_send_email($pp->email, $subject, $body); $resend_count++; } echo '

βœ“ Successfully re-dispatched Open Bounty emails to ' . $resend_count . ' pending curators!

'; } } // LEFT JOIN GUARANTEES 100% OF PITCHED CURATORS SHOW UP IN THE MATRIX $pitches = $wpdb->get_results($wpdb->prepare(" SELECT p.*, cur.email, cur.playlist_name, cur.playlist_link, cur.name as curator_name FROM {$wpdb->prefix}art_pitches p LEFT JOIN {$wpdb->prefix}art_curators cur ON p.curator_id = cur.id WHERE p.campaign_id = %d ORDER BY FIELD(p.status, 'accepted', 'declined', 'pending', 'sent'), p.id DESC ", $campaign_id)); $accepted_count = 0; foreach ($pitches as $check_p) { if ($check_p->status === 'accepted') $accepted_count++; } echo '
β¬… Back to Campaigns Tab
'; echo '
'; echo '

Detailed Distribution Matrix for Campaign: ' . esc_html($c->order_number) . '

'; echo '
'; echo '

Track Link: View on Spotify β†—

Current Active Placements: ' . $accepted_count . ' Accepted Placements / ' . count($pitches) . ' Total Curators Pitched.

'; echo ''; if(empty($pitches)) { echo ''; } else { foreach($pitches as $p) { $status_style = ($p->status === 'accepted') ? 'color:#10b981; font-weight:bold;' : (($p->status === 'declined') ? 'color:#ef4444;' : 'color:#ff9900;'); $pl_link = esc_url($p->playlist_link); $pl_name = !empty($p->playlist_name) ? esc_html($p->playlist_name) : 'Spotify Playlist'; $curator_display_name = !empty($p->curator_name) ? esc_html($p->curator_name) : 'Network Curator'; $verify_ui = ""; if ($p->status === 'accepted') { $verify_ui .= '
'; if (!empty($p->placed_at) && $p->placed_at !== '0000-00-00 00:00:00') { $days_active = floor((time() - strtotime($p->placed_at)) / 86400); if ($days_active >= 28) { $verify_ui .= '
βœ“ 4 Weeks Completed
'; } else { $verify_ui .= '
⏳ Active: '.$days_active.' / 28 Days
'; } } else { $verify_ui .= '
Placement Timestamp Not Logged
'; } } $curator_search_link = '?page=artistrack-engine&tab=curators&s=' . urlencode($p->email); $sent_date = !empty($p->sent_at) && $p->sent_at !== '0000-00-00 00:00:00' ? date('M j, Y g:i a', strtotime($p->sent_at)) : 'N/A'; $report_data_attr = ""; if (in_array($p->status, array('accepted', 'declined'))) { $esc_fb = esc_attr(str_replace(array("\r", "\n"), ' ', $p->feedback)); $report_data_attr = " data-curator=\"".$curator_display_name."\" data-playlist=\"".$pl_name."\" data-playlist-link=\"".$pl_link."\" data-status=\"".$p->status."\" data-feedback=\"".$esc_fb."\" "; } echo ''; } } echo '
Curator / PlaylistDate AssignedReview StandingEarned AllocationLogged Evaluation Feedback Block
No distribution target records logged.
'.$pl_name.' β†—
Curator: '.$curator_display_name.' β†— '.$verify_ui.'
'.$sent_date.' '.strtoupper($p->status).' $'.number_format($p->earned_fee, 2).' '; if ($p->status === 'declined') { echo '
'; } elseif ($p->status === 'accepted') { echo ''; } echo (!empty($p->feedback) ? esc_html($p->feedback) : 'Awaiting Response...').'
'; // --- HTML REPORT GENERATOR --- echo '

πŸ“ Generate HTML Feedback Report

This tool automatically compiles all Accepted reviews into beautiful email HTML. If you wish to include specific declined reviews, tick their checkbox in the table above.

'; // Add More Curators inside configuration details panel echo '

πŸ‘₯ Expand Target Metrics (Append Curators / Enable Bounty)

Open Bounty Configuration

To run this campaign as an Open Bounty, set a budget. Curators will be notified it is first-come-first-serve. When the budget pool drains, pending placements will automatically delete so you don\'t overspend.

'; if (intval($c->on_bounty_board) === 1) { echo '
'; } echo '
'; foreach ($taxonomy['genres'] as $category => $items) { echo '

' . esc_html($category) . '

'; echo '
'; foreach ($items as $g_item) { echo ''; } echo '
'; } echo '
'; foreach ($taxonomy['moods'] as $category => $items) { echo '

' . esc_html($category) . '

'; echo '
'; foreach ($items as $m_item) { echo ''; } echo '
'; } echo '
'; echo ''; } } Pop Music Archives - Page 57 of 192 - ArtistRack | #1 Music Promotion & Playlisting Service for Artists
  • Home
  • Artist
  • Music
  • Video
  • Sponsored
  • Interviews
  • Reviews
  • Submit
Search
Logo
LogoBlackversion PRO
  • Home
  • Artist
  • Music
  • Video
  • Sponsored
  • Interviews
  • Reviews
  • Submit
LogoBlackversion PRO
Facebook
Instagram
X
Facebook
Instagram
X
Facebook
Instagram
TikTok
X
Youtube
Copyright Β© 2012 - 2026 ArtistRack.
  • Blog
  • About
  • Contact
  • ArtistRack Reviews
  • Terms and conditions
  • Cookie & Privacy Policy
Copyright Β© 2012 - 2026 ArtistRack.
Facebook
Instagram
X
Facebook
Instagram
TikTok
X
Youtube
Copyright Β© 2012 - 2026 ArtistRack.
  • Blog
  • About
  • Contact
  • ArtistRack Reviews
  • Terms and conditions
  • Cookie & Privacy Policy
Copyright Β© 2012 - 2026 ArtistRack.
ArtistRack Logo πŸ”₯ Limited Time: Get 55% OFF All Plans - Ends in: 12:00:00
Need Help?
Scan the code
WhatsApp
Need Help? Let’s Chat! 🎢
Open chat