Reporting Wave Business = visibilité revenue + KPIs business. Dashboard analytics + exports automatiques = standard 2026 PME modernes.
TL;DR
- KPIs essentiels : transactions, taux conversion, CA, refunds.
- Stack : PostgreSQL + Metabase (gratuit).
- Cron daily reports email + Slack.
- Comparatifs M-1, Y-1, growth tracking.
KPIs essentiels Wave
`
- Transactions :
- Volume / jour
- Tickets moyens
- Taux succès vs échec
- Revenue :
- CA brut / net (après frais Wave)
- Par produit / catégorie
- Par canal (web, app)
- Customer behavior :
- Conversions checkout → paiement
- Abandons paiement (+ raisons)
- Repeat customers
- Operationnel :
- Refunds / chargebacks
- Failed payments
- Réconciliation gaps
`
Stack reporting 2026
- PostgreSQL (DB transactions Wave normalized)
- +
- Metabase (BI gratuit, self-host ou cloud)
- ou
- PowerBI / Looker Studio
- +
- Cron jobs daily reports
- +
- Slack webhooks alerts
Schema DB analytics
`sql
-- Table dénormalisée pour analytics
CREATE TABLE wave_transactions_analytics (
id UUID PRIMARY KEY,
wave_id VARCHAR UNIQUE,
amount INT,
currency VARCHAR(3),
status VARCHAR(20),
type VARCHAR(20), -- 'checkout' | 'payout' | 'refund'
-- Dates
created_at TIMESTAMP,
paid_at TIMESTAMP,
date DATE GENERATED ALWAYS AS (DATE(created_at)) STORED,
hour INT GENERATED ALWAYS AS (EXTRACT(HOUR FROM created_at)) STORED,
weekday INT GENERATED ALWAYS AS (EXTRACT(DOW FROM created_at)) STORED,
-- Customer
customer_id UUID,
customer_phone VARCHAR,
is_repeat_customer BOOLEAN,
-- Product / order
order_id UUID,
product_category VARCHAR,
product_name VARCHAR,
-- Wave details
wave_fee INT,
net_amount INT,
device VARCHAR,
-- Indexes
INDEX idx_date (date),
INDEX idx_status (status),
INDEX idx_customer (customer_id)
);
`
Queries SQL standards
`sql
-- 1. CA daily 30 derniers jours
SELECT
date,
COUNT(*) AS transactions,
SUM(amount) AS gross_revenue,
SUM(net_amount) AS net_revenue,
AVG(amount) AS avg_ticket
FROM wave_transactions_analytics
WHERE status = 'completed'
AND date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY date
ORDER BY date DESC;
-- 2. Top 10 produits
SELECT
product_category,
product_name,
COUNT(*) AS sales,
SUM(amount) AS revenue
FROM wave_transactions_analytics
WHERE status = 'completed'
AND date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY product_category, product_name
ORDER BY revenue DESC
LIMIT 10;
-- 3. Heures pic conversion
SELECT
hour,
COUNT(*) AS transactions,
AVG(amount) AS avg_ticket
Besoin d'un site web professionnel ?
Kolonell crée des sites web qui attirent des clients, optimisés pour le marché sénégalais. Devis gratuit en 2 minutes.
FROM wave_transactions_analytics
WHERE status = 'completed'
GROUP BY hour
ORDER BY transactions DESC;
-- 4. Customer cohort retention
WITH cohorts AS (
SELECT
customer_id,
DATE_TRUNC('month', MIN(created_at)) AS cohort_month
FROM wave_transactions_analytics
WHERE status = 'completed'
GROUP BY customer_id
)
SELECT
cohort_month,
DATE_TRUNC('month', t.created_at) AS activity_month,
COUNT(DISTINCT t.customer_id) AS active_customers
FROM wave_transactions_analytics t
JOIN cohorts c ON t.customer_id = c.customer_id
GROUP BY cohort_month, activity_month
ORDER BY cohort_month, activity_month;
`
Daily report cron
`typescript
cron.schedule('0 8 * * *', async () => { // 8am every day
const yesterday = new Date(Date.now() - 24 * 3600 * 1000)
.toISOString().slice(0, 10);
const stats = await db.query(`
SELECT
COUNT(*) AS transactions,
SUM(amount) AS revenue,
SUM(amount) FILTER (WHERE status = 'completed') AS net_revenue,
COUNT(*) FILTER (WHERE status = 'failed') AS failed,
COUNT(*) FILTER (WHERE type = 'refund') AS refunds,
AVG(amount) AS avg_ticket
FROM wave_transactions_analytics
WHERE date = $1
`, [yesterday]);
// Send Slack
await slackWebhook({
text: 📊 Rapport Wave ${yesterday},
blocks: [
{ type: 'section', text: { type: 'mrkdwn', text:
*Transactions* : ${stats.transactions}\n*Revenue* : ${stats.revenue.toLocaleString()} FCFA\n*Failed* : ${stats.failed}\n*Refunds* : ${stats.refunds}\n*Ticket moyen* : ${stats.avg_ticket.toLocaleString()}
} },
],
});
// Email équipe finance
await sendEmail('finance@kolonell.com', {
subject: Rapport Wave ${yesterday},
body: renderEmailTemplate(stats),
});
});
`
Metabase setup gratuit
`bash
# Self-host Metabase
docker run -d -p 3000:3000 \
-v metabase-data:/metabase-data \
--name metabase metabase/metabase
# Connect to PostgreSQL
# Create dashboards :
# - Daily revenue
# - Top products
# - Customer retention
# - Failed transactions
`
Coût : 0€ self-host, 80-300€/mois cloud.
FAQ
Q : Wave provides analytics dashboard ?
R : Basic. Export CSV + custom analytics = recommandé pour insights deep.
Q : Real-time vs daily ?
R : Real-time pour ops critiques (refunds, failed). Daily pour reporting business.
Conclusion
Wave Business reporting 2026 : PostgreSQL + Metabase + cron daily = stack moderne PME. KPIs business + opérationnel critiques. Self-host gratuit, cloud 80-300€/mois.
Mohamed Bah
Fondateur, Kolonell
Passionné par le digital et l'entrepreneuriat en Afrique, Mohamed accompagne les entreprises sénégalaises dans leur transformation digitale depuis 2020. Fondateur de Kolonell, il croit que chaque PME mérite une présence en ligne professionnelle et accessible.

