Zodiac Tech CRM Docs

Weekly & monthly reviews

The weekly and monthly maintenance rhythm for a live install — drifts to catch, a restore drill, updates and retention to confirm.

super-admin developer Easy ⏱ 30 min Updated 2026-10-05

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 all accepted. rejected means the connection was inactive; invalid_signature means 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 is healthy (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-health runs every 6 hours and logs a warning when it finds unhealthy connections ([leadhub:meta-health] unhealthy Meta connections detected). Connection statuses to expect: healthy, or expiring as a warning — expired, invalid, missing and error all need a reconnect.
  • System Health WhatsApp card: templates approved where you expect them (pending/rejected ones need attention in Meta), and queue_failures back at 0 after any retry.

3. Failed jobs

  • php artisan queue:failed — clear out anything old you have triaged, with php 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): the payment_failures, grace_period, restricted and suspended cards should hold no surprises. Payment reconciliation runs every 30 minutes and raises a BillingReconciliationAlert on 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:

  1. 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).
  2. On a test copy of the install (never on production), restore it — the Restore action extracts the zip and imports the SQL.
  3. Confirm the test copy logs in and shows plausible data.
  4. 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_logs 180 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_DAYS and LH_BILLING_EVENT_RETENTION_DAYS (see config/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:status via 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 from MetaConnectionHealthService: healthy, expiring, expired, invalid, missing, error; logs [leadhub:meta-health] unhealthy Meta connections detected as a warning.
  • Provider reconciliation runs every 30 minutes and raises BillingReconciliationAlert, surfaced on the billing overview's "Needs Attention" list.

Was this page helpful?