GET
https://jmpy.me/api/v1
/
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

days
integer
default:30
Number of days to include in analytics (1-365).
utmParameter
string
default:"source"
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 keywords
  • content - Specific ad or link variation
qrCodeId
string
default:"all"
Filter by specific QR code UUID, or use all for all QR codes.

Response

data
object
UTM analytics data.
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

# 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"

Response Examples

{
  "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"
      }
    }
  }
}

Use Cases

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}`);
}
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")
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'
    }
  };
}