environment('local'); } /** * @param array $properties */ public function capture(string $distinctId, string $event, array $properties = [], ?Account $account = null): void { try { $payload = [ 'distinctId' => $distinctId, 'event' => $event, 'properties' => $properties, ]; if ($account) { $payload['properties']['$groups'] = ['account' => (string) $account->id]; $payload['properties']['account_id'] = (string) $account->id; $payload['properties']['plan'] = $account->plan?->name; } $this->logLocally('capture', $payload); if (self::isEnabled()) { $this->dispatch('capture', $payload); } } catch (Throwable $e) { Log::warning('PostHogService: failed to capture event', [ 'event' => $event, 'error' => $e->getMessage(), ]); } } /** * @param array $properties */ public function identify(string $distinctId, array $properties = []): void { try { $payload = [ 'distinctId' => $distinctId, 'properties' => $properties, ]; $this->logLocally('identify', $payload); if (self::isEnabled()) { $this->dispatch('identify', $payload); } } catch (Throwable $e) { Log::warning('PostHogService: failed to identify', [ 'error' => $e->getMessage(), ]); } } /** * @param array $properties */ public function groupIdentify(string $groupType, string $groupKey, array $properties = []): void { try { $payload = [ 'groupType' => $groupType, 'groupKey' => $groupKey, 'properties' => $properties, ]; $this->logLocally('groupIdentify', $payload); if (self::isEnabled()) { $this->dispatch('groupIdentify', $payload); } } catch (Throwable $e) { Log::warning('PostHogService: failed to group identify', [ 'error' => $e->getMessage(), ]); } } /** * Local-only visibility into what would be sent to PostHog, so events can * be verified from laravel.log without a real API key configured. * * @param array $payload */ private function logLocally(string $method, array $payload): void { if (! app()->environment('local')) { return; } Log::info("PostHogService: {$method}", $payload); } /** * @param array $payload */ private function dispatch(string $method, array $payload): void { try { SendEvent::dispatch($method, $payload); } catch (Throwable $e) { Log::warning('PostHogService: failed to dispatch event', ['method' => $method, 'error' => $e->getMessage()]); } } }