• Created in public
  • Governed by the community
  • Owned by no vendor

Implement the standard

Point an agent or tool at two JSON documents. Everything it needs to generate a conforming UTM is in them.

Step 1

Endpoints

  • https://www.schemafirst.org/standards/utm/standard.jsonLatest standard in this major version
  • https://www.schemafirst.org/standards/utm/0.1Pinned to version 0.1 — use in production
  • https://www.schemafirst.org/standards/utm/sources/index.jsonRegistry index
  • https://www.schemafirst.org/standards/utm/sources/{source}.jsonIndividual source record

All endpoints are public, CORS-enabled, and served as JSON.

Step 2

Agent instruction

Add this to a system prompt or tool description. The agent fetches the standard and follows it.

instruction.txt
Generate UTM parameters using the SchemaFirst UTM Standard 0.1.0.

Standard: https://www.schemafirst.org/standards/utm/standard.json
Source Registry: https://www.schemafirst.org/standards/utm/sources/index.json

Rules:
- Require campaign, source, and distribution_context. If any is missing, return
  {"status": "requires_context", "missing": [...]} and do not guess.
- Resolve source against the registry's canonical_source and aliases.
- utm_source and utm_medium come only from the resolved source record.
- utm_campaign = campaign.slug if present, otherwise slugify campaign.name.
- Do not add source, medium, platform, creative, audience, or dates to utm_campaign.
- Set other utm_* parameters only from supplied inputs.

Step 3

Conformance cases

A conforming implementation produces exactly these outputs. They are computed from the published standard.

  • Organic social

    Input
    {
      "campaign": {
        "name": "Spring Product Launch"
      },
      "source": "linkedin",
      "distribution_context": "organic",
      "destination_url": "https://example.com/product"
    }
    Expected output
    {
      "status": "ok",
      "standard_version": "0.1.0",
      "parameters": {
        "utm_source": "linkedin",
        "utm_medium": "social",
        "utm_campaign": "spring_product_launch"
      },
      "url": "https://example.com/product?utm_source=linkedin&utm_medium=social&utm_campaign=spring_product_launch"
    }
  • Alias resolves to canonical source

    Input
    {
      "campaign": {
        "slug": "spring_product_launch"
      },
      "source": "fb",
      "distribution_context": "paid"
    }
    Expected output
    {
      "status": "ok",
      "standard_version": "0.1.0",
      "parameters": {
        "utm_source": "facebook",
        "utm_medium": "paid_social",
        "utm_campaign": "spring_product_launch"
      }
    }
  • Existing UTMs are replaced, other params kept

    Input
    {
      "campaign": {
        "name": "Spring Product Launch"
      },
      "source": "email",
      "distribution_context": "owned",
      "destination_url": "https://example.com/product?ref=nav&utm_source=old#pricing"
    }
    Expected output
    {
      "status": "ok",
      "standard_version": "0.1.0",
      "parameters": {
        "utm_source": "email",
        "utm_medium": "email",
        "utm_campaign": "spring_product_launch"
      },
      "url": "https://example.com/product?ref=nav&utm_source=email&utm_medium=email&utm_campaign=spring_product_launch#pricing"
    }
  • Missing context

    Input
    {
      "campaign": {
        "name": "Spring Product Launch"
      },
      "source": "linkedin"
    }
    Expected output
    {
      "status": "requires_context",
      "missing": [
        "distribution_context"
      ]
    }
  • Unsupported context

    Input
    {
      "campaign": {
        "name": "Spring Product Launch"
      },
      "source": "sms",
      "distribution_context": "paid"
    }
    Expected output
    {
      "status": "unsupported_context",
      "source": "sms",
      "supported": [
        "owned"
      ]
    }