UTM Campaign Analytics
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/utm \
--header 'Authorization: Bearer <token>'{
"data": {
"utmParameter": "<string>",
"utmData": [
{
"utm_[parameter]": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123,
"qrCodes": [
{}
]
}
],
"totals": {
"totalScans": 123,
"totalUniqueScanners": 123,
"uniqueValues": 123
},
"period": {
"days": 123,
"startDate": "<string>",
"endDate": "<string>"
}
}
}QR Code Analytics
UTM Campaign Analytics
Get UTM campaign analytics for QR code scans
GET
/
qranalytics
/
utm
UTM Campaign Analytics
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/utm \
--header 'Authorization: Bearer <token>'{
"data": {
"utmParameter": "<string>",
"utmData": [
{
"utm_[parameter]": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123,
"qrCodes": [
{}
]
}
],
"totals": {
"totalScans": 123,
"totalUniqueScanners": 123,
"uniqueValues": 123
},
"period": {
"days": 123,
"startDate": "<string>",
"endDate": "<string>"
}
}
}Get UTM campaign analytics for your QR code scans. Track the effectiveness of your marketing campaigns by analyzing which UTM sources, mediums, or campaigns drive the most scans.
UTM parameters (Urchin Tracking Module) are URL parameters used to track the effectiveness of marketing campaigns. Common parameters include
utm_source, utm_medium, utm_campaign, utm_term, and utm_content.Query Parameters
Number of days to include in analytics (1-365).
UTM parameter to group data by:
source- Where the traffic originates (e.g., google, facebook, newsletter)medium- Marketing medium (e.g., email, cpc, social)campaign- Campaign name (e.g., spring_sale, product_launch)term- Paid search keywordscontent- Specific ad or link variation
Filter by specific QR code UUID, or use
all for all QR codes.Response
UTM analytics data.
Show UTM Data Object
Show UTM Data Object
The UTM parameter that was queried.
Array of UTM values with scan data.
Show UTM Value Object
Show UTM Value Object
The UTM value (field name matches the queried parameter, e.g.,
utm_source).Number of scans with this UTM value.
Number of unique visitors with this UTM value.
Percentage of total scans.
QR codes associated with this UTM value.
UTM analytics may be restricted based on your plan. Users on free plans may have limited access to UTM tracking. Upgrade to access full campaign analytics.
Request Examples
- cURL
- Node.js
- TypeScript
- Python
- PHP
- Go
- Java
# Get UTM source analytics for last 30 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&days=30" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get UTM campaign analytics
curl -X GET "https://jmpy.me/api/v1/qranalytics/utm?utmParameter=campaign&days=90" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get UTM analytics for a specific QR code
curl -X GET "https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&qrCodeId=550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
// Get UTM source breakdown
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&days=30',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const { data } = await response.json();
console.log('UTM Source Analytics:');
data.data.utmData.forEach(item => {
console.log(` ${item.utm_source}: ${item.scans} scans (${item.percentage}%)`);
});
console.log(`\nTotal: ${data.data.totals.totalScans} scans`);
console.log(`Unique values: ${data.data.totals.uniqueValues}`);
import axios from 'axios';
interface UTMAnalytics {
data: {
utmParameter: string;
utmData: Array<{
[key: string]: string | number | Array<any>;
scans: number;
uniqueScanners: number;
percentage: number;
qrCodes: Array<{ qr_id: string; qr_name: string; scans: number }>;
}>;
totals: {
totalScans: number;
totalUniqueScanners: number;
uniqueValues: number;
};
period: {
days: number;
startDate: string;
endDate: string;
};
};
}
const response = await axios.get<{ success: boolean; data: UTMAnalytics }>(
'https://jmpy.me/api/v1/qranalytics/utm',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: {
utmParameter: 'source',
days: 30
}
}
);
const utmData = response.data.data.data;
console.log(`Analyzing UTM ${utmData.utmParameter}`);
console.log(`Total scans with UTM: ${utmData.totals.totalScans}`);
import requests
# Get UTM campaign analytics
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/utm',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'utmParameter': 'campaign',
'days': 30
}
)
data = response.json()['data']['data']
print(f"UTM {data['utmParameter']} Analytics:")
print(f"Period: {data['period']['days']} days")
print()
for item in data['utmData']:
campaign = item.get('utm_campaign', 'Unknown')
print(f"Campaign: {campaign}")
print(f" Scans: {item['scans']} ({item['percentage']}%)")
print(f" Unique: {item['uniqueScanners']}")
print()
print(f"Total: {data['totals']['totalScans']} scans")
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jmpy.me/api/v1/qranalytics/utm', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'utmParameter' => 'source',
'days' => 30
]
]);
$data = json_decode($response->getBody(), true)['data']['data'];
echo "UTM Source Analytics:\n";
foreach ($data['utmData'] as $item) {
$source = $item['utm_source'];
echo " {$source}: {$item['scans']} scans ({$item['percentage']}%)\n";
}
echo "\nTotal: {$data['totals']['totalScans']} scans\n";
?>
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://jmpy.me/api/v1/qranalytics/utm"
params := url.Values{}
params.Add("utmParameter", "source")
params.Add("days", "30")
req, _ := http.NewRequest("GET", baseURL+"?"+params.Encode(), nil)
req.Header.Add("Authorization", "Bearer YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.URI;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
String url = "https://jmpy.me/api/v1/qranalytics/utm" +
"?utmParameter=source&days=30";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Bearer YOUR_API_KEY")
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Response Examples
- 200 OK
- 401 Unauthorized
- 403 Feature Disabled
{
"success": true,
"data": {
"data": {
"utmParameter": "source",
"utmData": [
{
"utm_source": "facebook",
"scans": 456,
"uniqueScanners": 380,
"percentage": 35.2,
"qrCodes": [
{
"qr_id": "550e8400-e29b-41d4-a716-446655440000",
"qr_name": "Product Launch",
"short_code": "abc123",
"scans": 234
}
]
},
{
"utm_source": "google",
"scans": 312,
"uniqueScanners": 260,
"percentage": 24.1,
"qrCodes": [
{
"qr_id": "660e8400-e29b-41d4-a716-446655440001",
"qr_name": "Store Display",
"short_code": "def456",
"scans": 189
}
]
},
{
"utm_source": "email",
"scans": 234,
"uniqueScanners": 190,
"percentage": 18.1,
"qrCodes": []
},
{
"utm_source": "linkedin",
"scans": 156,
"uniqueScanners": 130,
"percentage": 12.0,
"qrCodes": []
}
],
"totals": {
"totalScans": 1296,
"totalUniqueScanners": 1050,
"uniqueValues": 5
},
"period": {
"days": 30,
"startDate": "2024-12-08T00:00:00Z",
"endDate": "2025-01-07T15:30:00Z"
}
}
}
}
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "User authentication required"
}
}
{
"success": false,
"error": {
"code": "FEATURE_DISABLED",
"message": "UTM analytics is not available on your current plan",
"details": {
"feature": "UTM analytics",
"currentPlan": "Free"
}
}
}
Use Cases
Compare marketing channels
Compare marketing channels
Analyze which marketing channels drive the most QR engagement.
async function compareChannels() {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/utm?utmParameter=medium&days=30',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const channels = data.data.utmData.map(item => ({
channel: item.utm_medium,
scans: item.scans,
unique: item.uniqueScanners,
conversionRate: (item.uniqueScanners / item.scans * 100).toFixed(1) + '%'
}));
console.log('Channel Performance:');
channels.forEach(ch => {
console.log(`${ch.channel}: ${ch.scans} scans (${ch.unique} unique)`);
});
// Find best performing
const best = channels.sort((a, b) => b.scans - a.scans)[0];
console.log(`\nBest channel: ${best.channel}`);
}
Track campaign ROI
Track campaign ROI
Monitor specific campaign performance for ROI calculations.
import requests
def track_campaign_roi(campaign_name, cost_per_scan_target=0.10):
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/utm',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'utmParameter': 'campaign',
'days': 30
}
)
data = response.json()['data']['data']
# Find specific campaign
campaign = next(
(c for c in data['utmData'] if c.get('utm_campaign') == campaign_name),
None
)
if not campaign:
print(f"Campaign '{campaign_name}' not found")
return
print(f"Campaign: {campaign_name}")
print(f"Total Scans: {campaign['scans']}")
print(f"Unique Visitors: {campaign['uniqueScanners']}")
print(f"Share of Traffic: {campaign['percentage']}%")
# Calculate cost effectiveness
# If you spent $100 on this campaign
budget = 100
cost_per_scan = budget / campaign['scans'] if campaign['scans'] > 0 else 0
print(f"\nCost per Scan: ${cost_per_scan:.2f}")
print(f"Target: ${cost_per_scan_target:.2f}")
if cost_per_scan <= cost_per_scan_target:
print("✅ Campaign is cost-effective!")
else:
print("⚠️ Campaign exceeds target cost per scan")
Build UTM dashboard
Build UTM dashboard
Create a comprehensive UTM analytics dashboard.
interface UTMDashboard {
sources: any[];
mediums: any[];
campaigns: any[];
summary: {
totalTracked: number;
topSource: string;
topCampaign: string;
};
}
async function buildUTMDashboard(): Promise<UTMDashboard> {
const [sources, mediums, campaigns] = await Promise.all([
fetch('https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&days=30', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(r => r.json()),
fetch('https://jmpy.me/api/v1/qranalytics/utm?utmParameter=medium&days=30', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(r => r.json()),
fetch('https://jmpy.me/api/v1/qranalytics/utm?utmParameter=campaign&days=30', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(r => r.json())
]);
return {
sources: sources.data.data.utmData,
mediums: mediums.data.data.utmData,
campaigns: campaigns.data.data.utmData,
summary: {
totalTracked: sources.data.data.totals.totalScans,
topSource: sources.data.data.utmData[0]?.utm_source || 'N/A',
topCampaign: campaigns.data.data.utmData[0]?.utm_campaign || 'N/A'
}
};
}
Related Endpoints
Traffic Sources
Get traffic source and referrer analytics
Analytics Overview
Get aggregated summary statistics
Scans Timeline
Get time-series scan data
Create Short URL
Create URLs with UTM parameters
⌘I