{"id":139,"date":"2026-10-19T13:39:02","date_gmt":"2026-10-19T13:39:02","guid":{"rendered":"https:\/\/smartcloudspend.com\/?p=139"},"modified":"2026-10-30T12:06:30","modified_gmt":"2026-10-30T12:06:30","slug":"saas-management-audit-salesforce-jira-inactive-licenses","status":"publish","type":"post","link":"https:\/\/smartcloudspend.com\/?p=139","title":{"rendered":"How to Audit Salesforce and Jira Inactive Licenses Automatically"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>By Ra\u00fal P\u00e9rez \u00b7<\/em> <em>Last updated: October 2026 \u00b7 Reading time: 12 min<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Salesforce and Jira are two of the most expensive line items in a typical software budget, and two of the easiest places to overpay. Both charge per user. Both accumulate abandoned accounts as people change roles, leave the company, or get a license &#8220;just in case&#8221; and never log in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A manual review once a year is better than nothing, but it is slow and the savings leak back in. This guide shows you how to find <strong>inactive licenses<\/strong> in Salesforce and Jira with queries and scripts, how to automate the audit so it runs on a schedule, and how to reclaim licenses safely without locking out someone who needed access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The examples are practical and adaptable, but both vendors change their APIs, licensing models and admin tools over time. Test everything in a sandbox or with read-only access first, and confirm current details in the official documentation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Inactive Licenses Add Up Fast<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per-seat pricing means every unused account has a precise monthly cost. A few reasons waste accumulates:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Departures not cleaned up.<\/strong> Offboarding checklists often forget SaaS tools that are not connected to single sign-on.<\/li>\n\n\n\n<li><strong>Role changes.<\/strong> A salesperson moves to customer success and keeps a full Sales Cloud license.<\/li>\n\n\n\n<li><strong>Over-licensing.<\/strong> Premium licenses are assigned to people who only need to view reports or collaborate.<\/li>\n\n\n\n<li><strong>Pilot and project users.<\/strong> Temporary users added for a project are never removed.<\/li>\n\n\n\n<li><strong>Contractors and consultants.<\/strong> Accounts outlive the engagement.<\/li>\n\n\n\n<li><strong>No visibility.<\/strong> Admin consoles show who has a license, but few teams regularly check who actually uses it.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The savings math<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Annual waste = inactive licenses x price per license per month x 12<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Illustrative example: 40 inactive Salesforce licenses at $150 per month and 60 inactive Jira licenses at $10 per month would cost $72,000 and $7,200 a year respectively, nearly $80,000 in total. Your own numbers will differ, but even modest inactivity rates are expensive at enterprise list prices.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 0: Define What &#8220;Inactive&#8221; Means<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before writing any query, agree on rules with the business. A defensible policy:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Rule<\/th><th>Typical choice<\/th><\/tr><tr><td>Inactivity window<\/td><td>60 or 90 days without login<\/td><\/tr><tr><td>Never logged in<\/td><td>Account older than 30 days with no login at all<\/td><\/tr><tr><td>Exceptions<\/td><td>Executives, auditors, seasonal users (such as quarter-end finance), integration and service accounts, admins, break-glass accounts<\/td><\/tr><tr><td>Action<\/td><td>Notify, wait a grace period, then freeze or deactivate<\/td><\/tr><tr><td>Reactivation<\/td><td>Guaranteed within one business day, so nobody fears removal<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Write it down and get sign-off from IT, security and the business owner of each system. A clear policy prevents most disputes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Part 1: Auditing Salesforce<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">How Salesforce licensing works (the short version)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Each user is assigned a <strong>user license<\/strong> through their profile (for example Salesforce, Salesforce Platform or Customer Community), and may also hold <strong>permission set licenses<\/strong> and <strong>feature licenses<\/strong> for add-ons. Deactivating a user releases the user license so it can be assigned to someone else, but Salesforce users cannot be deleted. Reclaiming licenses means deactivating accounts, not removing them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Find license utilization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the Salesforce UI, go to <strong>Setup \u2192 Company Information<\/strong> to see licenses available and used. You can query the same data with SOQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT Name, Status, TotalLicenses, UsedLicenses\nFROM UserLicense\nORDER BY Name<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT MasterLabel, TotalLicenses, UsedLicenses\nFROM PermissionSetLicense\nORDER BY MasterLabel<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Compare <strong>used<\/strong> to the number of <strong>active, recently logged-in users<\/strong>. The gap, plus the unused licenses you pay for but never assigned, is your optimization potential.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Find inactive users with SOQL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT Id, Name, Username, Email, Profile.Name, Profile.UserLicense.Name,\n       LastLoginDate, CreatedDate\nFROM User\nWHERE IsActive = true\n  AND UserType = 'Standard'\n  AND (LastLoginDate &lt; LAST_N_DAYS:90 OR LastLoginDate = null)\nORDER BY LastLoginDate ASC NULLS FIRST<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>LastLoginDate = null<\/code> means the user has never logged in. Add <code>AND CreatedDate &lt; LAST_N_DAYS:30<\/code> so you do not catch brand-new accounts.<\/li>\n\n\n\n<li><code>UserType = 'Standard'<\/code> focuses on full users. Integration users and others are managed differently.<\/li>\n\n\n\n<li><code>LastLoginDate<\/code> records interactive and API logins, which is useful: an integration user may look &#8220;inactive&#8221; from a human perspective but is actively used by a system. Check the username and profile before acting.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For a deeper look at who has actually been working in the org, <code>LoginHistory<\/code> and <code>Setup Audit Trail<\/code> can help, but retention is limited, so do not rely on them for long windows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Run it automatically with the Salesforce CLI<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sf data query \\\n  --query \"SELECT Id, Name, Username, Email, Profile.Name, LastLoginDate FROM User WHERE IsActive = true AND UserType = 'Standard' AND (LastLoginDate &lt; LAST_N_DAYS:90 OR LastLoginDate = null)\" \\\n  --target-org my-prod-org \\\n  --result-format csv &gt; inactive_salesforce_users.csv<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Authenticate the CLI with a connected app and a JWT flow in a pipeline, and use a dedicated, least-privilege integration user with read access to <code>User<\/code> and license objects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Python alternative with a cost estimate<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\nimport pandas as pd\nfrom simple_salesforce import Salesforce\n\nsf = Salesforce(\n    username=os.environ&#91;\"SF_USERNAME\"],\n    password=os.environ&#91;\"SF_PASSWORD\"],\n    security_token=os.environ&#91;\"SF_TOKEN\"],\n)\n\nsoql = \"\"\"\nSELECT Id, Name, Username, Email, Profile.Name, Profile.UserLicense.Name, LastLoginDate\nFROM User\nWHERE IsActive = true AND UserType = 'Standard'\nAND (LastLoginDate &lt; LAST_N_DAYS:90 OR LastLoginDate = null)\n\"\"\"\nrecords = sf.query_all(soql)&#91;\"records\"]\ndf = pd.json_normalize(records).drop(columns=&#91;\"attributes\"], errors=\"ignore\")\n\n# Price per license per month (edit to match your contract)\nprice = {\"Salesforce\": 150, \"Salesforce Platform\": 25}\ndf&#91;\"license\"] = df&#91;\"Profile.UserLicense.Name\"]\ndf&#91;\"annual_cost\"] = df&#91;\"license\"].map(price).fillna(0) * 12\n\nprint(df.groupby(\"license\")&#91;\"annual_cost\"].agg(&#91;\"count\", \"sum\"]))\ndf.to_csv(\"inactive_salesforce_users.csv\", index=False)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For production, prefer an OAuth or JWT-based connection over a username, password and token.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Deactivating users: freeze first<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A safer path than immediate deactivation is to <strong>freeze<\/strong> the user. Freezing blocks login but keeps the license assigned, giving you a reversible grace period. This is done by setting <code>IsFrozen<\/code> to true on the user&#8217;s <code>UserLogin<\/code> record. After the grace period, deactivate (<code>IsActive = false<\/code>) to release the license.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before deactivating, check:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Records owned by the user (reassign opportunities, accounts, cases);<\/li>\n\n\n\n<li>Scheduled reports, dashboards and flows running as that user;<\/li>\n\n\n\n<li>Approval processes or queues naming the user;<\/li>\n\n\n\n<li>Integrations authenticating as that user.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Reduce the license tier, not just the count<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Beyond removing inactive users, look for people holding an expensive license who use only simple features:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Users who only view dashboards may fit a cheaper license or a reports-only approach.<\/li>\n\n\n\n<li>Users who only work with custom objects may fit a Salesforce Platform license rather than a full one.<\/li>\n\n\n\n<li>Experience Cloud and community users have separate license models.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Review how your contract defines each license before downgrading, since features and entitlements vary.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Part 2: Auditing Jira (Atlassian Cloud)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">How Jira billing works<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In Atlassian Cloud, you pay based on the number of users with <strong>product access<\/strong>, not the number of accounts that exist. Removing someone&#8217;s access to Jira Software or Jira Service Management stops the charge, while merely leaving them in a group may not. Deactivating or removing a user&#8217;s product access is therefore the key action. Plans, tiers and billing rules change, so check your current Atlassian plan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also note the difference between <strong>licensed agents or users<\/strong> and <strong>customers<\/strong> in Jira Service Management, which are billed differently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Find inactive users in the admin console<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In <strong>Atlassian Administration<\/strong>, open <strong>Directory \u2192 Users<\/strong>. The user list shows a <strong>last active<\/strong> value per product, and you can filter or export it. Sort by oldest activity, and flag anyone with no activity within your window. Check the current admin documentation for export options, which have varied over time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Atlassian also provides admin tools and settings for identifying and managing inactive users in some plans. Check what your subscription includes before building anything custom.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Automate with the Atlassian Admin API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Atlassian organization API can list users and, depending on your plan and API version, their product access and last active dates. This sample illustrates the approach. <strong>Verify endpoint paths and field names against the current Admin API documentation, because they change.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os, requests\nfrom datetime import datetime, timedelta, timezone\n\nORG_ID  = os.environ&#91;\"ATLASSIAN_ORG_ID\"]\nAPI_KEY = os.environ&#91;\"ATLASSIAN_ADMIN_API_KEY\"]   # org admin API key, store as a secret\nCUTOFF  = datetime.now(timezone.utc) - timedelta(days=90)\n\nurl = f\"https:\/\/api.atlassian.com\/admin\/v1\/orgs\/{ORG_ID}\/users\"\nheaders = {\"Authorization\": f\"Bearer {API_KEY}\", \"Accept\": \"application\/json\"}\n\ninactive = &#91;]\nwhile url:\n    r = requests.get(url, headers=headers, timeout=30)\n    r.raise_for_status()\n    payload = r.json()\n    for user in payload.get(\"data\", &#91;]):\n        for access in user.get(\"product_access\", &#91;]):      # field names may differ\n            last = access.get(\"last_active\")\n            if access.get(\"name\", \"\").lower().startswith(\"jira\"):\n                if last is None or datetime.fromisoformat(last.replace(\"Z\", \"+00:00\")) &lt; CUTOFF:\n                    inactive.append((user.get(\"email\"), access&#91;\"name\"], last))\n    url = payload.get(\"links\", {}).get(\"next\")\n\nfor row in inactive:\n    print(row)\nprint(f\"{len(inactive)} inactive Jira seats\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Store the API key as a secret, give it the narrowest scope your plan allows, and run it read-only until you trust the output.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Remove product access safely<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Export the candidate list and send it to managers for confirmation.<\/li>\n\n\n\n<li>Wait the grace period (for example 14 days).<\/li>\n\n\n\n<li>Remove the user&#8217;s <strong>product access<\/strong>, or suspend or deactivate the account if they have left the company.<\/li>\n\n\n\n<li>Keep issue history. Jira preserves the user&#8217;s past activity, so removing access does not delete tickets.<\/li>\n\n\n\n<li>Check for <strong>automation rules, filters, dashboards and workflows<\/strong> owned by or running as the user, and reassign them.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Other Jira savings<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Duplicate accounts.<\/strong> The same person may have a personal and a company email in the instance.<\/li>\n\n\n\n<li><strong>Over-provisioned products.<\/strong> Users with access to Jira Software, Confluence and Service Management who only use one.<\/li>\n\n\n\n<li><strong>Tier fit.<\/strong> Compare your plan&#8217;s features to what teams really use before renewing at a higher tier.<\/li>\n\n\n\n<li><strong>Agents vs customers.<\/strong> In Service Management, ensure only the people who actually resolve requests are licensed as agents.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Part 3: Automate the Whole Process<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An audit run by hand will not survive busy quarters. Schedule it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A simple automation pipeline<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># .github\/workflows\/license-audit.yml\nname: Weekly license audit\non:\n  schedule:\n    - cron: \"0 7 * * 1\"      # every Monday at 07:00 UTC\n  workflow_dispatch:\n\njobs:\n  audit:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n      - uses: actions\/setup-python@v5\n        with:\n          python-version: \"3.12\"\n      - run: pip install simple-salesforce pandas requests\n      - run: python audit_salesforce.py\n        env:\n          SF_USERNAME: ${{ secrets.SF_USERNAME }}\n          SF_PASSWORD: ${{ secrets.SF_PASSWORD }}\n          SF_TOKEN: ${{ secrets.SF_TOKEN }}\n      - run: python audit_jira.py\n        env:\n          ATLASSIAN_ORG_ID: ${{ secrets.ATLASSIAN_ORG_ID }}\n          ATLASSIAN_ADMIN_API_KEY: ${{ secrets.ATLASSIAN_ADMIN_API_KEY }}\n      - uses: actions\/upload-artifact@v4\n        with:\n          name: inactive-license-report\n          path: \"*.csv\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then add steps to post a summary to Slack or email, create tickets for the managers to approve removals, and log every change.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Recommended workflow<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Weekly:<\/strong> generate the inactive-user report for each tool.<\/li>\n\n\n\n<li><strong>Notify:<\/strong> message the user and their manager, explaining that the license will be removed on a given date unless they confirm they need it.<\/li>\n\n\n\n<li><strong>Grace period:<\/strong> 7 to 14 days. Freeze rather than delete.<\/li>\n\n\n\n<li><strong>Act:<\/strong> reclaim the license, record the change and the savings.<\/li>\n\n\n\n<li><strong>Monthly:<\/strong> report licenses reclaimed, money saved and reactivation requests.<\/li>\n\n\n\n<li><strong>Quarterly:<\/strong> review license tiers, contract terms and upcoming renewals.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Ownership and controls<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Assign a named owner for each system (Salesforce admin, Jira admin).<\/li>\n\n\n\n<li>Keep an audit trail: who approved, when, and which licenses changed.<\/li>\n\n\n\n<li>Apply the principle of least privilege to the audit credentials.<\/li>\n\n\n\n<li>Make reactivation easy and fast, so the business supports the process.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common Mistakes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Treating a long window as proof of inactivity.<\/strong> Seasonal and quarter-end users may log in rarely but be essential.<\/li>\n\n\n\n<li><strong>Deactivating integration or service accounts.<\/strong> Check usernames, profiles and API usage before touching them.<\/li>\n\n\n\n<li><strong>Forgetting dependent assets.<\/strong> Reports, flows, automations and approvals tied to a removed user can break.<\/li>\n\n\n\n<li><strong>Counting only logins.<\/strong> A login is a weak signal of value. Combine it with activity (records created, issues updated) where you can.<\/li>\n\n\n\n<li><strong>Reclaiming licenses without negotiating.<\/strong> Reclaimed seats help only if you can reduce what you pay at renewal. See [Enterprise Software Negotiation Tactics to Lower Annual Renewal Costs].<\/li>\n\n\n\n<li><strong>Skipping communication.<\/strong> Surprise removals create resentment. A clear notice and quick reactivation keep trust high.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How often should I audit inactive licenses?<\/strong> Weekly or monthly automation is ideal, with a deeper quarterly review that aligns to your renewal calendar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Does deactivating a Salesforce user free the license?<\/strong> Yes. A deactivated user no longer consumes a user license, and the license can be reassigned. Users cannot be deleted in Salesforce.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Will removing a Jira user delete their tickets?<\/strong> No. Issue history and comments remain. Make sure automations and shared filters owned by the user are reassigned.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What inactivity window should I use?<\/strong> Sixty to ninety days is common. Use a longer window for roles with seasonal usage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Can I do this without a SaaS management platform?<\/strong> Yes, with the queries and scripts above. Platforms add cross-tool visibility, workflow automation and renewal management as you scale. See [Best SaaS Management Platforms (SMP) to Audit License Waste].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Inactive Salesforce and Jira licenses are one of the quickest wins in any SaaS cost program. Define what inactive means, query for it with SOQL and the Atlassian Admin API, automate the report on a schedule, give users a short grace period, and make reactivation painless. Then carry the savings into your next renewal conversation. Done weekly, the process pays for itself many times over.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Ra\u00fal P\u00e9rez \u00b7 Last updated: October 2026 \u00b7 Reading time: 12 min Salesforce and Jira are two of the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":158,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[8],"tags":[],"class_list":["post-139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-saas-management"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Audit Salesforce and Jira Inactive Licenses Automatically<\/title>\n<meta name=\"description\" content=\"Find and reclaim unused Salesforce and Jira licenses with SOQL, CLI and Python scripts. Step-by-step automation, safe offboarding rules...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/smartcloudspend.com\/?p=139\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Audit Salesforce and Jira Inactive Licenses Automatically\" \/>\n<meta property=\"og:description\" content=\"Find and reclaim unused Salesforce and Jira licenses with SOQL, CLI and Python scripts. Step-by-step automation, safe offboarding rules...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/smartcloudspend.com\/?p=139\" \/>\n<meta property=\"og:site_name\" content=\"SmartCloudSpend\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-19T13:39:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-30T12:06:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1774\" \/>\n\t<meta property=\"og:image:height\" content=\"887\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Raul\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Raul\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139\"},\"author\":{\"name\":\"Raul\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#\\\/schema\\\/person\\\/44ee75fea87758b75c9fa20bcb4736b5\"},\"headline\":\"How to Audit Salesforce and Jira Inactive Licenses Automatically\",\"datePublished\":\"2026-10-19T13:39:02+00:00\",\"dateModified\":\"2026-10-30T12:06:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139\"},\"wordCount\":1724,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/smartcloudspend.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png\",\"articleSection\":[\"SaaS Management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139\",\"url\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139\",\"name\":\"Audit Salesforce and Jira Inactive Licenses Automatically\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/smartcloudspend.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png\",\"datePublished\":\"2026-10-19T13:39:02+00:00\",\"dateModified\":\"2026-10-30T12:06:30+00:00\",\"description\":\"Find and reclaim unused Salesforce and Jira licenses with SOQL, CLI and Python scripts. Step-by-step automation, safe offboarding rules...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/smartcloudspend.com\\\/?p=139\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#primaryimage\",\"url\":\"https:\\\/\\\/smartcloudspend.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png\",\"contentUrl\":\"https:\\\/\\\/smartcloudspend.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png\",\"width\":1774,\"height\":887},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/?p=139#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/smartcloudspend.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Audit Salesforce and Jira Inactive Licenses Automatically\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#website\",\"url\":\"https:\\\/\\\/smartcloudspend.com\\\/\",\"name\":\"SmartCloudSpend\",\"description\":\"Cloud services budget optimizer\",\"publisher\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/smartcloudspend.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#organization\",\"name\":\"SmartCloudSpend\",\"url\":\"https:\\\/\\\/smartcloudspend.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/smartcloudspend.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/cropped-Gemini_Generated_Image_8kqpol8kqpol8kqp-removebg-preview.png\",\"contentUrl\":\"https:\\\/\\\/smartcloudspend.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/cropped-Gemini_Generated_Image_8kqpol8kqpol8kqp-removebg-preview.png\",\"width\":453,\"height\":401,\"caption\":\"SmartCloudSpend\"},\"image\":{\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/smartcloudspend.com\\\/#\\\/schema\\\/person\\\/44ee75fea87758b75c9fa20bcb4736b5\",\"name\":\"Raul\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7528fdea3565b1d864e359aadcb71d1a08ebb6360994d6a7f695c45b0f3984ed?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7528fdea3565b1d864e359aadcb71d1a08ebb6360994d6a7f695c45b0f3984ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7528fdea3565b1d864e359aadcb71d1a08ebb6360994d6a7f695c45b0f3984ed?s=96&d=mm&r=g\",\"caption\":\"Raul\"},\"sameAs\":[\"https:\\\/\\\/smartcloudspend.com\"],\"url\":\"https:\\\/\\\/smartcloudspend.com\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Audit Salesforce and Jira Inactive Licenses Automatically","description":"Find and reclaim unused Salesforce and Jira licenses with SOQL, CLI and Python scripts. Step-by-step automation, safe offboarding rules...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/smartcloudspend.com\/?p=139","og_locale":"en_US","og_type":"article","og_title":"Audit Salesforce and Jira Inactive Licenses Automatically","og_description":"Find and reclaim unused Salesforce and Jira licenses with SOQL, CLI and Python scripts. Step-by-step automation, safe offboarding rules...","og_url":"https:\/\/smartcloudspend.com\/?p=139","og_site_name":"SmartCloudSpend","article_published_time":"2026-10-19T13:39:02+00:00","article_modified_time":"2026-10-30T12:06:30+00:00","og_image":[{"width":1774,"height":887,"url":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png","type":"image\/png"}],"author":"Raul","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Raul","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/smartcloudspend.com\/?p=139#article","isPartOf":{"@id":"https:\/\/smartcloudspend.com\/?p=139"},"author":{"name":"Raul","@id":"https:\/\/smartcloudspend.com\/#\/schema\/person\/44ee75fea87758b75c9fa20bcb4736b5"},"headline":"How to Audit Salesforce and Jira Inactive Licenses Automatically","datePublished":"2026-10-19T13:39:02+00:00","dateModified":"2026-10-30T12:06:30+00:00","mainEntityOfPage":{"@id":"https:\/\/smartcloudspend.com\/?p=139"},"wordCount":1724,"commentCount":0,"publisher":{"@id":"https:\/\/smartcloudspend.com\/#organization"},"image":{"@id":"https:\/\/smartcloudspend.com\/?p=139#primaryimage"},"thumbnailUrl":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png","articleSection":["SaaS Management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/smartcloudspend.com\/?p=139#respond"]}]},{"@type":"WebPage","@id":"https:\/\/smartcloudspend.com\/?p=139","url":"https:\/\/smartcloudspend.com\/?p=139","name":"Audit Salesforce and Jira Inactive Licenses Automatically","isPartOf":{"@id":"https:\/\/smartcloudspend.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/smartcloudspend.com\/?p=139#primaryimage"},"image":{"@id":"https:\/\/smartcloudspend.com\/?p=139#primaryimage"},"thumbnailUrl":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png","datePublished":"2026-10-19T13:39:02+00:00","dateModified":"2026-10-30T12:06:30+00:00","description":"Find and reclaim unused Salesforce and Jira licenses with SOQL, CLI and Python scripts. Step-by-step automation, safe offboarding rules...","breadcrumb":{"@id":"https:\/\/smartcloudspend.com\/?p=139#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/smartcloudspend.com\/?p=139"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/smartcloudspend.com\/?p=139#primaryimage","url":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png","contentUrl":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/Auditoria-automatica-de-licencias-Salesforce-y-Jira.png","width":1774,"height":887},{"@type":"BreadcrumbList","@id":"https:\/\/smartcloudspend.com\/?p=139#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/smartcloudspend.com\/"},{"@type":"ListItem","position":2,"name":"How to Audit Salesforce and Jira Inactive Licenses Automatically"}]},{"@type":"WebSite","@id":"https:\/\/smartcloudspend.com\/#website","url":"https:\/\/smartcloudspend.com\/","name":"SmartCloudSpend","description":"Cloud services budget optimizer","publisher":{"@id":"https:\/\/smartcloudspend.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/smartcloudspend.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/smartcloudspend.com\/#organization","name":"SmartCloudSpend","url":"https:\/\/smartcloudspend.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/smartcloudspend.com\/#\/schema\/logo\/image\/","url":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/cropped-Gemini_Generated_Image_8kqpol8kqpol8kqp-removebg-preview.png","contentUrl":"https:\/\/smartcloudspend.com\/wp-content\/uploads\/2026\/10\/cropped-Gemini_Generated_Image_8kqpol8kqpol8kqp-removebg-preview.png","width":453,"height":401,"caption":"SmartCloudSpend"},"image":{"@id":"https:\/\/smartcloudspend.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/smartcloudspend.com\/#\/schema\/person\/44ee75fea87758b75c9fa20bcb4736b5","name":"Raul","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7528fdea3565b1d864e359aadcb71d1a08ebb6360994d6a7f695c45b0f3984ed?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7528fdea3565b1d864e359aadcb71d1a08ebb6360994d6a7f695c45b0f3984ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7528fdea3565b1d864e359aadcb71d1a08ebb6360994d6a7f695c45b0f3984ed?s=96&d=mm&r=g","caption":"Raul"},"sameAs":["https:\/\/smartcloudspend.com"],"url":"https:\/\/smartcloudspend.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/posts\/139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=139"}],"version-history":[{"count":4,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/posts\/139\/revisions"}],"predecessor-version":[{"id":254,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/posts\/139\/revisions\/254"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=\/wp\/v2\/media\/158"}],"wp:attachment":[{"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartcloudspend.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}