Weekly & monthly reviews
The weekly and monthly maintenance rhythm for a live install — drifts to catch, a restore drill, updates and retention to confirm.
Weekly & monthly reviews
Daily checks catch today's problems. This page catches the slow drifts: a webhook that has been rejecting for a week, a backup that has never been restore-tested, an update that has been pending for a month. The weekly pass takes about 15 minutes; the monthly pass is a longer, calm walk-through — better done at a quiet time, not during an incident.
Who this is for
- The super admin responsible for a live install.
- The developer on support for the install.
Difficulty: Easy · Time: about 30 minutes (weekly part ~15 min, monthly part ~15 min) · Prerequisites: Super Admin access and shell access or hosting-panel access for the command-line checks.
Weekly review
1. Webhooks and lead sources
- Admin → Webhook Logs (
/admin/webhook-logs): filter to the last 7 days. A healthy picture is allaccepted.rejectedmeans the connection was inactive;invalid_signaturemeans the App Secret and the provider no longer agree — see Meta won't connect. - Admin → Lead Source Health Report (
/admin/lead-source-health-report): every connection ishealthy(or has an obvious explanation, like a paused campaign). Reconnect anything that says it needs it. - Super Admin → Meta Ads → Needs Attention (
/super-admin/meta-ads/needs-attention): resolve anything already fixed, acknowledge anything you are working on. The nav badge counts open CRITICAL issues so nothing hides.
2. WhatsApp and Meta health
leadhub:meta-healthruns every 6 hours and logs a warning when it finds unhealthy connections ([leadhub:meta-health] unhealthy Meta connections detected). Connection statuses to expect:healthy, orexpiringas a warning —expired,invalid,missinganderrorall need a reconnect.- System Health WhatsApp card: templates
approvedwhere you expect them (pending/rejectedones need attention in Meta), andqueue_failuresback at 0 after any retry.
3. Failed jobs
php artisan queue:failed— clear out anything old you have triaged, withphp artisan queue:flush(this deletes all failed-job records; check them first).- If the same job keeps failing, it is a symptom, not a housekeeping item — chase the cause from the matching troubleshooting page.
4. Payments and reconciliation
- Super Admin → Billing → Commercial (
/super-admin/billing/commercial): thepayment_failures,grace_period,restrictedandsuspendedcards should hold no surprises. Payment reconciliation runs every 30 minutes and raises aBillingReconciliationAlerton the billing overview's Needs Attention when provider status drifts from what the CRM believes — clear each one deliberately.
Monthly review
1. Restore drill (the most important item)
Verifying a backup proves it opens. A restore drill proves it works:
- Super Admin → Settings → Backups (
/super-admin/settings/backups): pick the newest backup, run Verify (checks the archive is healthy and counts the SQL statements inside). - On a test copy of the install (never on production), restore it — the Restore action extracts the zip and imports the SQL.
- Confirm the test copy logs in and shows plausible data.
- Note the date of your last successful drill. If it has been more than a quarter, do it now.
2. Retention and purge jobs
- Confirm the nightly purges have been running: audit entries older than the retention window are gone (
audit_logs180 days by default), login-attempt rows older than 30 days are gone, processed billing events older than 90 days are gone. - Run a dry-run to see what would be removed before changing any window:
php artisan leadhub:purge-audit-logs --dry-run - Windows are configurable per install with
LH_AUDIT_RETENTION_DAYS,LH_LOGIN_ATTEMPT_RETENTION_DAYSandLH_BILLING_EVENT_RETENTION_DAYS(seeconfig/leadhub.php). Recording purge details are on Data retention & privacy (GDPR).
3. Disk, recordings and backups rotation
- System Health disk usage: compare with last month. Recordings are usually the biggest grower — the retention purge handles audio, backups accumulate per run.
- Prune old backups deliberately (
leadhub:backup --prune=or the Delete action on the Backups page) — keep at least one verified backup from every recent period you care about.
4. Updates
- Super Admin → Settings → Updates (
/super-admin/settings/updates): apply pending updates from here. Applying creates a pre-update backup automatically, so rollback is "restore that backup" — which is exactly why you do the restore drill first. - After an update: clear/rebuild caches and check
php artisan migrate:statusvia System Health.
5. Access and security hygiene
- Admin → Security settings (
/admin/security-settings-page): login-attempt limit and lockout duration still match your policy (defaults: 5 attempts / 15 minutes). - Team members: remove leavers; check that roles still match reality (see Team members).
- Mobile app: check the platform's minimum/latest version and update URL under Super Admin → Settings → Mobile App Login (
/super-admin/settings/mobile-app-login). If you ship a new APK, update the URL there so devices are pointed at the new build.
Expected result
A short note in your own records for each month: last restore drill date, disk trend, updates applied, anything acknowledged on Needs Attention. Future-you (and whoever takes over) will thank you.
Common mistakes
| Mistake | Why it hurts | Do this instead |
|---|---|---|
| Treating "Verify passed" as "restore tested" | Verification opens the archive; it does not import it | Drill a real restore on a test copy quarterly |
Clearing failed jobs with queue:flush before reading them |
You delete the evidence | Read first; flush only triaged rows |
| Applying updates without noting the pre-update backup | Rollback becomes guesswork | Write down the backup name before you click |
Letting expiring Meta connections ride |
They become expired, and leads stop |
Reconnect during the weekly pass |
Ignoring pending WhatsApp templates for weeks |
Messages outside the 24-hour window get rejected | Chase template approval in Meta weekly |
Troubleshooting
| What you found | Go to |
|---|---|
| Repeated webhook rejections from Meta | Leads not entering the CRM |
| WhatsApp templates stuck pending | WhatsApp not sending |
| Payment reconciliation alerts repeating | Payments failing |
| Backup verify failing | Incident response |
| Update went wrong | Deployment & server errors |
Technical details
leadhub:purge-audit-logs {--days=} {--login-days=} {--billing-events-days=} {--dry-run}— defaults 180/30/90 days; chunked deletes.leadhub:backup {--prune=}— database + files zip; retention windows come from the same config block.leadhub:meta-health— statuses fromMetaConnectionHealthService:healthy,expiring,expired,invalid,missing,error; logs[leadhub:meta-health] unhealthy Meta connections detectedas a warning.- Provider reconciliation runs every 30 minutes and raises
BillingReconciliationAlert, surfaced on the billing overview's "Needs Attention" list.
Related guides
Was this page helpful?
Thanks — noted. ✦