Agile Analytics for Azure DevOps — Privacy Policy

Last updated: August 12, 2026

Overview

Agile Analytics (“the Extension”) is an Azure DevOps extension published by Baytek Software (“Baytek”, “we”, “us”). It processes Azure DevOps data inside the customer's browser to render dashboards and reports. This policy explains what data the Extension touches, where it goes, and what Baytek stores on its own systems.

1. Data the Extension reads from Azure DevOps

The Extension uses read-only Azure DevOps scopes (vso.project, vso.work, vso.graph, vso.build). With those scopes, the Extension reads, on demand:

  • project, team, sprint, and iteration metadata
  • work item fields and revision history needed for analytics
  • build and pipeline metadata (runs, results, timings) whenever a DORA view, widget, or Configuration → DORA is opened; the opt-in deploy-linked measurement additionally reads the work items linked to each pipeline run
  • group and membership info needed for Access Control

This data stays in the customer's browser. It is not sent to Baytek.

2. Data persisted in the customer's Azure DevOps tenant

Configuration and per-user preferences are persisted via Microsoft's Azure DevOps Extension Data Service. This storage is hosted by Microsoft and scoped to the customer's organization. Baytek does not host or have access to it.

This includes:

  • extension configuration (workflow mappings, WIP limits, sprint alerts, notifications, ACL)
  • per-user UI preferences
  • GitHub organization name and Personal Access Token for the GitHub Copilot Metrics integration (org admins only — see “AI integrations” below)
  • License activation token and license summary (cached locally so the Extension can revalidate)

3. Data Baytek stores on its own systems

Baytek operates a backend at https://ado-analytics.baytekdev.com that handles licensing and a small set of contact-form / telemetry events. The following data is stored on Baytek-controlled systems:

  • License records: Azure DevOps organization name, ADO organization ID, plan, expiry, status, activation tokens issued by Baytek
  • Seat roster (organizations using assigned-seat access control only): opaque Azure DevOps identity descriptors of the users assigned a seat. No names or email addresses — the descriptor format we accept cannot decode to one. Used only to enforce seat assignments
  • Org install / heartbeat events: organization name, ADO organization ID, extension version, event type (INSTALLED / HEARTBEAT / UNINSTALLED), and timestamps. Used to count active installs and identify orgs whose extension stops loading
  • Usage and error telemetry (opt-out available): ten event types — view_opened (which view was opened), feature_used (which feature was used), error_observed (a graded error category, never the error text itself), session_started (a session-start marker), config_event (a configuration change), license_activated, purchase_flow_opened, team_count_reported, trial_day_milestone, and workflow_mapping_completed — plus extension version, your Azure DevOps organization ID, and a pseudonymous user identifier — your Azure DevOps user GUID, never your name or email — used to count distinct active users per organization and, on seat-limited plans, to enforce seat limits. Any licensed user in the organisation can turn this off for the whole organisation (Configuration → Privacy); doing so does not affect the org-installation heartbeat above, which is required for licensing to keep working. Never work item content
  • Trial-contact submissions (optional, opt-in): an admin email address submitted via the in-extension reminder prompt, plus the org name and ADO organization ID. Used only to send day-23 / day-28 trial-end reminders
  • Ask Henry contact-form submissions: if you use the Ask Henry form on this website, we store your message, your email address, your answers to the form's questions, and — when you arrive from a link that carries them — your Azure DevOps organization name and extension version. Used only to reply to you; never for marketing. Screenshots you attach are delivered to us by email and are not stored on our systems
  • Payment metadata via Stripe (sub-processor): Stripe holds payment instrument data; Baytek never receives raw card numbers
  • Workflow auto-discovery diagnostics(added v6.14.0, opt-out at Configuration → Privacy): four new event types help us measure how well auto-discovery classifies the Azure DevOps workflow state names a customer's organization uses. All payloads are PII-free counts, enum-valued bucket labels (one of seven workflow buckets: new, queued, in_progress, test, review, done, waiting), and the detected locale code (en, es, pt, it, de, fr). Workflow state names themselves are never sent.
    • workflow-auto-discovery-inference-failed— fires when auto-discovery ran against the org's real Azure DevOps state names but couldn't classify one or more of them. Payload: { unmatchedStateCount, totalStateCount, extensionVersion, possibleLanguage }.
    • workflow-keyword-auto-learned — fires when an admin drags a previously unrecognised state into a workflow bucket on the Workflow Mapping tab, so future auto-discovery on this org respects that choice. Payload: { bucket } only — never the state name itself.
    • workflow-mapping-rediscovery-prompted — fires once per organisation when an existing customer is shown the one-time opt-in re-discovery prompt (no mapping changes are made until the customer confirms). Payload: { unmatchedStateCount }.
    • workflow-mapping-rediscovery-confirmed — fires once per organisation if the customer accepts the re-discovery prompt. Payload: { delta } (count of states the new inference reclassified).
  • Anonymized peer benchmarks (optional, opt-in, off by default): if an org admin turns on Industry Benchmarks, the Extension sends Baytek a small, anonymized snapshot of aggregate delivery metrics — cycle time, throughput, and sprint-completion percentage as rounded numbers — together with a coarse team-size bucket (e.g. 6–15) and methodology (Scrum / Kanban). We neverreceive work-item titles, IDs, descriptions, names, project or team names, or your raw team head-count. Snapshots are pooled into peer groups; a group's benchmark is only ever shown once at least five organisations contribute, and only rounded percentile ranges are shared back — never another organisation's individual numbers. You can turn Benchmarks off at any time on the Benchmarks panel, which deletes your contributed snapshot.
  • Scheduled report delivery (optional, opt-in, off by default): if a licensed user sets up a Scheduled Report, a pipeline running in the customer's own Azure DevOps computes a small digest of aggregateteam metrics — items delivered, WIP count, bugs opened/closed, average cycle time, plus the sprint name and reporting period — and sends it to Baytek's delivery service, which renders it into an email, delivers it, and discards the content. Report content is never stored; we keep only delivery counters (timestamp, recipient count, payload size). Recipients must confirm by email before anything is delivered (double opt-in), every report email carries a one-click unsubscribe link, and recipient addresses are stored only to perform delivery. Deleting a subscription deletes its recipient list.

Baytek does not receive Azure DevOps work item content, AI prompts, AI responses, or AI provider API keys. Sprint data stays in your tenant, with one narrow exception: the opt-in Scheduled Reports digest described above, which passes through our delivery service transiently and is never stored.

4. AI integrations (optional, off by default)

If an organization admin connects the GitHub Copilot Metrics integration (Configuration → GitHub Copilot) with a GitHub organization name and a GitHub Personal Access Token:

  • The GitHub organization name and token are stored in the customer's own Azure DevOps Extension Data Service (org-scoped). Baytek does not receive them.
  • Copilot usage and seat data is read from the customer's browser directly against api.github.com. Baytek's backend is not in the request path.
  • Aggregate suggestion and acceptance counts, plus the connected organisation's Copilot seat list — each seat's GitHub username and last-activity timestamp — are read into the browser. Never source code, file contents, or Copilot chat or suggestion text.

5. Webhook integrations (optional)

If notifications are enabled, the Extension posts alert payloads from the customer's browser directly to the configured Microsoft Teams or Slack webhook URL. Hostnames are restricted to approved provider domains. Baytek's backend is not in the request path.

6. Sub-processors

Sub-processorPurposeData shared
Microsoft Azure DevOpsHosts the customer's tenant + Extension Data ServiceCustomer-controlled
Stripe (Stripe, Inc.)Payment processing and payment-related receipts / subscription notificationsBilling details for purchasers only
Google Firebase / Cloud SQL (Google LLC)Hosts ado-analytics.baytekdev.com backend (database and serverless runtime)License records, activation tokens, install/heartbeat telemetry, opt-in trial-contact emails
Zoho Mail (Zoho Corporation Pvt. Ltd.)Custom-domain email — sends license-key delivery and trial-end remindersRecipient email address and organization name

7. Data retention

  • License records: retained for the life of the customer's account plus 7 years for tax / contract reasons
  • Payment notifications: Stripe notifies us of each payment and subscription change. The full content of that notification, which includes the billing email address, is erased after 13 months. A minimal record of the notification is kept after that (its type, our processing status and the timestamps, with no personal data) so that a notification Stripe re-sends is never acted on twice
  • Seat roster: retained until the seat is unassigned or a deletion request is received
  • Activation tokens: rotated on each successful re-validation (every ~12 hours of active use). Revoked tokens are retained for 90 days for audit
  • Org install / heartbeat events: aggregated; raw events retained 13 months
  • Usage and error telemetry: raw events retained 90 days
  • Trial-contact email: retained until the trial ends or the recipient requests deletion (max 90 days post-trial)
  • Ask Henry form submissions: retained so we can reply and keep context for follow-up questions; deleted on request (email support)
  • Benchmark snapshots: one current snapshot per opted-in org; deleted immediately on opt-out, and on uninstall via the next aggregation run

8. Security controls

  • HTTPS is required for all outbound traffic
  • Read-only Azure DevOps scopes (vso.project, vso.work, vso.graph, vso.build) — the Extension cannot modify work items, pipelines, or repository content
  • The GitHub Personal Access Token for Copilot Metrics is stored as a password-type field and never logged
  • License activation tokens are bearer credentials and are not logged
  • Content-Security-Policy on the Extension's iframe restricts outbound connections to known endpoints

9. Your rights and choices

You can:

  • disable optional AI integrations and notifications
  • request deletion of any trial-contact email, Ask Henry form submission, or license-related contact data by emailing support
  • uninstall the Extension; this removes it from the ADO tenant. License records are retained per the retention policy above

10. Changes to this policy

We may update this Privacy Policy from time to time. Material changes will be reflected in the “Last updated” date above. Continued use of the Extension after changes constitutes acceptance.

11. Contact

For privacy-related questions, deletion requests, or data-protection rights:

12. Data protection rights (GDPR / CCPA)

If you are in the EU / EEA, UK, or California, you have rights under GDPR, UK GDPR, and CCPA, including access, rectification, erasure, restriction, portability, and objection. Most of these rights can be exercised by:

  • uninstalling the Extension (clears the customer-tenant data); or
  • emailing support@baytekdev.com for deletion of any Baytek-held license or trial-contact records

Baytek responds to verified requests within 30 days as required by applicable law.