> ## Agent Instructions > Spur is an AI-powered QA engineer that lets teams create and run automated end-to-end tests for web and mobile apps using natural language. > When answering questions about Spur, cite the relevant page from docs.spurtest.com. # Contact Us Source: https://docs.spurtest.com/additional-resources/contact-us Get in touch with the Spur team for support, questions, or feedback. ## Your Dedicated Account Manager Every Spur account comes with a dedicated account manager. They are your primary point of contact for onboarding, technical questions, and ongoing support. If you are unsure who your account manager is, reach out to us at **[founders@tryspur.dev](mailto:founders@tryspur.dev)** and we will connect you. ## Direct Line of Communication We keep communication fast and direct. Depending on your preference, you can reach us through: Chat with us directly through Google Workspace for quick questions and async communication. Message your account manager on WhatsApp for real-time support. Join a shared Slack channel with the Spur team for collaborative support. Reach out to us at **[founders@tryspur.dev](mailto:founders@tryspur.dev)** for any questions or requests. ## Other Resources Visit spurtest.com to learn more about Spur. Want a walkthrough of Spur? Book a demo with our team. Follow us on LinkedIn for updates and to connect with the team. # Deep Links Source: https://docs.spurtest.com/additional-resources/deep-links Use deep links in Spur to navigate directly to specific screens in your mobile app during testing. Deep links are URLs that navigate directly to a specific screen within a mobile app, bypassing the normal navigation flow. Instead of tapping through multiple screens to reach a destination, a deep link takes you straight there. The most common type is a **URI scheme** — a custom protocol registered by the app (e.g., `myapp://products/12345`). This is the primary method used in Spur. ## Why Use Deep Links in Tests? * **Skip repetitive navigation** — Jump straight to the screen you want to test instead of tapping through five screens to get there. * **Isolate test scope** — Test a specific feature without coupling to login and browsing flows. * **Test deep link behavior** — Verify that your app correctly handles incoming deep links. ## How It Works In native mobile tests, Spur triggers deep links using a [JavaScript injection](/authoring-tests/test-side-peek/step-types/javascript) step with the `[Deeplink]` label. You can add this step through the native commands UI in the test editor. To find your app's URI scheme, ask your development team or check the app's configuration files (`Info.plist` on iOS, `AndroidManifest.xml` on Android). ## Example Screenshot2026 03 05at2 52 46PM This test deep links from the home screen directly to a product collection page: ```text theme={null} Wait for the app to load If "Sign In" is displayed, tap Sign In and log in. Otherwise, skip this step. Navigate to the home page Cached Action: [Deeplink] {{ window.location = 'myapp://collections/womens-shop-all'; }} Wait 2 seconds Verify that "Women's Shop All" is displayed ``` The URI scheme `myapp://` routes to the app, and the path `collections/womens-shop-all` tells it which screen to display. Always add a **wait** or **verify** step after a deep link to give the app time to load the target screen. ## Best Practices * Use the [recommended starting template](/getting-started/mobile-prompting#recommended-test-starting-template) to handle login and popups before triggering the deep link. * Always verify the expected screen loaded after the deep link. * If a test starts failing after an app update, check whether the URI scheme or path has changed. ## Related Resources * [Mobile Prompting Guide](/getting-started/mobile-prompting) — Best practices for writing native mobile test steps * [JavaScript Injection](/authoring-tests/test-side-peek/step-types/javascript) — The `Cached Action` step type used for deep links # IP Whitelisting Source: https://docs.spurtest.com/additional-resources/ip-whitelisting Allow Spur agent to access your application by whitelisting our IP addresses. ## Why Whitelist Spur's IPs? Spur runs automated browser tests against your application from our cloud infrastructure. If your staging, development, or production environment is behind a firewall, VPN, or IP-restricted access layer, you need to allow traffic from Spur's IP addresses so that tests can reach your application. If Spur's IPs are not whitelisted, test runs will fail with connection or timeout errors because our test runners cannot reach your application. ## Spur IP Addresses Contact the Spur team to get the current list of IP addresses you need to whitelist. Reach out to the Spur team to request the IP addresses for your allowlist. ## How to Whitelist The exact steps depend on where your application is hosted. Below are instructions for common providers. Go to the [EC2 Console](https://console.aws.amazon.com/ec2/) and select **Security Groups** from the left sidebar. Find and click the security group attached to your application's instance or load balancer. Click **Edit inbound rules** and add a new rule: * **Type:** HTTPS (port 443) or HTTP (port 80), depending on your setup * **Source:** Custom, then enter each Spur IP address * **Description:** Spur test runners Click **Save rules**. Changes take effect immediately. Go to the [VPC Firewall Rules](https://console.cloud.google.com/networking/firewalls) page in the Google Cloud Console. Click **Create Firewall Rule** and configure: * **Name:** `allow-spur-test-runners` * **Direction:** Ingress * **Targets:** Select the target tags or service accounts for your application * **Source IP ranges:** Enter each Spur IP address * **Protocols and ports:** Allow TCP on port 443 (and 80 if needed) Click **Create**. The rule applies within a few seconds. Go to **Network Security Groups** in the [Azure Portal](https://portal.azure.com/). Click the NSG associated with your application's subnet or network interface. Go to **Inbound security rules** and click **Add**: * **Source:** IP Addresses * **Source IP addresses:** Enter each Spur IP address (comma-separated) * **Destination port ranges:** 443 (and 80 if needed) * **Protocol:** TCP * **Action:** Allow * **Name:** `AllowSpurTestRunners` Click **Add**. The rule takes effect shortly. Most modern hosting platforms like Vercel, Netlify, and Cloudflare do not block incoming traffic by default. If you have configured IP-based access restrictions (such as Cloudflare Access or Vercel's IP allowlisting), add Spur's IP addresses to your allowlist through that platform's dashboard. If you manage access control at the web server level, add Spur's IPs to your configuration. **Nginx** — add inside your `server` or `location` block: ```nginx theme={null} allow ; allow ; # Add all IPs provided by the Spur team ``` **Apache** — add inside your `` or `` block: ```apache theme={null} Require ip Require ip # Add all IPs provided by the Spur team ``` Reload your web server after making changes. ## Verifying the Setup After whitelisting, run a quick test from Spur to confirm connectivity: Navigate to any existing test or create a new one that targets the environment behind your firewall. Execute the test. If the first step (navigating to your URL) completes successfully, whitelisting is working. If the test fails with a timeout or connection error: * Confirm the correct IPs are whitelisted * Check that the allowed ports match your application (443, 80, or a custom port) * Verify there are no additional layers (VPN, WAF, CDN) that also require allowlisting If your infrastructure uses a Web Application Firewall (WAF) in addition to network-level rules, you may need to add Spur's IPs to both the WAF allowlist and your firewall rules. ## What Spur Does NOT Access Spur operates strictly at the browser/UI layer. We never touch the systems behind your application. No access to your source code, repositories, or build systems. No access to back-end systems, databases, or internal infrastructure. Nothing beyond the browser/UI layer — no software is installed on your systems. No customer PII is collected or stored beyond the test data you provide. ## Security Posture Full details and reports available in our [**Trust Center**](https://app.vanta.com/tryspur.dev/trust/6bd89ygtkuvxrvbm0v6huw). Easy to scope and to exclude from your analytics. Data encrypted in transit and at rest; access limited to the surfaces you designate. Access is revocable instantly, at any time, by you. # Network & Console Monitoring Source: https://docs.spurtest.com/additional-resources/network-console-monitoring Use Log steps to assert against network requests and console logs during test execution. The Log step lets you validate what happens behind the scenes during a test run. Instead of checking what the user sees on screen (that's what [Verify](/authoring-tests/test-side-peek/step-types/verify) does), Log steps assert against **network requests** and **browser console output** — giving you visibility into API calls, error messages, and other under-the-hood behavior. You describe what you expect in plain language, and the Spur agent intelligently searches through the captured data to verify your assertion. It returns the matching evidence — the endpoint, a data snippet, and timestamp — so you can see exactly what it found. To learn how to add a Log step to your tests, see the [Log Step](/authoring-tests/test-side-peek/step-types/log/log-assertions) guide. ## Understanding the Result When a Log step completes, Spur expands the result to show exactly how it verified your assertion. Here's what each part means: * **Reasoning** — The agent restates your assertion to confirm what it set out to verify. * **Verification Analysis** — The agent breaks your assertion into a **primary subject** (the request or event type to find) and a **qualifier** (the specific condition to check within it). This is how the agent decides where to look and what to look for. * **What I Found** — A detailed breakdown of the matching evidence, including the endpoint, request method, status code, URL parameters, and any relevant payload data. This is the raw proof that supports the result. * **Conclusion** — A plain-language summary of whether the assertion passed or failed and why. * **Examined requests** — A clickable badge linking to the specific network request the agent inspected. Click it to jump directly to the full request details in the Network Logs panel. ## Use Cases ### Event & Analytics Tracking Analytics, tracking pixels, and third-party event calls break silently — they don't affect the UI, so regressions go unnoticed. Log steps let you confirm these events fire correctly during key user flows. ### Validate API Status Codes & Responses The UI might show a success message even when the backend returns an error or unexpected data. Log steps let you check the actual API responses your application receives. ### Validate Request Payloads Confirm that your application sends the correct data to the backend — not just that the form submitted successfully. ## What Data Is Available During every test run, Spur captures all **network requests** and **browser console output** from your application. The Log step agent searches through this data to evaluate your assertions, and you can also inspect it directly from the test results view. Every HTTP request and response, including: * URL, method, and status code * Request and response headers * Request body (POST data) * Response body * Timing and duration * Error details (HTTP and network errors) All browser console output, including: * Log messages (`console.log`, `console.warn`, `console.error`) * JavaScript errors and stack traces * Source file locations * Timestamps ## Viewing Logs in Test Results After a test run completes, you can inspect the raw network and console data directly from the results view. ### Network Logs You can inspect the exact requests examined by the Spur agent by clicking the examined request in the step result. You can filter network logs by status code, HTTP method, or URL pattern. Click any entry to see full request and response details including headers and body content. ### Console Logs Console logs display the message type, timestamp, content, and source location. You can search and filter logs to find specific entries. ## Best Practices ### Writing Effective Assertions Use a Verify step to check what the user sees, then follow it with a Log step to confirm the right data was sent and received. Together they give you full coverage — UI and backend in one test. Mention the specific assertion you want to perform: network or console. For example, "Validate the payload for collect-tag contains event\_code" should specify whether the agent needs to look for it in the console output or the network requests. So this should be rewritten as "Validate in the console ..." Keep each Log step focused on a single check. Instead of "confirm the API returned 200 and the tracking event fired," split that into two separate Log steps. This makes results easier to interpret and debug. You don't need to know the exact request format, header names, or payload structure. Describe the behavior you expect and the agent will figure out where and how to look for it. ### When to Use Log Steps Log steps are great for regression testing. Add them to your existing tests to make sure API behavior doesn't silently change between releases. The UI might gracefully handle a 500 error or swallow a failed analytics call. Log steps surface these hidden issues that would otherwise go unnoticed. Add Log steps to your most important user journeys — signup, form submissions, data updates, key workflows. These are the flows where a broken API call has real consequences. Analytics, ad pixels, and third-party scripts break silently. Use Log steps to verify these calls fire on the right pages so you catch regressions early. ## Limitations * **Logs are analyzed after capture, not in real-time.** The agent evaluates network and console data that has already been recorded during the test run. It does not monitor logs as they stream in. * **Late-firing requests may not be captured.** If a network request or event fires after the test step has finished executing, it may not be included in the data the agent searches through. This can affect assertions on deferred or asynchronous calls that take a long time to complete. ## Troubleshooting Make sure your assertion names the endpoint or event clearly. For example, instead of "Confirm the homepage event fired," try "Confirm the request to **/collect** contains **homepage** in the payload." Being specific about the endpoint helps the agent find the right request. Try making your assertion more specific. Instead of "check the API response is correct," specify the exact endpoint, field, and expected value. A vague assertion could match unrelated data. This usually means there's a real backend issue the UI is masking. Check the network logs panel in the test results to see the actual API responses. Log steps are only available for web tests. If you're authoring a native/mobile test, this step type will not appear in the step menu. # Spur for Data Science Teams Source: https://docs.spurtest.com/additional-resources/spur-for-data-science-teams Automate analytics event validation, tracking QA, and data quality monitoring — without writing code or inspecting DevTools manually. If you work in data science, analytics, or marketing technology, you know the pain: every release cycle means hours of manually checking that tracking events fire correctly, payloads contain the right fields, and downstream data pipelines receive clean inputs. When something breaks, it often goes undetected for days or weeks — leading to bad dashboards, broken attribution, and lost revenue. Spur automates this entire validation process. This guide explains how it works, why it matters, and how to get started — even if you have never automated anything before. *** ## The Problem You Are Solving Analytics and tracking implementations break silently. Unlike a broken button or a crashed page, a missing tracking event produces no visible error. The user experience looks fine. But behind the scenes: * Events stop firing after a code deploy * Required fields disappear from payloads * Data types change (string becomes number, casing shifts) * Third-party pixels and affiliate tags get dropped * UTM parameters are stripped during redirects These failures are invisible to end users — but they corrupt your data, break attribution models, and undermine every decision made from that data. ### How Teams Typically Catch These Issues Today ```mermaid theme={null} graph TD A["Open Chrome DevTools"] --> B["Navigate to page / complete flow"] B --> C["Search console or network tab for events"] C --> D["Manually inspect each payload field"] D --> E["Screenshot as evidence"] E --> F["Cross-reference with analytics platform"] F --> G["Repeat for every region, brand, browser, environment"] G --> H["File a ticket if something is wrong"] style A fill:#fee,stroke:#c33 style G fill:#fee,stroke:#c33 ``` This process has fundamental limitations: * **It does not scale.** A site with 30+ tracked events across multiple regions, brands, and browsers creates thousands of combinations to check. * **It is error-prone.** Humans miss subtle changes — a field that switched from lowercase to uppercase, a value that went from `"12.99"` to `12.99`. * **It is reactive.** Manual QA happens after deploys. Issues often reach production before anyone checks. * **It consumes analyst time.** Every hour spent in DevTools is an hour not spent on actual data analysis and strategy. *** ## How Spur Automates This Spur replaces the manual DevTools process with an automated browser agent. Here is how it works at a high level: ```mermaid theme={null} graph LR A["You define what to validate"] --> B["Spur opens a real browser"] B --> C["Agent navigates your site like a real user"] C --> D["All network traffic is captured automatically"] D --> E["Agent validates payloads against your expectations"] E --> F["Results: pass/fail with evidence"] ``` ### What the Agent Actually Does Spur launches a real Chrome or Safari browser — not a simulator. It behaves exactly like a user visiting your site, including cookies, consent banners, and third-party scripts. The agent navigates to the right page, clicks through the flow (view a product, add to cart, complete checkout, etc.), and triggers the same events a real user would. While the agent navigates, every HTTP request and response is captured in real time — including analytics events, tracking pixels, API calls, and third-party scripts. You can inspect this data yourself in the [Network & Console Monitoring](/additional-resources/network-console-monitoring) panel after every run. You tell Spur what to check using plain language. For example: *"Confirm the product\_detail event contains product\_id, product\_name, and price as a number."* The agent searches the captured network data, finds the matching request, and validates field by field. See [how the agent breaks down and verifies assertions](/additional-resources/network-console-monitoring#understanding-the-result) to understand exactly what happens behind the scenes. Each validation produces a clear pass or fail, along with the actual data it found — including the endpoint, request method, status code, and payload snippet. You can click through to the [full network log](/additional-resources/network-console-monitoring#viewing-logs-in-test-results) for any examined request. No digging through DevTools required. *** ## Key Concepts ### Events and Payloads An **event** is a network request your site sends to an analytics platform (like Adobe Analytics, Google Analytics, Tealium, Segment, etc.) when something happens — a page loads, a user clicks a button, an order completes. Each event carries a **payload**: a bundle of data fields describing what happened. For example, a product view event might include: ```json theme={null} { "event_name": "product_detail", "product_id": "ABC-12345", "product_name": "Classic Oxford Shirt", "price": 68.00, "currency": "USD", "category": "Men > Shirts", "brand": "Main Brand", "color": "Blue", "size": "M", "in_stock": true } ``` When Spur validates an event, it checks: * **Did the event fire at all?** (The most common failure — roughly 50% of issues) * **Are all required fields present?** (About 40% of issues) * **Are the values in the correct format?** (About 10% — wrong types, casing, etc.) ### Log Steps In Spur, you validate events using **Log steps**. A Log step is a plain-language instruction that tells the agent what to check in the captured network data. You write it like you would explain it to a colleague: ``` Log Confirm the product_detail event fired and contains product_id, product_name, and price as a number ``` The agent handles the rest — finding the right request, parsing the payload, and checking each field. See how Spur captures network traffic and console output, how the agent verifies your assertions, and how to inspect raw logs in test results. Technical reference for writing Log steps, adding them to tests, and troubleshooting. *** ## Thinking Through Your Validation Strategy Before building tests, take a step back and think about what matters most. Not every event needs the same level of scrutiny. ### Prioritize by Business Impact ```mermaid theme={null} graph TD A["All Tracked Events"] --> B{"Revenue impact?"} B -->|Yes| C["P0 — Validate every deploy"] B -->|No| D{"Decision-making impact?"} D -->|Yes| E["P1 — Validate weekly"] D -->|No| F{"Compliance / legal?"} F -->|Yes| G["P0 — Validate every deploy"] F -->|No| H["P2 — Validate monthly"] style C fill:#fcc,stroke:#c33 style G fill:#fcc,stroke:#c33 style E fill:#fec,stroke:#c93 style H fill:#cfc,stroke:#3c3 ``` **P0 — Must validate every deploy:** * Order confirmation / purchase events (revenue attribution) * Affiliate and commission tracking (direct revenue impact) * Consent and privacy events (legal compliance) * Core conversion events (signup, subscription) **P1 — Validate weekly or after relevant changes:** * Product detail page views (merchandising analytics) * Search and navigation events (UX analytics) * Campaign attribution parameters (marketing ROI) **P2 — Validate monthly or on major releases:** * Page scroll and engagement events * Feature usage tracking * A/B test instrumentation ### Map Your Validation Matrix For each priority event, consider the dimensions you need to cover: | Dimension | Example | | ----------------------- | --------------------------- | | **Regions** | US, UK, EU, APAC | | **Brands / Properties** | Main brand, sub-brands | | **Browsers** | Chrome, Safari, mobile | | **Environments** | Staging, production | | **User states** | Logged in, guest, returning | Spur runs all of these combinations in parallel — what takes hours manually takes minutes automated. *** ## Building Your First Validation Test Here is how to approach it, step by step. ### Step 1: Pick your highest-priority event Start with the one event that would cause the most damage if it broke. For most teams, this is either: * **Purchase / order confirmation** — revenue and attribution * **Main page view event** — highest volume, most dependencies ### Step 2: Document what "correct" looks like Write down (or gather from your tech spec): * The event name or endpoint * Every required field * The expected data type for each field (string, number, boolean) * Any format requirements (e.g., currency as decimal, IDs as strings) ### Step 3: Create the test in Spur Build a test that: 1. Navigates to the page or completes the user flow 2. Uses **[Log steps](/additional-resources/network-console-monitoring)** to validate the event payload Example test structure: ``` 1. Navigate to a product detail page 2. Verify the product page loaded (UI check) 3. Log Confirm the product_detail event fired 4. Log Confirm product_detail contains product_id as a non-empty string 5. Log Confirm product_detail contains price as a number greater than 0 6. Log Confirm product_detail contains product_name, category, and brand ``` ### Step 4: Run and iterate Run the test against your staging environment first. Review the results using the [Network & Console Monitoring](/additional-resources/network-console-monitoring#viewing-logs-in-test-results) panel: * Did the agent find the right event? Click the examined request badge to verify. * Are there false positives (flagging things that are actually fine)? * Are there fields you forgot to include? Tune your Log step assertions until the test reliably catches real issues and ignores noise. See [best practices for writing effective assertions](/additional-resources/network-console-monitoring#writing-effective-assertions) for tips. ### Step 5: Schedule and expand Once validated, schedule the test to run: * **After every deploy** — catch regressions immediately * **Daily** — catch issues from third-party script updates or infrastructure changes Then repeat for your next priority event. *** ## Common Validation Patterns ### Analytics Event Validation The most common use case. Confirm that tracking events fire with the correct payload during key user flows. ``` Log Confirm the purchase event contains order_id, revenue as a number, and items as an array with at least one entry ``` ### Affiliate and UTM Parameter Validation UTM parameters and affiliate tokens in URLs drive campaign attribution and commission payouts. If they are dropped or malformed at any point in the funnel, revenue goes untracked. ``` Log Confirm the request URL to the affiliate endpoint contains utm_source, utm_medium, and utm_campaign parameters ``` ### Data Layer Validation Many analytics implementations use a data layer (like Tealium's `utag.data` or Google's `dataLayer`) that is accessible in the browser. Spur can capture and validate these attributes as part of the same test flow. ``` Log Confirm the data layer contains user_segment and page_type with non-empty values ``` ### Cross-Platform Consistency Run the same validation across Chrome, Safari, and mobile to ensure events fire consistently across all platforms. *** ## What Changes With Automation | | Manual | Automated with Spur | | ----------------------------- | ---------------------------------------------- | ----------------------------------------------------- | | **Time per validation cycle** | 2–4 hours | 5–10 minutes | | **Coverage** | Spot-checking (\~30%) | 100% — all fields, every run | | **Multi-region** | Each tested separately | All regions in parallel | | **Multi-browser** | Manual switching | Chrome, Safari, mobile in parallel | | **Error detection** | Visual inspection — easy to miss subtle issues | AI flags exact discrepancies with expected vs. actual | | **Documentation** | Manual screenshots | Structured reports with network traces | | **Frequency** | Ad-hoc after releases | Scheduled daily + on-demand | | **Detection speed** | Days to weeks (or never) | Within minutes of a deploy | *** ## Getting Started Now that you understand the fundamentals of how analytics validation works with Spur, dive into the feature documentation to see exactly how to use it: See how validation results look in practice — assertion breakdowns, evidence, and raw network/console logs. Technical reference for adding Log steps to your tests. Step-by-step guide to building and running your first Spur test. Execute and monitor your validation tests across environments. Trigger validation tests automatically on every deploy. Set up recurring validation runs on a daily or weekly cadence. # Azure SSO Source: https://docs.spurtest.com/additional-resources/sso-providers/azure-sso ## Overview Spur uses Supabase Auth as its authentication provider, which enables secure OAuth 2.0-based SSO. Users can sign in to Spur using their existing identity provider credentials — no separate Spur password required. ## How SSO Works in Spur Spur's SSO uses the OAuth 2.0 / OpenID Connect (OIDC) protocol — the modern industry standard for federated authentication. Here's the flow when a user signs in: The user clicks **Sign in with Microsoft** on the Spur login page. Spur redirects to Microsoft's authentication endpoint. The user authenticates with their Microsoft credentials (and MFA, if configured by your organization). Microsoft returns a secure token to Spur confirming the user's identity. Spur creates or resumes the user's session. No Spur-specific password is ever set or stored. ## What Spur Supports | Item | Details | | --------------------- | ------------------------------------------------------------------------------------------------------- | | **Protocol** | OAuth 2.0 / OpenID Connect (OIDC) | | **Identity Provider** | Microsoft Azure Entra ID (and Google) | | **Tenant type** | Multi-tenant — any Azure Entra organization can connect without per-tenant configuration on Spur's side | | **Account types** | Organizational accounts (work/school). Personal Microsoft accounts are not in scope. | | **User provisioning** | Just-in-time — a Spur account is automatically created on first successful SSO login | | **MFA enforcement** | Honored — if your Azure tenant requires MFA, it will be enforced before Spur grants access | | **Scopes requested** | `openid`, `email`, `profile` (read-only identity data only) | ## Current Limitations The following are not supported at this time. If any of these are requirements for your organization, please reach out to discuss your use case. * **SAML 2.0** — Spur uses OAuth 2.0/OIDC only, not SAML. * **Per-tenant app registration** — Spur uses a single multi-tenant Azure app registration rather than a dedicated registration per customer. ## What Your Organization Needs to Do For most organizations, no setup is required. Users can sign in with their Microsoft account immediately once Spur enables the provider. ### If Your Tenant Restricts Third-Party App Access Some organizations configure Azure Entra to require admin approval before users can sign into third-party applications. If this applies to your tenant, an Azure admin will need to: Navigate to **Azure Portal** → **Microsoft Entra ID** → **Enterprise Applications**. Locate the Spur application. It will appear after the first sign-in attempt, or can be added proactively. Grant admin consent for the scopes Spur requests: `openid`, `email`, and `profile`. This is a one-time action that unblocks all users in your organization without each person needing to consent individually. ### Restricting Access to Specific Users or Groups If you want to limit which employees in your organization can access Spur via SSO, an Azure admin can: 1. In the Spur enterprise application in Entra, enable **User assignment required**. 2. Assign specific users or Azure groups who are permitted to sign in. Without this configuration, any user in your organization's Azure tenant can sign into Spur. ## Data & Security Spur requests the minimum necessary permissions to authenticate your users. Spur does not request access to email content, calendar, files, or any other Microsoft 365 data. * **openid** — Required to use OpenID Connect for authentication * **email** — The user's email address, used as their Spur account identifier * **profile** — Basic profile info (name), used to populate the user's Spur profile ## Questions? If you have questions about SSO configuration, compliance requirements, or want to discuss your organization's specific setup, please contact your Spur account representative. Reach out to the Spur team for SSO support. # Google SSO Source: https://docs.spurtest.com/additional-resources/sso-providers/google-sso ## Overview Spur uses Supabase Auth as its authentication provider, which enables secure OAuth 2.0-based SSO. Users can sign in to Spur using their existing Google Workspace credentials — no separate Spur password required. ## How SSO Works in Spur Spur's SSO uses the OAuth 2.0 / OpenID Connect (OIDC) protocol — the modern industry standard for federated authentication. Here's the flow when a user signs in: The user clicks **Sign in with Google** on the Spur login page. Spur redirects to Google's authentication endpoint. The user authenticates with their Google credentials (and MFA, if configured by your organization). Google returns a secure token to Spur confirming the user's identity. Spur creates or resumes the user's session. No Spur-specific password is ever set or stored. ## What Spur Supports | Item | Details | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Protocol** | OAuth 2.0 / OpenID Connect (OIDC) | | **Identity Provider** | Google Workspace | | **Account types** | Google Workspace accounts (organizational). Personal Gmail accounts are not supported — this is enforced by configuring the OAuth app's user type to **Internal** in the Google Cloud Console. | | **User provisioning** | Just-in-time — a Spur account is automatically created on first successful SSO login | | **MFA enforcement** | Honored — if your Google Workspace requires MFA, it will be enforced before Spur grants access | | **Scopes requested** | `openid`, `email`, `profile` (read-only identity data only) | ## Current Limitations The following are not supported at this time. If any of these are requirements for your organization, please reach out to discuss your use case. * **SAML 2.0** — Spur uses OAuth 2.0/OIDC only, not SAML. ## What Your Organization Needs to Do For most organizations, no setup is required. Users can sign in with their Google Workspace account immediately. ### If Your Organization Restricts Third-Party App Access Some organizations configure Google Workspace to restrict which third-party apps users can sign into. If this applies to your organization, a Google Workspace admin will need to: Navigate to the [Google Admin Console](https://admin.google.com) → **Security** → **Access and data control** → **API controls**. Click **Manage Third-Party App Access** and find or add the Spur application. Set the app to **Limited** so that users in your organization can sign in without individual approval. This allows the app to request access to unrestricted Google data only, which is sufficient for SSO. This is a one-time action that unblocks all users in your organization without each person needing to consent individually. ### Restricting Access to Specific Users or Groups If you want to limit which employees in your organization can access Spur via SSO, a Google Workspace admin can: 1. In the Google Admin Console, navigate to the Spur app under **API controls**. 2. Restrict the app to specific organizational units (OUs) or groups. Without this configuration, any user in your Google Workspace organization can sign into Spur. ## Data & Security Spur requests the minimum necessary permissions to authenticate your users. Spur does not request access to Gmail, Google Drive, Calendar, or any other Google Workspace data. * **openid** — Required to use OpenID Connect for authentication * **email** — The user's email address, used as their Spur account identifier * **profile** — Basic profile info (name), used to populate the user's Spur profile ## Questions? If you have questions about SSO configuration, compliance requirements, or want to discuss your organization's specific setup, please contact your Spur account representative. Reach out to the Spur team for SSO support. # User Roles Source: https://docs.spurtest.com/additional-resources/user-roles Understand the difference between admin and member roles, and how admins manage your team in Spur. ## Overview Spur has two user roles: | Role | Permissions | | ---------- | ---------------------------------------------------------------------------------------------------------- | | **Admin** | Everything a member can do, plus: invite new users, promote members to admin, and demote admins to member. | | **Member** | Author, run, and analyze tests. Cannot manage team membership or roles. | Every account needs at least one admin. Removing users from an account is not yet supported — if you need a user removed, [contact the Spur team](/additional-resources/contact-us). If your team does not yet have an admin or you need someone promoted, email [andy@tryspur.dev](mailto:andy@tryspur.dev). ## Managing Your Team All team management happens on the [Account page](https://app.spurtest.com/account). Only admins can see the team management controls. ### Invite a New User Go to [app.spurtest.com/account](https://app.spurtest.com/account). Enter the new user's email address and submit. Spur creates an account for the user and emails them a link to set their password. Once they set a password, they can sign in. New users are added as **members** by default. Promote them to admin afterward if they need team management permissions. ### Promote a Member to Admin On the [Account page](https://app.spurtest.com/account), find the member in the team list and change their role to **Admin**. The change takes effect immediately. ### Demote an Admin to Member On the [Account page](https://app.spurtest.com/account), find the admin in the team list and change their role to **Member**. Make sure at least one admin remains on the account. ## Related Set up Google or Azure SSO so users can sign in with their organization's credentials. Need a user removed or have a role question we haven't covered? Reach out. # Analysis Overview Source: https://docs.spurtest.com/analysing-tests/analysis-overview Understand where to find your test results and what you can do with them. ## Overview Once your tests have run, Spur gives you several ways to view, analyze, and act on the results. Whether you need a quick health check across all your suites or a deep dive into a specific test plan run, everything is accessible from the Spur dashboard. ## Where to Find Your Results The best way to work through your results. The Test Plan Review flow walks you through every failure and warning in a test plan run, letting you triage each result, edit tests inline, and create bug tickets without leaving Spur. Start here if you run tests through test plans. A bird's-eye view of the latest result for every test across all your suites. Use this to quickly spot which tests are failing, passing, or raising warnings. Results are split by viewport, environment, and browser. ## What You Can Do with Results Once you have your results, Spur provides several ways to take action: ### Share Results Share test results with your team without requiring a Spur login. Shareable links give the recipient full access to the test result, including steps, video replay, console logs, and network logs. Generate a link to any test result and send it to anyone on your team. ### Create Bug Tickets Turn failures into trackable issues in your project management tool. Spur auto-populates tickets with failure details, screenshots, and reproduction steps. Create Jira tickets directly from test failures. Create Linear issues directly from test failures. ### Get Notified Set up alerts so your team is informed about test results automatically, whether through Slack messages or email notifications. Receive test result notifications in your Slack channels. Get email notifications for test outcomes. ### Debug with Spur MCP Pass shareable links to the Spur MCP to analyze test results and help debug failures directly in your development workflow. Use AI-powered analysis to understand and fix test failures. # Email Alerts Source: https://docs.spurtest.com/analysing-tests/integrations/email Configure email notifications for test results and alerts. ## Overview The email integration keeps your team informed about test results without needing to check the Spur dashboard. You can configure notifications for specific test outcomes and control who receives alerts from which suites. ## Setup Navigate to the [Integrations page](https://app.spurtest.com/integrations) and select **Email** from the available integrations. Choose which notifications you want to receive: Immediate alerts when any test fails. Confirmation when tests pass. A daily digest of all test results. Control who gets alerts from which suites. ## Per-User Access Settings By default, every user in your application receives email notifications for all tests. You can configure specific access settings to control who gets alerts from which suites. If you configure access for one person, make sure to configure access for everyone else as well. Otherwise, unconfigured users will continue to receive notifications for all suites. Go to the Integrations tab and click into **Access Settings** for the email integration. For each user, select which suites they should receive notifications for. This gives you fine-grained control over who sees what. # GitHub Integration Source: https://docs.spurtest.com/analysing-tests/integrations/github Connect Spur with GitHub for automated testing on pull requests. ## Overview The GitHub integration lets you run Spur tests automatically on every pull request. Test results appear as status checks directly on the PR, and you can use branch protection rules to block merges when tests fail. Test plans run automatically on every pull request without manual intervention. Pass/fail results appear directly on the pull request in GitHub. For a full setup walkthrough including YAML workflow files and branch protection, see the [GitHub CI/CD guide](/running-tests/cicd/github). ## Quick reference Spur automatically generates the workflow YAML files for your repository. You can download them from the GitHub Integration Settings page in Spur and add them to your repository under `.github/workflows/`. The full CI/CD setup guide covers everything you need, including configuring test plans, downloading YAML files, and enabling branch protection. See the [GitHub CI/CD page](/running-tests/cicd/github) for step-by-step instructions. # GitLab Integration Source: https://docs.spurtest.com/analysing-tests/integrations/gitlab Connect Spur with GitLab for automated testing on merge requests. ## Overview The GitLab integration lets you run Spur tests automatically on every merge request. Test results appear as pipeline status checks directly on the MR, helping your team catch issues before merging. Test plans run automatically on every merge request without manual intervention. Pass/fail results appear directly on the merge request in GitLab. For a full setup walkthrough including `.gitlab-ci.yml` configuration, see the [GitLab CI/CD guide](/running-tests/cicd/gitlab). ## Quick reference Add the Spur test stage to your `.gitlab-ci.yml` file to trigger test plans on merge request events. Spur provides the configuration you need from the GitLab Integration Settings page. The full CI/CD setup guide covers everything you need, including configuring test plans and pipeline setup. See the [GitLab CI/CD page](/running-tests/cicd/gitlab) for step-by-step instructions. # Integrations Overview Source: https://docs.spurtest.com/analysing-tests/integrations/integrations Setup instructions of integrations, and a list of all currently available integrations. # Setting up your Integrations Integrationsoverview 1 1. Click the User Profile button in the top right, from any page. 2. Click Integrations in the dropdown. 3. Connect and manage your integrations! # Available Integrations ## Issue Tracking & Bug Reporting Jira and Linear follow the same workflow in Spur. Both let you create bug tickets from test failures with auto-populated details. The setup and ticket creation steps are identical across both integrations. Create detailed Jira tickets directly from test failures with screenshots, logs, and reproduction steps. Create Linear issues directly from test failures with auto-populated details and reproduction steps. ## Communication & Notifications Real-time notifications and alerts in your Slack workspace Customizable email notifications and reports ## Development Workflows GitHub and GitLab follow the same workflow in Spur. Both let you trigger test plans automatically on pull requests or merge requests, with results appearing as status checks. Automated testing workflows and Vercel preview deployment Run Spur tests in your GitLab CI/CD pipelines with automated test execution on merge requests. # Jira Tickets Source: https://docs.spurtest.com/analysing-tests/integrations/jira Connect Spur with Jira to file bug tickets from failed test runs, sync ticket status back to Spur, and set project, priority, and assignee defaults. ## Setup If you have not integrated Spur with Jira, follow the setup process [here](/analysing-tests/integrations/integrations). ## Overview Connecting to our Jira integration allows you to create bug tickets directly from test failures. You can choose which project to send tickets to, along with details such as priority and assignee. ## Permissions When you authorize the integration, Spur requests the following Jira OAuth scopes. Each one maps directly to a feature of the integration: | Scope | Why Spur needs it | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `read:jira-work` | Lists your projects, issue types, and issue fields so the ticket creation modal is pre-populated with your project's setup. Also used to fetch issue details for tickets linked to Spur tests. | | `write:jira-work` | Creates bug tickets from test failures and attaches supporting evidence, such as test videos and screenshots, to the ticket. | | `read:jira-user` | Fetches the names and avatars of assignable users so you can pick an assignee when creating a ticket. | | `manage:jira-configuration` | Reads your Jira configuration — available priorities, statuses, and fields — so the ticket creation form matches your instance. Atlassian gates read access to these configuration objects behind this scope; Spur never creates or modifies projects, workflows, or custom fields. | | `offline_access` | Keeps the integration connected by refreshing access tokens, so you don't have to re-authorize Spur. | Spur only acts on your Jira workspace when you create a ticket from a test failure. It never modifies your Jira configuration or deletes data on its own. ## Creating a ticket manually from a test failure After reviewing a test run, open the Share menu and click the "Create a Ticket" button to open the Jira ticket creation modal: The modal opens with pre-populated information from the test failure: **Auto-Generated Fields:** * **Title**: Name of the Test * **Description**: Detailed bug report including: * Failure Reason * Reproduction steps * Test name and execution details * **Project**: The default project, if chosen in the Integrations page. Edit the title and description, if necessary. Choose additional ticket details. **Customization Options:** * **Assignee**: Set who should handle the ticket * **Priority**: What is the urgency of this bug? * **Due Date**: When will this ticket be considered overdue? Create the ticket! ## Viewing and syncing linked tickets Once a Jira ticket is linked to a test, Spur displays it in the test's share panel with live status information pulled directly from Jira. ### Status pill Each linked ticket shows a **status pill** reflecting its current Jira workflow state—for example, **Open**, **In Progress**, or **Done**. The status is displayed alongside the ticket key so you can see the current state at a glance without leaving Spur. ### Syncing ticket data Click the **Sync** button next to a linked ticket to pull the latest information from Jira. Syncing updates: * **Title** — Current ticket summary * **Status** — Current workflow state * **Assignee** — Current ticket owner * **URL** — Link to the Jira issue This is useful when a ticket has been updated in Jira since it was first linked—for example, if it has been reassigned, triaged, or resolved. ## Troubleshooting ### Common issues **If fields are missing:** * Your integration permissions may not be set properly. Try reintegrating from the Integrations page. **Ticket Creation Failures:** * Confirm you have chosen a proper project and issue type * Check required field configurations **Custom Required Fields:** * If your Jira project has custom required fields, [contact the Spur team](/additional-resources/contact-us) for assistance with your integration setup. # Linear Tickets Source: https://docs.spurtest.com/analysing-tests/integrations/linear Connect Spur with Linear for streamlined issue tracking and automated bug reporting. ## Setup If you have not integrated Spur with Linear, follow the setup process [here](/analysing-tests/integrations/integrations). ## Overview Connecting to our Linear integration allows you to create bug tickets directly from test failures. You can choose which team and project to send issues to, along with details such as priority, assignee, and labels. ## Creating a Ticket Manually from a Test Failure After reviewing a test run, open the Share menu and click the "Create a Ticket" button to open the Linear issue creation modal: The modal opens with pre-populated information from the test failure: **Auto-Generated Fields:** * **Title**: Name of the Test * **Description**: Detailed bug report including: * Failure Reason * Reproduction steps * Test name and execution details * **Team**: The default team, if chosen in the Integrations page. Edit the title and description, if necessary. Choose additional issue details. **Customization Options:** * **Project**: Which project should this ticket be in? This is optional. * **Assignee**: Set who should handle the issue * **Priority**: What is the urgency of this bug? * **Labels**: Attach any labels that are allowed within the selected team. * **State**: Choose the current status of the issue Create the issue! ## Troubleshooting ### Common Issues **If fields are missing:** * Your integration permissions may not be set properly. Try reintegrating from the Integrations page. **Issue Creation Failures:** * Confirm you have chosen a proper team * Check required field configurations **Custom Required Fields:** * If your Linear workspace has custom required fields, [contact the Spur team](/additional-resources/contact-us) for assistance with your integration setup. # Slack Alerts Source: https://docs.spurtest.com/analysing-tests/integrations/slack Connect Spur with Slack for real-time test result notifications in your workspace. ## Overview The Slack integration sends test result notifications directly to a channel in your workspace. You can receive alerts when tests fail, when they pass, or get a daily summary of all results. ## Setup In your Slack workspace, create a new channel for Spur notifications (e.g. `#spur_alerts`). Navigate to the Integrations page and click **Connect** on the Slack card. Authorize Spur to access your workspace when prompted. Go to the Integrations page in Spur to connect your Slack workspace. ## Permissions When you authorize the integration, Spur requests the following Slack OAuth scopes. Each one maps directly to a feature of the integration: | Scope | Why Spur needs it | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `chat:write` | Sends test result alerts and end-of-day summaries to your chosen channel as Spur. | | `channels:read` | Lists the public channels in your workspace so you can pick a notification channel when configuring alerts or test plans. | | `groups:read` | Lists private channels that Spur has been added to, so they also appear in the channel picker. | | `channels:join` | Lets Spur join a public channel automatically when it needs to deliver an alert there, so you don't have to invite the bot manually. | | `incoming-webhook` | Lets you post Spur alerts to a specific channel via a webhook URL as an alternative to selecting a channel. | | `links:read` | Detects when `app.spurtest.com` test result links are shared in your channels. | | `links:write` | Shows rich previews of shared `app.spurtest.com` links, including the test name, status, and failure reason. | | `links.embed:write` | Embeds the test recording video player directly in those link previews. | | `app_mentions:read` | Lets Spur see messages that directly @-mention the Spur app in channels it has been added to. | Spur can only see channel names for the channel picker and messages that contain `app.spurtest.com` links or @-mention Spur. It cannot read your other messages. ## Notification Options Once connected, you can choose when Spur sends alerts to your channel: * **On Fail** — Get notified when one or more tests fail. * **On Pass** — Get notified when tests pass. * **End of Day Summary** — A daily digest of all test results. You can also customize the Slack channel and notification trigger per test plan. Test plans can send alerts to their own dedicated channels. See the [Running Test Plans](/running-tests/test-plans) page for details. # Spur MCP Integration Source: https://docs.spurtest.com/analysing-tests/mcp/spur-mcp Give your AI assistant access to Spur through the Model Context Protocol to run tests, analyze results, and debug failures without leaving your editor.