Appearance
PHP Example
Server-side examples using PHP. These examples show how to send events and query analytics from your backend using OAuth 2.0 authentication.
Authentication
Obtain an OAuth token using the client credentials grant:
php
$clientId = 'your-client-id';
$clientSecret = 'your-client-secret';
$ch = curl_init('https://identity.retailsuccessplatform.com/oauth/token');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
CURLOPT_POSTFIELDS => http_build_query([
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret,
'scope' => 'insightcore:reports.read insightcore:funnels.read',
]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
$accessToken = $response['access_token'];Helper Function
All examples below use this helper to make authenticated GET requests:
php
function insightcoreGet(string $path, array $params, string $accessToken): array
{
$url = 'https://api.insightcore.retailsuccessplatform.com/api/v1' . $path;
if ($params) {
$url .= '?' . http_build_query($params);
}
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $accessToken,
'Accept: application/json',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("InsightCore API returned HTTP {$status}: {$body}");
}
return json_decode($body, true);
}Fetch Overview Metrics
php
$response = insightcoreGet('/analytics/reports/overview', [
'from' => '2026-03-01',
'to' => '2026-03-26',
], $accessToken);
$data = $response['data'];
echo "Visitors: {$data['total_visitors']}\n";
echo "Page Views: {$data['total_page_views']}\n";
echo "Bounce Rate: {$data['bounce_rate']}%\n";
echo "Avg Session: {$data['avg_session_duration_seconds']}s\n";Fetch Real-Time Visitor Count
php
$response = insightcoreGet('/analytics/realtime/active-visitors', [], $accessToken);
echo "Active visitors: {$response['data']['active_visitors']}\n";Fetch Top Pages
php
$response = insightcoreGet('/analytics/reports/pages', [
'from' => '2026-03-01',
'to' => '2026-03-26',
], $accessToken);
foreach ($response['data'] as $page) {
echo "{$page['page_url']}: {$page['views']} views, {$page['unique_visitors']} unique\n";
}Fetch Traffic Sources
php
$response = insightcoreGet('/analytics/reports/traffic-sources', [
'from' => '2026-03-01',
'to' => '2026-03-26',
], $accessToken);
foreach ($response['data'] as $source) {
$campaign = $source['campaign'] ?? '(none)';
echo "{$source['source']} / {$source['medium']} [{$campaign}]: {$source['visitors']} visitors\n";
}Fetch Ecommerce Report
php
$response = insightcoreGet('/analytics/reports/ecommerce', [
'from' => '2026-03-01',
'to' => '2026-03-26',
], $accessToken);
$data = $response['data'];
echo "Revenue: \${$data['total_revenue']}\n";
echo "Orders: {$data['total_orders']}\n";
echo "AOV: \${$data['avg_order_value']}\n";
echo "Conversion Rate: {$data['conversion_rate']}%\n";Analyze a Funnel
php
$funnelId = 'fnl_00000k1L2m3N4o5';
$response = insightcoreGet("/funnels/{$funnelId}/analyze", [
'from' => '2026-03-01',
'to' => '2026-03-26',
], $accessToken);
$data = $response['data'];
echo "Funnel: {$data['name']}\n";
foreach ($data['steps'] as $step) {
$rate = number_format($step['completion_rate'] * 100, 1);
echo " Step {$step['step_number']}: {$step['step_name']} — {$step['entries']} entries ({$rate}% completion)\n";
}Server-Side Event Ingestion
Use the authenticated POST /v1/events endpoint to send analytics events from your backend. This is useful for tracking purchases after payment confirmation, recording refunds, importing historical data, or any event that doesn't originate from a browser.
Request a token with the insightcore:events.write scope:
php
$ch = curl_init('https://identity.retailsuccessplatform.com/oauth/token');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
CURLOPT_POSTFIELDS => http_build_query([
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret,
'scope' => 'insightcore:events.write',
]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
$accessToken = $response['access_token'];Send a Purchase Event
php
$payload = json_encode([
'events' => [
[
'type' => 'purchase',
'url' => 'https://mystore.com/checkout/complete',
'order_total' => 89.97,
'items' => [
['product_id' => 'prd_00000k1L2m3N4o5', 'quantity' => 3, 'price' => 29.99],
],
],
],
'ip' => $customerIp, // optional — end-user IP for GeoIP
'user_agent' => $customerUa, // optional — end-user UA string
]);
$ch = curl_init('https://api.insightcore.retailsuccessplatform.com/api/v1/events');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => $payload,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// $status === 202, $body === {"accepted": 1}Send a Batch of Events
The authenticated endpoint accepts up to 500 events per request:
php
$events = [];
foreach ($orders as $order) {
$events[] = [
'type' => 'purchase',
'url' => "https://mystore.com/orders/{$order->id}",
'timestamp' => $order->completed_at->getTimestampMs(),
'order_total' => $order->total,
'items' => $order->items->map(fn ($item) => [
'product_id' => $item->product_hashkey,
'quantity' => $item->quantity,
'price' => $item->unit_price,
])->all(),
];
}
$ch = curl_init('https://api.insightcore.retailsuccessplatform.com/api/v1/events');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['events' => $events]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
echo "Accepted: {$body['accepted']} events\n";Using Guzzle (Laravel / Composer)
If your project uses Guzzle, you can simplify the HTTP calls:
php
use GuzzleHttp\Client;
$identity = new Client(['base_uri' => 'https://identity.retailsuccessplatform.com']);
$tokenResponse = $identity->post('/oauth/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret,
'scope' => 'insightcore:events.write insightcore:reports.read insightcore:funnels.read',
],
]);
$accessToken = json_decode($tokenResponse->getBody(), true)['access_token'];
$insightcore = new Client([
'base_uri' => 'https://api.insightcore.retailsuccessplatform.com/api/v1/',
'headers' => [
'Authorization' => "Bearer {$accessToken}",
'Accept' => 'application/json',
],
]);
// Overview
$overview = json_decode(
$insightcore->get('analytics/reports/overview', [
'query' => ['from' => '2026-03-01', 'to' => '2026-03-26'],
])->getBody(),
true
);
echo "Visitors: {$overview['data']['total_visitors']}\n";
// Real-time
$realtime = json_decode(
$insightcore->get('analytics/realtime/active-visitors')->getBody(),
true
);
echo "Active now: {$realtime['data']['active_visitors']}\n";
// Top pages
$pages = json_decode(
$insightcore->get('analytics/reports/pages', [
'query' => ['from' => '2026-03-01', 'to' => '2026-03-26'],
])->getBody(),
true
);
foreach ($pages['data'] as $page) {
echo "{$page['page_url']}: {$page['views']} views\n";
}
// Ecommerce
$ecommerce = json_decode(
$insightcore->get('analytics/reports/ecommerce', [
'query' => ['from' => '2026-03-01', 'to' => '2026-03-26'],
])->getBody(),
true
);
echo "Revenue: \${$ecommerce['data']['total_revenue']}\n";
// Send events
$insightcore->post('events', [
'json' => [
'events' => [
[
'type' => 'purchase',
'url' => 'https://mystore.com/checkout/complete',
'order_total' => 89.97,
'items' => [
['product_id' => 'prd_00000k1L2m3N4o5', 'quantity' => 3, 'price' => 29.99],
],
],
],
'ip' => '203.0.113.42',
],
]);Using Laravel HTTP Client
For Laravel applications, you can use the built-in HTTP facade:
php
use Illuminate\Support\Facades\Http;
// Obtain token
$tokenResponse = Http::asForm()->post('https://identity.retailsuccessplatform.com/oauth/token', [
'grant_type' => 'client_credentials',
'client_id' => config('services.insightcore.client_id'),
'client_secret' => config('services.insightcore.client_secret'),
'scope' => 'insightcore:events.write insightcore:reports.read insightcore:funnels.read',
]);
$accessToken = $tokenResponse->json('access_token');
// Create a reusable client macro or use withToken directly
$api = Http::withToken($accessToken)
->baseUrl('https://api.insightcore.retailsuccessplatform.com/api/v1')
->acceptJson();
// Overview
$overview = $api->get('/analytics/reports/overview', [
'from' => '2026-03-01',
'to' => '2026-03-26',
])->json('data');
// Real-time visitors
$activeVisitors = $api->get('/analytics/realtime/active-visitors')->json('data.active_visitors');
// Top pages
$pages = $api->get('/analytics/reports/pages', [
'from' => '2026-03-01',
'to' => '2026-03-26',
])->json('data');
// Ecommerce
$ecommerce = $api->get('/analytics/reports/ecommerce', [
'from' => '2026-03-01',
'to' => '2026-03-26',
])->json('data');
// Funnel analysis
$funnel = $api->get('/funnels/fnl_00000k1L2m3N4o5/analyze', [
'from' => '2026-03-01',
'to' => '2026-03-26',
])->json('data');
// Send events from backend
$api->post('/events', [
'events' => [
[
'type' => 'purchase',
'url' => "https://mystore.com/orders/{$order->id}",
'order_total' => $order->total,
'items' => $order->items->map(fn ($item) => [
'product_id' => $item->product_hashkey,
'quantity' => $item->quantity,
'price' => $item->unit_price,
])->all(),
],
],
'ip' => $request->ip(),
]);Changelog
| Date | Change |
|---|---|
| 2026-03-28 | Initial publication with reporting and server-side event ingestion examples. |