Report Automatici per Clienti WordPress: Come Li Generiamo con l’AI

2 aprile 20266 minAutomazione
In breveAI

Automatizza il report mensile della tua agenzia con Claude API e WordPress, riducendo il tempo di elaborazione da 3 ore a 15 minuti per 30 clienti. Scopri come raccogliere dati automaticamente e generare report personalizzati con AI, migliorando l'efficienza e la produttività della tua attività.

Il Report Mensile È il Task Più Odiato in Agenzia. Automatizziamolo.

Ogni mese, stessa storia. Apri 15 dashboard. Copi numeri. Li metti in un template Word. Scrivi due frasi di commento. Invii via email. Ripeti per il prossimo cliente. Tre ore della tua vita che non torneranno.

Con Claude API e WordPress, questo processo diventa: raccogli dati automaticamente, genera il report con AI, revisiona in 2 minuti, invia. Da 3 ore a 15 minuti. Per 30 clienti.

Questo articolo mostra l’implementazione completa. Non il concetto. Il codice.

L’Architettura del Sistema

WordPress Cron (1° del mese)
    ↓
Raccolta dati automatica per ogni sito gestito
    ↓
Claude API genera il report dal template + dati
    ↓
Report salvato come custom post type
    ↓
Email automatica al cliente con PDF allegato
    ↓
Notifica in dashboard per revisione agenzia

I dati da raccogliere

Ogni report ha bisogno di dati reali. Ecco le fonti:

Dato Fonte Come raccoglierlo
Uptime % UptimeRobot API / AgencyPilot API call automatica
Page views Google Analytics / Plausible API o plugin
Page speed PageSpeed Insights API Chiamata API gratuita
Plugin aggiornati WordPress update log Custom table o option
Backup completati Plugin backup (UpdraftPlus, etc.) Hook completamento backup
Problemi sicurezza Wordfence/Sucuri log API plugin o log parsing
Core Web Vitals CrUX API Chiamata API gratuita

Step 1: Raccolta Dati

function collect_site_metrics(string $site_url): array {
    $metrics = [];
    
    // Uptime da UptimeRobot
    $uptime_response = wp_remote_get(
        'https://api.uptimerobot.com/v2/getMonitors',
        ['body' => json_encode([
            'api_key' => UPTIMEROBOT_API_KEY,
            'custom_uptime_ratios' => '30'
        ]),
        'headers' => ['Content-Type' => 'application/json']]
    );
    
    if (!is_wp_error($uptime_response)) {
        $data = json_decode(wp_remote_retrieve_body($uptime_response), true);
        $metrics['uptime'] = $data['monitors'][0]['custom_uptime_ratio'] ?? 'N/A';
    }
    
    // PageSpeed Insights
    $psi_url = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
        . "?url=" . urlencode($site_url) . "&strategy=mobile";
    $psi_response = wp_remote_get($psi_url, ['timeout' => 30]);
    
    if (!is_wp_error($psi_response)) {
        $psi = json_decode(wp_remote_retrieve_body($psi_response), true);
        $metrics['speed_score'] = $psi['lighthouseResult']['categories']['performance']['score'] ?? 0;
        $metrics['speed_score'] = round($metrics['speed_score'] * 100);
        $metrics['lcp'] = $psi['lighthouseResult']['audits']['largest-contentful-paint']['numericValue'] ?? 0;
        $metrics['cls'] = $psi['lighthouseResult']['audits']['cumulative-layout-shift']['numericValue'] ?? 0;
    }
    
    // Aggiornamenti applicati (da custom log)
    $metrics['updates'] = get_option("updates_applied_{$site_url}_" . date('Y-m'), []);
    $metrics['updates_count'] = count($metrics['updates']);
    
    // Backup completati
    $metrics['backups'] = get_option("backups_completed_{$site_url}_" . date('Y-m'), 0);
    
    // Eventi sicurezza
    $metrics['security_events'] = get_option("security_events_{$site_url}_" . date('Y-m'), []);
    $metrics['blocked_attacks'] = count($metrics['security_events']);
    
    return $metrics;
}

Step 2: Generazione Report con AI

function generate_ai_report(array $metrics, string $client_name, string $site_url): string {
    $claude = $GLOBALS['claude'];
    
    $data_summary = json_encode($metrics, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    
    $prompt = "Genera un report mensile di gestione WordPress per il cliente {$client_name}.\n\n"
        . "Sito: {$site_url}\n"
        . "Periodo: " . date('F Y') . "\n\n"
        . "Dati raccolti:\n{$data_summary}\n\n"
        . "Il report deve:\n"
        . "- Essere in italiano, tono professionale ma accessibile\n"
        . "- Avere 4 sezioni: Panoramica, Performance, Sicurezza, Prossimi Passi\n"
        . "- Iniziare con un sommario di 2 frasi\n"
        . "- Evidenziare i numeri chiave in modo chiaro\n"
        . "- Includere 2-3 raccomandazioni specifiche basate sui dati\n"
        . "- Se l'uptime è sotto 99.9%, spiegare le cause probabili\n"
        . "- Se il page speed è sotto 80, indicare le azioni prioritarie\n"
        . "- Lunghezza: 400-600 parole\n"
        . "- NON inventare dati non presenti nell'input\n"
        . "- Formato: HTML semplice (h3, p, ul, strong)";
    
    $system = "Sei il report generator di un'agenzia WordPress professionale. "
        . "Scrivi report chiari per clienti non tecnici. "
        . "Usa solo i dati forniti. Mai inventare numeri.";
    
    $result = $claude->query($prompt, [
        'system' => $system,
        'max_tokens' => 2048
    ]);
    
    return $result['content'] ?? 'Errore nella generazione del report.';
}

Step 3: Salvataggio e Invio

// Custom Post Type per i report
add_action('init', function() {
    register_post_type('client_report', [
        'labels' => ['name' => 'Report Clienti', 'singular_name' => 'Report'],
        'public' => false,
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_icon' => 'dashicons-chart-area',
        'supports' => ['title', 'editor', 'custom-fields'],
    ]);
});

// Genera e salva il report
function create_monthly_report(string $client_name, string $site_url, string $client_email) {
    $metrics = collect_site_metrics($site_url);
    $report_html = generate_ai_report($metrics, $client_name, $site_url);
    
    // Salva come post
    $post_id = wp_insert_post([
        'post_type'    => 'client_report',
        'post_title'   => "Report {$client_name} - " . date('F Y'),
        'post_content' => $report_html,
        'post_status'  => 'private',
    ]);
    
    // Salva i metadati
    update_post_meta($post_id, '_client_name', $client_name);
    update_post_meta($post_id, '_site_url', $site_url);
    update_post_meta($post_id, '_metrics_raw', $metrics);
    update_post_meta($post_id, '_generated_at', current_time('mysql'));
    
    // Invia email al cliente
    $subject = "Report Mensile {$site_url} - " . date('F Y');
    $headers = ['Content-Type: text/html; charset=UTF-8'];
    
    $email_body = "<h2>Report Mensile - " . date('F Y') . "</h2>"
        . $report_html
        . "<p><small>Report generato automaticamente da AgencyPilot.</small></p>";
    
    wp_mail($client_email, $subject, $email_body, $headers);
    
    return $post_id;
}

Step 4: Cron Mensile

// Schedula la generazione il 1° di ogni mese
add_action('init', function() {
    if (!wp_next_scheduled('generate_monthly_reports')) {
        // Prossimo 1° del mese alle 8:00
        $next = strtotime('first day of next month 08:00:00');
        wp_schedule_event($next, 'monthly', 'generate_monthly_reports');
    }
});

add_action('generate_monthly_reports', function() {
    // Lista clienti (da custom table o option)
    $clients = [
        ['name' => 'Comune di Pescara', 'url' => 'https://comune-pescara.it', 'email' => 'it@comune-pescara.it'],
        ['name' => 'Studio Rossi', 'url' => 'https://studiorossi.it', 'email' => 'info@studiorossi.it'],
        // ... altri clienti
    ];
    
    foreach ($clients as $client) {
        create_monthly_report($client['name'], $client['url'], $client['email']);
        sleep(5); // Rate limiting gentile
    }
});

Il Report in Pratica: Cosa Esce

Con i dati reali di un sito con uptime 99.95%, speed score 78, e 3 plugin aggiornati, Claude genera qualcosa come:

Sommario: Il sito ha mantenuto un’ottima disponibilità (99.95%) nel mese di marzo. Le performance mobile richiedono attenzione: il punteggio PageSpeed è sceso a 78, sotto la soglia consigliata di 85.

Performance: LCP a 2.8 secondi (obiettivo: sotto 2.5s). Il CLS è stabile a 0.05, ben sotto la soglia di 0.1. Raccomandiamo: ottimizzare le immagini above-the-fold e attivare il lazy loading per le immagini sotto il fold.

Prossimi Passi:
1. Ottimizzazione immagini hero (impatto stimato: +5-10 punti PageSpeed)
2. Aggiornamento PHP da 8.1 a 8.3 (miglioramento performance del 10-15%)

Revisionalo in 2 minuti, aggiusta se serve, invio automatico. Fatto.

Costi

Voce Costo
Claude API (30 report/mese) ~$0.18
PageSpeed Insights API Gratuito
UptimeRobot API (free tier) Gratuito fino a 50 monitor
Email WordPress (wp_mail) Gratuito
Totale ~$0.18/mese

Zero virgola diciotto centesimi al mese. Per report che prima richiedevano 3 ore di lavoro manuale.

FAQ

Posso personalizzare il template del report per ogni cliente?

Sì. Aggiungi un campo “template_notes” per ogni cliente con le preferenze specifiche (es: “questo cliente vuole vedere i dati SEO”, “questo cliente è tecnico, usa linguaggio avanzato”). Passale nel prompt e Claude adatterà il tono e il contenuto.

Come gestisco i clienti che vogliono il report in PDF?

Genera l’HTML con Claude, poi convertilo in PDF con una libreria come DOMPDF o mPDF (entrambe disponibili per PHP). Allega il PDF alla email con wp_mail(). Il costo aggiuntivo è zero.

E se l’AI scrive qualcosa di sbagliato nel report?

Per questo il workflow include la revisione. I report vengono salvati come custom post type (status: private). Tu li rivedi nella dashboard WordPress prima che l’email parta. In alternativa, imposta un delay di 24 ore tra generazione e invio, così hai tempo per controllare.

Gestisci i siti WordPress dei tuoi clienti?

AgencyPilot ti dà report AI, uptime monitoring, backup e portale clienti in un’unica dashboard. Gratis per 3 siti.

Prova gratis
Leggi anche
Tutti gli articoli
Tutti gli articoli