@extends('licensing::admin.layout') @section('title', 'SonarDesk Billing Audit') @section('content')

Billing Audit

Local database checks only. No Paddle API requests, billing changes, webhook replays or licence mutations are performed.

Subscription-linked licences
{{ number_format($linkedCount) }}
Missing payment provider
{{ number_format($missingProvider) }}
Missing customer ID
{{ number_format($missingCustomer) }}
Missing subscription status
{{ number_format($missingStatus) }}
Webhook events stored
{{ number_format($eventCount) }}
Unprocessed events
{{ number_format($unprocessedEvents) }}
Events with errors
{{ number_format($failedEvents) }}

Duplicate subscription identifiers (first 25)

Multiple licences can legitimately share a subscription. Review these before deciding whether a record is incorrect.

@forelse ($duplicateSubscriptions as $row) @empty@endforelse
ProviderSubscription IDLicences
{{ $row->payment_provider ?? '—' }}{{ $row->external_subscription_id }}{{ $row->license_count }}
No repeated subscription identifiers.

Duplicate webhook event identifiers (first 25)

@forelse ($duplicateEvents as $row) @empty@endforelse
ProviderEvent IDRows
{{ $row->provider }}{{ $row->external_event_id }}{{ $row->event_count }}
No duplicate event identifiers.

Recent processing errors

@forelse ($recentFailures as $event) @empty@endforelse
WhenProviderEvent typeEvent IDError
{{ $event->created_at?->format('d M Y H:i') ?? '—' }}{{ $event->provider }}{{ $event->event_type }}{{ $event->external_event_id }}{{ \Illuminate\Support\Str::limit($event->processing_error, 240) }}
No stored processing errors.
@endsection