{"id":368884,"date":"2026-09-15T16:22:48","date_gmt":"2026-09-15T16:22:48","guid":{"rendered":"https:\/\/fr.wordpress.org\/plugins\/sprint-newsletter\/"},"modified":"2026-09-15T16:22:28","modified_gmt":"2026-09-15T16:22:28","slug":"sprint-newsletter","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/sprint-newsletter\/","author":23539978,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.6","requires_php":"8.0","requires_plugins":null,"header_name":"Sprint Newsletter","header_author":"Sprint Plugins","header_description":"A simple self-hosted newsletter solution for WordPress: subscribers, lists, campaigns, automations, and delivery through wp_mail().","assets_banners_color":"738ba4","last_updated":"2026-09-15 16:22:28","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/sprintplugins.fr\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"sprintplugins","date":"2026-09-15 16:22:28","revision":3697358}},"upgrade_notice":{"1.0.0":"<p>First public release of Sprint Newsletter.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3697407,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3697407,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3697407,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-fr_FR.png":{"filename":"banner-1544x500-fr_FR.png","revision":3697407,"resolution":"1544x500","location":"assets","locale":"fr_FR","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3697407,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-fr_FR.png":{"filename":"banner-772x250-fr_FR.png","revision":3697407,"resolution":"772x250","location":"assets","locale":"fr_FR","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3697407,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3697423,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=sprint-newsletter&section=dashboard\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"sprint-newsletter\"},\"options\":{\"activate\":true}},{\"step\":\"writeFile\",\"path\":\"\\\/wordpress\\\/wp-content\\\/mu-plugins\\\/sprint-newsletter-demo-seed.php\",\"data\":\"<?php\\n\\\/*\\n * Temporary seed loaded on the first wp-admin request.\\n * WordPress.org appends setSiteLanguage to Live Preview blueprints, so this\\n * code runs after the requested locale is active and can seed FR or EN data.\\n *\\\/\\nadd_action('admin_init', function () {\\n    if (!current_user_can('manage_options')) { return; }\\n    if (!class_exists('SprintNewsletter\\\\\\\\Audience\\\\\\\\Repository')) { return; }\\n    if (get_option('sprint_newsletter_demo_seeded_v3')) { @unlink(__FILE__); return; }\\n\\n    $locale = function_exists('determine_locale') ? determine_locale() : get_locale();\\n    $fr = (0 === strpos(strtolower((string) $locale), 'fr'));\\n\\n    $d = $fr ? array(\\n        'site_name' => 'D\\u00e9mo Sprint Newsletter',\\n        'site_desc' => 'Site de d\\u00e9monstration bilingue de Sprint Newsletter',\\n        'company' => 'Club Sportif Horizon',\\n        'motto' => 'Le sport pour tous',\\n        'address' => \\\"15 avenue des Rives\\\\n75000 Ville D\\u00e9mo\\\",\\n        'legal' => 'Organisation fictive utilis\\u00e9e uniquement pour la d\\u00e9monstration.',\\n        'lists' => array(\\n            array('Actualit\\u00e9s du club', 'Informations g\\u00e9n\\u00e9rales pour les adh\\u00e9rents et les familles.', 'public'),\\n            array('\\u00c9v\\u00e9nements et inscriptions', 'Rappels, inscriptions ouvertes et informations pratiques.', 'private'),\\n            array('B\\u00e9n\\u00e9voles', 'Coordination des b\\u00e9n\\u00e9voles et informations de mission.', 'private'),\\n        ),\\n        'subs' => array(\\n            array('amelie.dupont@example.org','Am\\u00e9lie','Dupont','active','manual',array(0,1)),\\n            array('luc.martin@example.org','Luc','Martin','active','manual',array(0)),\\n            array('clara.bernard@example.org','Clara','Bernard','active','import',array(0,2)),\\n            array('theo.robert@example.org','Th\\u00e9o','Robert','active','form',array(1)),\\n            array('lea.petit@example.org','L\\u00e9a','Petit','active','manual',array(2)),\\n            array('hugo.moreau@example.org','Hugo','Moreau','active','import',array(0,1,2)),\\n            array('emma.fournier@example.org','Emma','Fournier','active','form',array(0)),\\n            array('nina.roux@example.org','Nina','Roux','active','manual',array(1)),\\n            array('paul.girard@example.org','Paul','Girard','pending','form',array(0)),\\n            array('jade.faure@example.org','Jade','Faure','unsubscribed','import',array(0)),\\n        ),\\n        'form_news_name' => 'Inscription newsletter',\\n        'form_news_submit' => 'S\\\\'inscrire',\\n        'form_news_success' => 'Merci ! Confirmez votre inscription depuis votre bo\\u00eete e-mail.',\\n        'form_news_consent' => 'J\\\\'accepte de recevoir la newsletter du club.',\\n        'form_news_subject' => 'Confirmez votre inscription',\\n        'form_news_html' => '<p>Merci de confirmer votre inscription aux newsletters du Club Sportif Horizon.<\\\/p>',\\n        'form_vol_name' => 'Informations b\\u00e9n\\u00e9voles',\\n        'form_vol_submit' => 'Rejoindre',\\n        'form_vol_success' => 'Vous avez \\u00e9t\\u00e9 ajout\\u00e9 \\u00e0 la liste d\\\\'information des b\\u00e9n\\u00e9voles.',\\n        'form_vol_consent' => 'J\\\\'accepte de recevoir les informations b\\u00e9n\\u00e9voles par e-mail.',\\n        'posts' => array(\\n            array('Semaine de reprise', 'Les entra\\u00eenements reprennent lundi et les nouveaux adh\\u00e9rents sont les bienvenus toute la semaine.'),\\n            array('Journ\\u00e9e b\\u00e9n\\u00e9voles samedi', 'Aidez-nous \\u00e0 pr\\u00e9parer le gymnase et \\u00e0 accueillir les familles pendant la journ\\u00e9e portes ouvertes.'),\\n            array('Inscriptions d\\\\'automne ouvertes', 'Les inscriptions en ligne sont d\\u00e9sormais ouvertes jusqu\\\\'\\u00e0 la fin du mois.'),\\n        ),\\n        'heading' => 'Les nouvelles du club de septembre',\\n        'intro' => '<p>Bonjour {first_name},<\\\/p><p>Voici une newsletter de d\\u00e9monstration avec plusieurs fonctions r\\u00e9elles du plugin : texte, derniers articles dynamiques et bouton d\\\\'appel \\u00e0 l\\\\'action.<\\\/p>',\\n        'latest' => 'Derni\\u00e8res actualit\\u00e9s',\\n        'cta' => 'Voir le planning du club',\\n        'cta_url' => 'https:\\\/\\\/example.org\\\/planning',\\n        'draft_name' => 'Brouillon newsletter mensuelle',\\n        'draft_subject' => 'Les nouvelles de septembre du Club Sportif Horizon',\\n        'draft_preheader' => '\\u00c9v\\u00e9nements, inscriptions et actualit\\u00e9s du club.',\\n        'sent_name' => 'Campagne portes ouvertes',\\n        'sent_subject' => 'Portes ouvertes ce samedi',\\n        'sent_preheader' => 'Venez en famille d\\u00e9couvrir le club.',\\n        'link_url' => 'https:\\\/\\\/example.org\\\/portes-ouvertes',\\n        'template_name' => 'Bienvenue b\\u00e9n\\u00e9voles',\\n        'template_desc' => 'E-mail de bienvenue simple utilis\\u00e9 dans la s\\u00e9quence de d\\u00e9monstration.',\\n        'template_subject' => 'Bienvenue dans l\\\\'\\u00e9quipe b\\u00e9n\\u00e9vole',\\n        'template_preheader' => 'Informations pratiques pour vos prochaines missions b\\u00e9n\\u00e9voles.',\\n        'welcome_heading' => 'Bienvenue dans l\\\\'\\u00e9quipe b\\u00e9n\\u00e9vole !',\\n        'welcome_text' => '<p>Merci d\\\\'avoir rejoint notre liste b\\u00e9n\\u00e9voles.<\\\/p><p>Vous recevrez des informations pratiques sur les prochaines missions, les horaires et les rappels utiles.<\\\/p>',\\n        'welcome_cta' => 'Voir les prochaines missions',\\n        'welcome_url' => 'https:\\\/\\\/example.org\\\/benevoles',\\n        'sequence' => 'Accueil b\\u00e9n\\u00e9voles',\\n        'automation' => 'R\\u00e9capitulatif hebdomadaire du club',\\n    ) : array(\\n        'site_name' => 'Sprint Newsletter Demo',\\n        'site_desc' => 'Bilingual demonstration site for Sprint Newsletter',\\n        'company' => 'Northside Sports Club',\\n        'motto' => 'Community sport for everyone',\\n        'address' => \\\"15 Riverside Avenue\\\\n75000 Demo City\\\",\\n        'legal' => 'Fictitious organization used for demonstration purposes only.',\\n        'lists' => array(\\n            array('Club News', 'General updates for members and families.', 'public'),\\n            array('Events & Registration', 'Event reminders, open registrations and practical notices.', 'private'),\\n            array('Volunteers', 'Volunteer coordination and mission updates.', 'private'),\\n        ),\\n        'subs' => array(\\n            array('alex.martin@example.org','Alex','Martin','active','manual',array(0,1)),\\n            array('sam.taylor@example.org','Sam','Taylor','active','manual',array(0)),\\n            array('jamie.lee@example.org','Jamie','Lee','active','import',array(0,2)),\\n            array('casey.brown@example.org','Casey','Brown','active','form',array(1)),\\n            array('morgan.clark@example.org','Morgan','Clark','active','manual',array(2)),\\n            array('riley.green@example.org','Riley','Green','active','import',array(0,1,2)),\\n            array('jordan.white@example.org','Jordan','White','active','form',array(0)),\\n            array('avery.hall@example.org','Avery','Hall','active','manual',array(1)),\\n            array('drew.scott@example.org','Drew','Scott','pending','form',array(0)),\\n            array('charlie.king@example.org','Charlie','King','unsubscribed','import',array(0)),\\n        ),\\n        'form_news_name' => 'Newsletter sign-up',\\n        'form_news_submit' => 'Subscribe',\\n        'form_news_success' => 'Thanks! Please confirm your subscription from your inbox.',\\n        'form_news_consent' => 'I agree to receive the club newsletter.',\\n        'form_news_subject' => 'Confirm your subscription',\\n        'form_news_html' => '<p>Please confirm your subscription to Northside Sports Club newsletters.<\\\/p>',\\n        'form_vol_name' => 'Volunteer updates',\\n        'form_vol_submit' => 'Join',\\n        'form_vol_success' => 'You have been added to the volunteer updates list.',\\n        'form_vol_consent' => 'I agree to receive volunteer updates by email.',\\n        'posts' => array(\\n            array('Season opening week', 'Training sessions resume on Monday and new members are welcome all week long.'),\\n            array('Volunteer day on Saturday', 'Help us prepare the gym and welcome families during the open house.'),\\n            array('Autumn registration is open', 'Online registration is now available until the end of the month.'),\\n        ),\\n        'heading' => 'September club update',\\n        'intro' => '<p>Hello {first_name},<\\\/p><p>Here is a demonstration newsletter using real plugin features: text, dynamic latest posts and a call-to-action button.<\\\/p>',\\n        'latest' => 'Latest news',\\n        'cta' => 'View club schedule',\\n        'cta_url' => 'https:\\\/\\\/example.org\\\/schedule',\\n        'draft_name' => 'Monthly newsletter draft',\\n        'draft_subject' => 'September news from Northside Sports Club',\\n        'draft_preheader' => 'Events, registrations and club updates.',\\n        'sent_name' => 'Open house campaign',\\n        'sent_subject' => 'Open house this Saturday',\\n        'sent_preheader' => 'Bring your family and discover the club.',\\n        'link_url' => 'https:\\\/\\\/example.org\\\/open-house',\\n        'template_name' => 'Volunteer welcome',\\n        'template_desc' => 'Simple welcome email used in the demo sequence.',\\n        'template_subject' => 'Welcome to the volunteer team',\\n        'template_preheader' => 'Practical information for upcoming volunteer missions.',\\n        'welcome_heading' => 'Welcome to the volunteer team!',\\n        'welcome_text' => '<p>Thank you for joining our volunteer list.<\\\/p><p>You will receive practical information about upcoming missions, schedules and reminders.<\\\/p>',\\n        'welcome_cta' => 'See the next missions',\\n        'welcome_url' => 'https:\\\/\\\/example.org\\\/volunteers',\\n        'sequence' => 'Volunteer onboarding',\\n        'automation' => 'Weekly club recap',\\n    );\\n\\n    update_option('blogname', $d['site_name']);\\n    update_option('blogdescription', $d['site_desc']);\\n    update_option('sprint_newsletter_enabled_modules', array('forms','import_export','sequences','tracking'), false);\\n    update_option('sprint_newsletter_identity', array(\\n        'company_name'=>$d['company'], 'motto'=>$d['motto'], 'address'=>$d['address'], 'legal'=>$d['legal'],\\n        'website_url'=>'https:\\\/\\\/example.org', 'logo_url'=>'',\\n        'facebook'=>'https:\\\/\\\/example.org\\\/facebook', 'instagram'=>'https:\\\/\\\/example.org\\\/instagram', 'linkedin'=>'https:\\\/\\\/example.org\\\/linkedin',\\n        'youtube'=>'', 'x'=>'', 'tiktok'=>'', 'telegram'=>'', 'whatsapp'=>'', 'giphy_api_key'=>'',\\n    ), false);\\n    update_option('sprint_newsletter_delivery_settings', array(\\n        'batch_size'=>25, 'min_interval_seconds'=>0, 'limit_per_minute'=>60, 'limit_per_hour'=>500, 'limit_per_day'=>0, 'max_attempts'=>3,\\n    ), false);\\n\\n    $aud = new \\\\SprintNewsletter\\\\Audience\\\\Repository();\\n    $forms = new \\\\SprintNewsletter\\\\Forms\\\\Repository();\\n    $campaigns = new \\\\SprintNewsletter\\\\Campaigns\\\\Repository();\\n    $templates = new \\\\SprintNewsletter\\\\Templates\\\\Repository();\\n    $sequences = new \\\\SprintNewsletter\\\\Sequences\\\\Repository();\\n    $automations = new \\\\SprintNewsletter\\\\Automations\\\\Repository();\\n    $renderer = new \\\\SprintNewsletter\\\\Composer\\\\Renderer();\\n    $templates->ensure_system_templates();\\n\\n    $list_ids = array();\\n    foreach ($d['lists'] as $l) {\\n        $list_ids[] = $aud->save_list(array('name'=>$l[0], 'description'=>$l[1], 'visibility'=>$l[2]));\\n    }\\n\\n    $subscriber_ids = array();\\n    foreach ($d['subs'] as $s) {\\n        $lists = array();\\n        foreach ($s[5] as $index) { if (isset($list_ids[$index])) { $lists[] = $list_ids[$index]; } }\\n        $subscriber_ids[] = $aud->save_subscriber(array(\\n            'email'=>$s[0], 'first_name'=>$s[1], 'last_name'=>$s[2], 'status'=>$s[3],\\n            'language'=>$fr ? 'fr_FR' : 'en_US', 'source'=>$s[4], 'list_ids'=>$lists,\\n        ));\\n    }\\n\\n    $forms->save(array(\\n        'name'=>$d['form_news_name'], 'status'=>'active', 'list_ids'=>array($list_ids[0]),\\n        'fields'=>array('first_name'=>true,'last_name'=>true), 'double_optin'=>true,\\n        'submit_label'=>$d['form_news_submit'], 'success_message'=>$d['form_news_success'], 'consent_text'=>$d['form_news_consent'],\\n        'confirmation_subject'=>$d['form_news_subject'], 'confirmation_html'=>$d['form_news_html'], 'redirect_url'=>'',\\n    ));\\n    $forms->save(array(\\n        'name'=>$d['form_vol_name'], 'status'=>'active', 'list_ids'=>array($list_ids[2]),\\n        'fields'=>array('first_name'=>true,'last_name'=>true), 'double_optin'=>false,\\n        'submit_label'=>$d['form_vol_submit'], 'success_message'=>$d['form_vol_success'], 'consent_text'=>$d['form_vol_consent'],\\n        'confirmation_subject'=>$d['form_vol_name'], 'confirmation_html'=>'<p>'.$d['form_vol_success'].'<\\\/p>', 'redirect_url'=>'',\\n    ));\\n\\n    foreach ($d['posts'] as $p) {\\n        wp_insert_post(array('post_title'=>$p[0], 'post_content'=>$p[1], 'post_excerpt'=>$p[1], 'post_status'=>'publish', 'post_type'=>'post'));\\n    }\\n\\n    $block = static function($renderer, $type, $overrides=array()) {\\n        return array('id'=>$type.'-'.wp_generate_uuid4(), 'type'=>$type, 'data'=>array_merge($renderer->default_block_data($type), $overrides));\\n    };\\n    $doc = array(\\n        'version'=>\\\\SprintNewsletter\\\\Composer\\\\Renderer::DOCUMENT_VERSION,\\n        'settings'=>$renderer->default_document()['settings'],\\n        'blocks'=>array(\\n            $block($renderer,'heading',array('text'=>$d['heading'],'font_size'=>30,'font_weight'=>'bold')),\\n            $block($renderer,'text',array('html'=>$d['intro'])),\\n            $block($renderer,'posts',array('main_title'=>$d['latest'],'max'=>3,'show_image'=>false,'show_author'=>false,'show_date'=>true,'show_read_more_button'=>true)),\\n            $block($renderer,'cta',array('label'=>$d['cta'],'url'=>$d['cta_url'],'align'=>'left')),\\n            $block($renderer,'legal',array('title'=>$d['company'],'address'=>$d['address'],'legal'=>$d['legal'],'show_unsubscribe'=>true)),\\n        ),\\n    );\\n    $json = wp_json_encode($doc, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);\\n    $html = $renderer->render($doc);\\n    $text = $renderer->render_text($doc);\\n\\n    $draft_id = $campaigns->save(array(\\n        'name'=>$d['draft_name'], 'subject'=>$d['draft_subject'], 'preheader'=>$d['draft_preheader'],\\n        'audience_definition'=>array('type'=>'list','list_id'=>$list_ids[0]), 'content_json'=>$json, 'html'=>$html, 'text'=>$text,\\n    ));\\n    $sent_id = $campaigns->save(array(\\n        'name'=>$d['sent_name'], 'subject'=>$d['sent_subject'], 'preheader'=>$d['sent_preheader'],\\n        'audience_definition'=>array('type'=>'list','list_id'=>$list_ids[1]), 'content_json'=>$json, 'html'=>$html, 'text'=>$text,\\n    ));\\n\\n    global $wpdb;\\n    $pfx = $wpdb->prefix . 'sprint_newsletter_';\\n    $started = gmdate('Y-m-d H:i:s', strtotime('-2 days'));\\n    $completed = gmdate('Y-m-d H:i:s', strtotime('-2 days +1 hour'));\\n    $wpdb->update($pfx.'campaigns', array(\\n        'status'=>'completed','recipient_count'=>6,'sent_count'=>6,'failed_count'=>0,'skipped_count'=>0,\\n        'audience_frozen_at'=>$started,'started_at'=>$started,'completed_at'=>$completed,'updated_at'=>$completed,\\n    ), array('id'=>$sent_id));\\n\\n    $wpdb->insert($pfx.'links', array(\\n        'campaign_id'=>$sent_id, 'url'=>$d['link_url'], 'url_hash'=>hash('sha256',$d['link_url']), 'created_at'=>$started,\\n    ));\\n    $link_id = (int) $wpdb->insert_id;\\n\\n    foreach (array_slice(array_values(array_filter($subscriber_ids)),0,6) as $i=>$sid) {\\n        $sub = $aud->subscriber((int)$sid); if (!$sub) { continue; }\\n        $sent_at = gmdate('Y-m-d H:i:s', strtotime('-2 days +'.(10+$i*5).' minutes'));\\n        $opened = $i < 4 ? gmdate('Y-m-d H:i:s', strtotime($sent_at.' +6 hours')) : null;\\n        $clicked = $i < 2 ? gmdate('Y-m-d H:i:s', strtotime($sent_at.' +7 hours')) : null;\\n        $wpdb->insert($pfx.'recipients', array(\\n            'campaign_id'=>$sent_id,'subscriber_id'=>(int)$sub['id'],'email'=>$sub['email'],'status'=>'sent','attempts'=>1,\\n            'first_open_at'=>$opened,'last_open_at'=>$opened,'open_count'=>$opened?1:0,\\n            'first_click_at'=>$clicked,'last_click_at'=>$clicked,'click_count'=>$clicked?1:0,\\n            'sent_at'=>$sent_at,'failed_at'=>null,'last_error'=>'','created_at'=>$sent_at,\\n        ));\\n        $rid=(int)$wpdb->insert_id;\\n        if ($opened) $wpdb->insert($pfx.'events', array('campaign_id'=>$sent_id,'recipient_id'=>$rid,'subscriber_id'=>(int)$sub['id'],'link_id'=>null,'event_type'=>'open','ip_hash'=>'','user_agent_hash'=>'','meta'=>'','occurred_at'=>$opened));\\n        if ($clicked) $wpdb->insert($pfx.'events', array('campaign_id'=>$sent_id,'recipient_id'=>$rid,'subscriber_id'=>(int)$sub['id'],'link_id'=>$link_id,'event_type'=>'click','ip_hash'=>'','user_agent_hash'=>'','meta'=>wp_json_encode(array('url'=>$d['link_url'])),'occurred_at'=>$clicked));\\n    }\\n\\n    $welcome_doc = array(\\n        'version'=>\\\\SprintNewsletter\\\\Composer\\\\Renderer::DOCUMENT_VERSION,\\n        'settings'=>$renderer->default_document()['settings'],\\n        'blocks'=>array(\\n            $block($renderer,'heading',array('text'=>$d['welcome_heading'],'font_size'=>28)),\\n            $block($renderer,'text',array('html'=>$d['welcome_text'])),\\n            $block($renderer,'cta',array('label'=>$d['welcome_cta'],'url'=>$d['welcome_url'])),\\n            $block($renderer,'legal',array('title'=>$d['company'],'legal'=>$d['legal'])),\\n        ),\\n    );\\n    $template_id = $templates->save_template(array(\\n        'name'=>$d['template_name'],'description'=>$d['template_desc'],'subject'=>$d['template_subject'],'preheader'=>$d['template_preheader'],\\n        'content_json'=>wp_json_encode($welcome_doc,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),'category'=>'custom',\\n    ));\\n    $sequence_id = $sequences->save(array('name'=>$d['sequence'],'trigger_list_id'=>$list_ids[2],'status'=>'active','stop_on_leave'=>true));\\n    if ($sequence_id && $template_id) {\\n        $sequences->save_steps($sequence_id,array(\\n            array('template_id'=>$template_id,'delay_minutes'=>0),\\n            array('template_id'=>$template_id,'delay_minutes'=>10080),\\n        ));\\n    }\\n\\n    $automations->save(array(\\n        'name'=>$d['automation'],'automation_type'=>'scheduled','status'=>'active',\\n        'trigger_config'=>array('frequency'=>'weekly','weekday'=>1,'time'=>'08:00','timezone'=>'UTC'),\\n        'action_config'=>array('source_campaign_id'=>$draft_id),\\n        'next_run_at'=>gmdate('Y-m-d H:i:s',strtotime('+30 days')),\\n    ));\\n\\n    update_option('sprint_newsletter_demo_seeded_v3', $fr ? 'fr' : 'en', false);\\n    @unlink(__FILE__);\\n});\\n?>\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1-fr_FR.png":{"filename":"screenshot-1-fr_FR.png","revision":3697407,"resolution":"1","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-1.png":{"filename":"screenshot-1.png","revision":3697407,"resolution":"1","location":"assets","locale":"","width":1920,"height":1080},"screenshot-2-fr_FR.png":{"filename":"screenshot-2-fr_FR.png","revision":3697407,"resolution":"2","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3697407,"resolution":"2","location":"assets","locale":"","width":1920,"height":1080},"screenshot-3-fr_FR.png":{"filename":"screenshot-3-fr_FR.png","revision":3697407,"resolution":"3","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3697407,"resolution":"3","location":"assets","locale":"","width":1920,"height":1080},"screenshot-4-fr_FR.png":{"filename":"screenshot-4-fr_FR.png","revision":3697407,"resolution":"4","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3697407,"resolution":"4","location":"assets","locale":"","width":1920,"height":1080},"screenshot-5-fr_FR.png":{"filename":"screenshot-5-fr_FR.png","revision":3697407,"resolution":"5","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3697407,"resolution":"5","location":"assets","locale":"","width":1920,"height":1080},"screenshot-6-fr_FR.png":{"filename":"screenshot-6-fr_FR.png","revision":3697407,"resolution":"6","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3697407,"resolution":"6","location":"assets","locale":"","width":1920,"height":1080},"screenshot-7-fr_FR.png":{"filename":"screenshot-7-fr_FR.png","revision":3697407,"resolution":"7","location":"assets","locale":"fr_FR","width":1920,"height":1080},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3697407,"resolution":"7","location":"assets","locale":"","width":1920,"height":1080}},"screenshots":[]},"plugin_section":[],"plugin_tags":[141027,569,267,5825,455],"plugin_category":[41,42],"plugin_contributors":[274079],"plugin_business_model":[],"class_list":["post-368884","plugin","type-plugin","status-publish","hentry","plugin_tags-associations","plugin_tags-automation","plugin_tags-email","plugin_tags-mailing-list","plugin_tags-newsletter","plugin_category-communication","plugin_category-contact-forms","plugin_contributors-sprintplugins","plugin_committers-sprintplugins"],"banners":{"banner":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/banner-772x250.png?rev=3697407","banner_2x":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/banner-1544x500.png?rev=3697407","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/icon.svg?rev=3697407","icon":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/icon.svg?rev=3697407","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-1.png?rev=3697407","caption":""},{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-2.png?rev=3697407","caption":""},{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-3.png?rev=3697407","caption":""},{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-4.png?rev=3697407","caption":""},{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-5.png?rev=3697407","caption":""},{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-6.png?rev=3697407","caption":""},{"src":"https:\/\/ps.w.org\/sprint-newsletter\/assets\/screenshot-7.png?rev=3697407","caption":""}],"raw_content":"<!--section=description-->\n<p>Sprint Newsletter is a simple self-hosted newsletter plugin designed for clubs, associations, and WordPress sites that want to manage newsletters without a separate newsletter platform.<\/p>\n\n<p>The plugin focuses on a clear workflow:<\/p>\n\n<ol>\n<li>Build the message.<\/li>\n<li>Choose the recipients.<\/li>\n<li>Send now, schedule once, or automate the campaign.<\/li>\n<\/ol>\n\n<p>Sprint Newsletter does not include its own SMTP client. Every message is handed to the standard WordPress <code>wp_mail()<\/code> function, so you can keep using the mail or SMTP plugin already configured on your site.<\/p>\n\n<h4>Main features<\/h4>\n\n<ul>\n<li>Subscriber and mailing-list management.<\/li>\n<li>CSV and XLSX import\/export.<\/li>\n<li>Optional subscription forms with consent and double opt-in.<\/li>\n<li>Optional synchronization of WordPress users to newsletter lists.<\/li>\n<li>Visual email builder with desktop and mobile previews.<\/li>\n<li>Reusable blocks, nested columns, undo\/redo, and WordPress Media Library support.<\/li>\n<li>Dynamic WordPress post\/content blocks.<\/li>\n<li>A remembered starting point for sending only newly published content.<\/li>\n<li>Test emails from the builder.<\/li>\n<li>Final WordPress preview showing the message after the WordPress mail pipeline, without sending it.<\/li>\n<li>Send now, one-time scheduling, and recurring\/post-publication automations.<\/li>\n<li>Optional simple automated message sequences triggered when a subscriber joins a list.<\/li>\n<li>Batched sending queue with configurable local rate limits and retries.<\/li>\n<li>Secure unsubscribe links and one-click unsubscribe support.<\/li>\n<li>Optional open and click tracking with campaign statistics, disabled by default on new installations.<\/li>\n<li>Technical log and diagnostics.<\/li>\n<li>No built-in SMTP credentials or mail-provider account management.<\/li>\n<\/ul>\n\n<h4>A simple approach<\/h4>\n\n<p>Sprint Newsletter intentionally avoids complex marketing workflows, scoring systems, and advanced sales automation. It is designed to cover common newsletter needs while keeping the administration understandable for non-specialists.<\/p>\n\n<h4>Email delivery<\/h4>\n\n<p>Sprint Newsletter sends through WordPress using <code>wp_mail()<\/code> only. The sender identity and actual delivery transport are controlled by WordPress and any mail\/SMTP plugin installed on the site.<\/p>\n\n<p>This means Sprint Newsletter can work alongside plugins such as WP Mail SMTP, FluentSMTP, Post SMTP, or another solution that integrates with <code>wp_mail()<\/code>.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>Sprint Newsletter stores newsletter-related personal data in the WordPress database. Depending on the features used, this can include email address, first name, last name, language, list memberships, subscription status, source, confirmation\/unsubscribe timestamps, and an optional link to a WordPress user account.<\/p>\n\n<p>For campaign delivery, the plugin stores recipient and queue history. Subscription\/consent records can store keyed hashes of the IP address and user-agent string for abuse prevention and consent evidence. If Statistics and tracking are enabled, Sprint Newsletter can also store detected opens and tracked link clicks together with keyed hashes of the requesting IP address and user-agent string. The plugin does not store those raw IP addresses in these records.<\/p>\n\n<p>Unsubscribe and tracking URLs are generated by the WordPress site. Email delivery is handed to <code>wp_mail()<\/code>, so the transport configured for WordPress may process recipient data according to that transport provider's own terms and privacy policy.<\/p>\n\n<p>Sprint Newsletter also adds suggested privacy-policy text to WordPress Settings &gt; Privacy &gt; Policy Guide.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Sprint Newsletter can use the following external services only when the related feature is used.<\/p>\n\n<h4>GIPHY<\/h4>\n\n<p>The visual builder includes an optional GIPHY search. It is inactive unless an administrator configures a GIPHY API key and runs a GIF search. When a search is performed, the search term and configured API key are sent directly from the administrator's browser to the GIPHY API. As with a normal browser request, GIPHY can also receive request metadata such as the administrator's IP address, browser user-agent, and referrer information. Search results and selected GIPHY media are loaded from GIPHY-hosted URLs.<\/p>\n\n<p>GIPHY: https:\/\/giphy.com\/\nGIPHY API Terms: https:\/\/support.giphy.com\/hc\/en-us\/articles\/360028134111-GIPHY-API-Terms-of-Service\nGIPHY Privacy Policy: https:\/\/giphy.com\/privacy<\/p>\n\n<h4>YouTube thumbnails<\/h4>\n\n<p>When an administrator adds a YouTube URL to a video block and does not provide a custom thumbnail, Sprint Newsletter can use the standard <code>img.youtube.com<\/code> thumbnail URL for that video. The thumbnail can therefore be requested from YouTube by the administrator's preview or by the recipient's email client when images are loaded. That request can expose request metadata such as the requesting IP address and user-agent to YouTube\/Google, depending on the browser or mail client.<\/p>\n\n<p>YouTube Terms: https:\/\/www.youtube.com\/static?template=terms\nGoogle Privacy Policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<p>Administrators can avoid these external requests by not using GIPHY search and by providing a locally hosted custom thumbnail for video blocks.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>sprint-newsletter<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP from Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate Sprint Newsletter.<\/li>\n<li>Open Sprint Newsletter in the WordPress administration menu.<\/li>\n<li>Review Settings &gt; Identity and the optional modules.<\/li>\n<li>If your site needs SMTP or an email API, configure it in a dedicated WordPress mail plugin.<\/li>\n<li>Create a list, add or import subscribers, then create your first campaign.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20sprint%20newsletter%20include%20smtp%3F\"><h3>Does Sprint Newsletter include SMTP?<\/h3><\/dt>\n<dd><p>No. Sprint Newsletter deliberately uses WordPress <code>wp_mail()<\/code> and leaves SMTP\/API delivery to a dedicated mail plugin or to the site's existing WordPress mail configuration.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20existing%20smtp%20plugin%3F\"><h3>Can I use my existing SMTP plugin?<\/h3><\/dt>\n<dd><p>Yes. If the plugin integrates with <code>wp_mail()<\/code>, Sprint Newsletter hands the message to WordPress and the mail plugin can handle the actual transport.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20require%20an%20external%20newsletter%20account%3F\"><h3>Does the plugin require an external newsletter account?<\/h3><\/dt>\n<dd><p>No. Subscriber lists, campaigns, templates, queue data, and statistics are stored in your WordPress database. Optional GIPHY search is the only built-in feature that requires a separate API key.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20tracking%3F\"><h3>Can I disable tracking?<\/h3><\/dt>\n<dd><p>Yes. Statistics and tracking are an optional module and are disabled by default on new installations. When the module is disabled, new messages do not receive an open-tracking pixel or tracked-link redirects from Sprint Newsletter.<\/p><\/dd>\n<dt id=\"what%20are%20automated%20messages%3F\"><h3>What are automated messages?<\/h3><\/dt>\n<dd><p>Automated messages are an optional, intentionally simple sequence feature. A subscriber can enter a sequence when they join a selected list, and receive a small series of messages after configured delays.<\/p><\/dd>\n<dt id=\"what%20is%20the%20final%20wordpress%20preview%3F\"><h3>What is the Final WordPress Preview?<\/h3><\/dt>\n<dd><p>The builder preview shows the Sprint Newsletter message itself. Final WordPress Preview additionally runs the message through the WordPress mail preparation pipeline without sending it, so headers, footers, or formatting added by compatible mail plugins can be visible before delivery.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<li>Subscriber and list management with bulk actions, sortable columns, search, and remembered page sizes.<\/li>\n<li>CSV\/XLSX import and export with imported\/skipped\/failed result summaries.<\/li>\n<li>Visual newsletter builder with dynamic WordPress content blocks and reusable blocks.<\/li>\n<li>Test email and Final WordPress Preview tools.<\/li>\n<li>One-time scheduling and recurring\/post-publication campaign automations.<\/li>\n<li>Optional simple automated message sequences triggered by list membership.<\/li>\n<li>Batched wp_mail() queue, unsubscribe handling, optional tracking, and statistics.<\/li>\n<li>English source strings prepared for WordPress.org translations.<\/li>\n<\/ul>","raw_excerpt":"Simple self-hosted newsletters for WordPress: subscribers, lists, visual campaigns, scheduling, automations, and wp_mail() delivery.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368884"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sprintplugins"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368884"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368884"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368884"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368884"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368884"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}