Language Examples
Ready-to-use helper functions and examples for integrating Eventicat into your application. All examples use environment variables for secure credential management.
Environment Setup
Store your credentials as environment variables:
export EVENTICAT_AGGREGATOR_ID="your_aggregator_id"
export EVENTICAT_API_KEY="your_api_key"
JavaScript/TypeScript
Helper Function
async function sendEvent(eventName, tags = {}) {
const aggregatorId = process.env.EVENTICAT_AGGREGATOR_ID;
const apiKey = process.env.EVENTICAT_API_KEY;
const response = await fetch(
`https://app.eventicat.com/api/event?_id=${aggregatorId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: eventName,
...tags
})
}
);
if (!response.ok) {
throw new Error(`Failed to send event: ${response.statusText}`);
}
return await response.json();
}
Usage
// Simple event
await sendEvent('user_signup');
// Event with tags
await sendEvent('purchase_completed', {
plan: 'pro',
region: 'us-east'
});
Browser/Frontend (Next.js, React)
For frontend applications, create an API route to proxy events:
// app/api/track/route.js
import { NextResponse } from 'next/server';
export async function POST(request) {
const { name, ...tags } = await request.json();
const response = await fetch(
`https://app.eventicat.com/api/event?_id=${process.env.EVENTICAT_AGGREGATOR_ID}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EVENTICAT_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ name, ...tags })
}
);
return NextResponse.json(await response.json(), { status: response.status });
}
Then call it from your frontend:
// Client-side code
async function trackEvent(name, tags = {}) {
await fetch('/api/track', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, ...tags })
});
}
// Usage
await trackEvent('button_clicked', { button_id: 'signup' });
Python
Helper Function
import os
import requests
def send_event(event_name, tags=None):
"""Send an event to Eventicat."""
aggregator_id = os.environ['EVENTICAT_AGGREGATOR_ID']
api_key = os.environ['EVENTICAT_API_KEY']
payload = {'name': event_name}
if tags:
payload.update(tags)
response = requests.post(
f'https://app.eventicat.com/api/event?_id={aggregator_id}',
headers={
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
},
json=payload
)
response.raise_for_status()
return response.json()
Usage
# Simple event
send_event('user_signup')
# Event with tags
send_event('purchase_completed', {
'plan': 'pro',
'region': 'us-east'
})
Django Integration
# utils/analytics.py
import os
import requests
from django.conf import settings
def track_event(event_name, tags=None):
"""Track an event in Eventicat."""
aggregator_id = settings.EVENTICAT_AGGREGATOR_ID
api_key = settings.EVENTICAT_API_KEY
payload = {'name': event_name}
if tags:
payload.update(tags)
try:
response = requests.post(
f'https://app.eventicat.com/api/event?_id={aggregator_id}',
headers={
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
},
json=payload,
timeout=5
)
response.raise_for_status()
except requests.RequestException as e:
# Log error but don't break user flow
print(f"Analytics error: {e}")
# views.py
from .utils.analytics import track_event
def signup_view(request):
# ... handle signup ...
track_event('user_signup', {'source': 'web'})
PHP
Helper Function
<?php
function sendEvent($eventName, $tags = []) {
$aggregatorId = getenv('EVENTICAT_AGGREGATOR_ID');
$apiKey = getenv('EVENTICAT_API_KEY');
$payload = array_merge(['name' => $eventName], $tags);
$ch = curl_init("https://app.eventicat.com/api/event?_id={$aggregatorId}");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 201) {
throw new Exception("Failed to send event: HTTP {$httpCode}");
}
return json_decode($response, true);
}
Usage
<?php
// Simple event
sendEvent('user_signup');
// Event with tags
sendEvent('purchase_completed', [
'plan' => 'pro',
'region' => 'us-east'
]);
Laravel Integration
<?php
// app/Services/EventicatService.php
namespace App\Services;
use Illuminate\Support\Facades\Http;
class EventicatService
{
public function track(string $eventName, array $tags = []): void
{
$aggregatorId = config('services.eventicat.aggregator_id');
$apiKey = config('services.eventicat.api_key');
try {
Http::withHeaders([
'Authorization' => "Bearer {$apiKey}",
'Content-Type' => 'application/json'
])->post("https://app.eventicat.com/api/event?_id={$aggregatorId}", [
'name' => $eventName,
...$tags
])->throw();
} catch (\Exception $e) {
// Log error but don't break user flow
logger()->error("Eventicat tracking error: {$e->getMessage()}");
}
}
}
// Usage in controller
use App\Services\EventicatService;
class UserController extends Controller
{
public function store(Request $request, EventicatService $eventicat)
{
// ... create user ...
$eventicat->track('user_signup', [
'source' => $request->input('source', 'web')
]);
}
}
Ruby
Helper Function
require 'net/http'
require 'json'
require 'uri'
def send_event(event_name, tags = {})
aggregator_id = ENV['EVENTICAT_AGGREGATOR_ID']
api_key = ENV['EVENTICAT_API_KEY']
uri = URI("https://app.eventicat.com/api/event?_id=#{aggregator_id}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{api_key}"
request['Content-Type'] = 'application/json'
request.body = { name: event_name }.merge(tags).to_json
response = http.request(request)
raise "Failed to send event: #{response.code}" unless response.code == '201'
JSON.parse(response.body)
end
Usage
# Simple event
send_event('user_signup')
# Event with tags
send_event('purchase_completed', {
plan: 'pro',
region: 'us-east'
})
Rails Integration
# app/services/eventicat_service.rb
class EventicatService
def self.track(event_name, tags = {})
aggregator_id = Rails.application.credentials.eventicat[:aggregator_id]
api_key = Rails.application.credentials.eventicat[:api_key]
uri = URI("https://app.eventicat.com/api/event?_id=#{aggregator_id}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{api_key}"
request['Content-Type'] = 'application/json'
request.body = { name: event_name }.merge(tags).to_json
response = http.request(request)
Rails.logger.error("Eventicat error: #{response.code}") unless response.code == '201'
rescue StandardError => e
Rails.logger.error("Eventicat error: #{e.message}")
end
end
# Usage in controller
class UsersController < ApplicationController
def create
# ... create user ...
EventicatService.track('user_signup', source: 'web')
end
end
Go
Helper Function
package eventicat
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
type EventPayload struct {
Name string `json:"name"`
Tags map[string]interface{} `json:",inline"`
}
func SendEvent(eventName string, tags map[string]interface{}) error {
aggregatorID := os.Getenv("EVENTICAT_AGGREGATOR_ID")
apiKey := os.Getenv("EVENTICAT_API_KEY")
payload := EventPayload{
Name: eventName,
Tags: tags,
}
if payload.Tags == nil {
payload.Tags = make(map[string]interface{})
}
jsonData, err := json.Marshal(payload)
if err != nil {
return fmt.Errorf("failed to marshal payload: %w", err)
}
url := fmt.Sprintf("https://app.eventicat.com/api/event?_id=%s", aggregatorID)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("failed to create request: %w", err)
}
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("failed to send request: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusCreated {
return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
}
return nil
}
Usage
package main
import (
"log"
"yourapp/eventicat"
)
func main() {
// Simple event
err := eventicat.SendEvent("user_signup", nil)
if err != nil {
log.Printf("Failed to track event: %v", err)
}
// Event with tags
err = eventicat.SendEvent("purchase_completed", map[string]interface{}{
"plan": "pro",
"region": "us-east",
})
if err != nil {
log.Printf("Failed to track event: %v", err)
}
}
Rust
Helper Function
use reqwest;
use serde_json::json;
use std::collections::HashMap;
use std::env;
pub async fn send_event(
event_name: &str,
tags: Option<HashMap<String, String>>
) -> Result<(), Box<dyn std::error::Error>> {
let aggregator_id = env::var("EVENTICAT_AGGREGATOR_ID")?;
let api_key = env::var("EVENTICAT_API_KEY")?;
let url = format!("https://app.eventicat.com/api/event?_id={}", aggregator_id);
let mut payload = json!({
"name": event_name
});
if let Some(tags_map) = tags {
for (key, value) in tags_map {
payload[key] = json!(value);
}
}
let client = reqwest::Client::new();
let response = client
.post(&url)
.header("Authorization", format!("Bearer {}", api_key))
.header("Content-Type", "application/json")
.json(&payload)
.send()
.await?;
if !response.status().is_success() {
return Err(format!("Failed with status: {}", response.status()).into());
}
Ok(())
}
Usage
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Simple event
send_event("user_signup", None).await?;
// Event with tags
let mut tags = HashMap::new();
tags.insert("plan".to_string(), "pro".to_string());
tags.insert("region".to_string(), "us-east".to_string());
send_event("purchase_completed", Some(tags)).await?;
Ok(())
}
Best Practices
Error Handling
Always handle errors gracefully. Analytics should never break your user's experience:
// Good: Silent failure with logging
async function sendEvent(eventName, tags = {}) {
try {
const response = await fetch(/* ... */);
if (!response.ok) {
console.error('Event tracking failed:', response.statusText);
}
} catch (error) {
console.error('Event tracking error:', error);
}
}
Timeouts
Set reasonable timeouts to prevent slow analytics from blocking your application:
# Python with timeout
response = requests.post(
url,
headers=headers,
json=payload,
timeout=5 # 5 second timeout
)
Async Tracking
For better performance, send events asynchronously:
// Fire and forget
sendEvent('page_view').catch(err => console.error(err));
// Don't await in request handlers
app.post('/signup', async (req, res) => {
const user = await createUser(req.body);
sendEvent('user_signup'); // No await
res.json({ success: true });
});
Environment Configuration
Use .env files for local development:
# .env
EVENTICAT_AGGREGATOR_ID=your_aggregator_id
EVENTICAT_API_KEY=your_api_key
For production, use your platform's secret management:
- Vercel/Netlify: Environment variables in dashboard
- AWS: Systems Manager Parameter Store or Secrets Manager
- Docker:
--env-fileor secrets - Kubernetes: ConfigMaps and Secrets
Next Steps
- Event Tags - Learn how to use tags for better filtering
- Rate Limits - Understand rate limiting
- Authentication - Review authentication methods