Why Your Splunk Bill Tripled After Moving to Cloud (And How to Cut It Without Losing Coverage)

Retool's new app builder is where AI-generated code ships safely
Building apps with AI is easy. Getting them to production safely is another story.
Splunk Cloud charges by ingestion volume. The average enterprise ingests between 100 GB and 5 TB per day. At Splunk's standard pricing of roughly $150 per GB/day on an annual contract, a 500 GB/day environment costs approximately $2.7 million per year. When teams migrate from on-prem to Cloud, they routinely discover their actual ingest volume is 2-4x what they estimated, and nobody budgeted for that.
This guide covers the exact analysis and filtering strategies that have reduced Splunk Cloud bills by 40-60% in production environments without creating meaningful detection gaps. We will work through which log sources to look at first, what you can safely drop versus summarize, and how to implement event routing and index tiering.
Why Your Bill Jumped: The Migration Surprise
On-prem Splunk hid your true volume problem because disk was cheap and nobody tracked it carefully. When you move to Cloud, Splunk starts billing per GB of ingest and suddenly every log source has a dollar figure attached to it.
The three most common surprises when migrating to Splunk Cloud:
Firewall and network device logs. These are almost always the largest single contributor. A mid-size organization with 200 network devices easily generates 50-150 GB/day from firewall traffic logs alone. At the default verbosity settings, you are logging every permitted connection, every dropped packet, every NAT translation. That is not a security requirement. It is a habit.
Windows Security Event logs. The default Windows Security audit policy generates thousands of events per host per hour. A 2,000-seat Windows environment can easily push 80-120 GB/day. Most of that volume is logon noise (Event ID 4624), object access events for shares nobody cares about, and authentication chatter between machine accounts.
Endpoint telemetry duplication. Organizations that installed both an EDR agent and a Sysmon instance are often sending overlapping process creation, network connection, and file events to Splunk twice. The EDR vendor also runs their own cloud SIEM, so sometimes that data is going three places.
Step 1: Run the Volume Analysis (Before Touching Anything)
Before you filter or drop anything, you need to know where your bytes are actually coming from.
Run this search in Splunk to get a 7-day ingest breakdown by source type:
index=* earliest=-7d latest=now | eval gb_per_event=len(_raw)/1073741824 | stats sum(gb_per_event) as total_gb by sourcetype | sort -total_gb | eval daily_avg_gb=round(total_gb/7, 2) | eval monthly_est_gb=round(daily_avg_gb30, 0) | eval annual_cost_usd=round(monthly_est_gb30*150, 0) | table sourcetype, daily_avg_gb, monthly_est_gb, annual_cost_usd
Adjust the $150 figure to your actual contract rate. Run this for each index if you use multiple.
You will almost certainly find that 5-10 source types account for 75-85% of your total volume. Everything else is noise in the cost sense. Focus your optimization effort entirely on those top sources.
Briefings like this, every morning before 9am.
Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.
Step 2: Firewall Logs, Drop What You Cannot Act On
Firewall logs are the single highest-leverage target in most environments. The key insight is that permitted traffic logs are almost never your detection source. Your detections come from denied traffic, suspicious allowed traffic to known-bad IPs, and traffic pattern anomalies.
What you can almost always drop:
- Permitted inbound traffic from RFC 1918 (internal) addresses to internal destinations. You have this in your network flow data already.
- Permit logs for common benign services (DNS to your resolvers, NTP to your time servers, ICMP between monitoring systems).
- High-volume low-value log entries like Microsoft NPS RADIUS accounting logs that are just kept alive chatter.
What you must keep:
- All denied traffic (inbound and outbound).
- All traffic to/from external IPs on non-standard ports.
- Any traffic involving your internet-facing servers.
- Outbound connections on unusual ports (anything that is not 80, 443, 25, 587, 53, 123).
Implement this at the forwarder level using Splunk's props.conf and transforms.conf to drop events before they are transmitted to the indexer. Dropping at the forwarder means you never pay ingest cost for those events.
Example transforms.conf entry to drop routine permitted internal traffic:
[drop_internal_permit] REGEX = action="allow".*src_ip="(10.|172.1[6-9].|172.2[0-9].|172.3[01].|192.168.)".*dst_ip="(10.|172.1[6-9].|172.2[0-9].|172.3[01].|192.168.)" DEST_KEY = queue FORMAT = nullQueue
This pattern alone routinely cuts firewall ingest by 40-60% in environments with heavy internal East-West traffic.
Step 3: Windows Event Logs, Surgical Filtering
The Windows Security event log is a minefield of high-volume, low-value events when left at default audit settings.
The events you need for real detection coverage:
| Event ID | Name | Keep? |
|---|---|---|
| 4624 | Logon Success | Filter, keep only interactive (Type 2), remote interactive (Type 10), service (Type 5) logons; drop network logons (Type 3) from machine accounts |
| 4625 | Logon Failure | Keep all |
| 4648 | Logon with Explicit Credentials | Keep all |
| 4663 | Object Access | Drop entirely unless specific high-value paths are scoped |
| 4688 | Process Creation | Keep, but only from DCs and servers, not all workstations |
| 4698 | Scheduled Task Created | Keep all |
| 4720 | User Account Created | Keep all |
| 4732 | Member Added to Security-Enabled Local Group | Keep all |
| 4768 | Kerberos TGT Request | Keep all |
| 4769 | Kerberos Service Ticket | Keep failures and non-standard encryption only |
| 4776 | NTLM Authentication | Keep failures only |
The most impactful change is filtering 4624 Type 3 (network logon) events. In an Active Directory environment, domain-joined machines generate thousands of Type 3 logon events per hour for normal operations like file share access, printer connections, and scheduled task authentication. For most detection use cases these are noise.
Implement filtering at the Windows Event Forwarding (WEF) level or in Splunk Heavy Forwarder's inputs.conf whitelist. WEF is preferable because it stops events at the source before any transmission.
Expected volume reduction: 30-50% of Windows Security event log ingest, depending on your environment.
Step 4: Endpoint Telemetry Deduplication
If you are running an EDR alongside Sysmon and sending both to Splunk, audit for overlap. Most EDRs (CrowdStrike, SentinelOne, Microsoft Defender for Endpoint) collect:
- Process creation with command line arguments
- Network connection events
- File write events
- Registry modifications
- DNS queries
Sysmon collects exactly the same events. If you need Sysmon for historical data before your EDR contract, that is reasonable. If you have had your EDR for over a year and are still running Sysmon in parallel, you are paying for the same telemetry twice.
Decision matrix:
- EDR cloud console handles your threat hunting and incident response? Disable Sysmon on endpoints.
- EDR does not export raw telemetry to Splunk, or exports with a lag? Keep Sysmon for real-time detection.
- You have specific Sysmon event types the EDR does not expose (e.g., DNS query logging)? Keep only those specific Sysmon event IDs.
Step 5: Index Tiering and Summary Indexing
Splunk Cloud has three storage tiers that differ in search speed and cost:
Hot/Warm: Fastest search performance. Most expensive for long retention. Cold/Frozen (SmartStore): Slower search, but significantly cheaper per GB for long-term retention. Summary Indexes: Pre-aggregated data at low volume for long-term trending without storing raw events.
For compliance-driven retention requirements (PCI DSS requires 12 months, many internal policies require 2-3 years), the difference between keeping raw logs in hot/warm versus moving them to SmartStore after 90 days can cut long-term storage costs by 60-70%.
For log sources where you need trending data but not raw event search (e.g., authentication volume by user, failed login counts by source IP), use a saved search that runs every 15 minutes and writes aggregated summary data to a summary index. Then delete the raw events after 30 days instead of 12 months.
Example summary index pattern for authentication volume:
index=windows EventCode=4625 | stats count as failed_logons by user, src_ip | collect index=summary_auth sourcetype=auth_summary
This compresses 30 days of authentication failure data into a fraction of the raw volume while preserving the ability to trend by user and source.
Step 6: Ingest Actions and Pipelines in Splunk Cloud
Splunk Cloud's native Ingest Actions feature lets you route, filter, and transform events at ingestion time without requiring a Heavy Forwarder. This is the preferred approach in fully Splunk Cloud environments.
Key capabilities:
- Drop: Discard matching events entirely (never counted toward your ingestion quota).
- Route: Send high-volume low-value data to a cheaper cold index instead of your main security index.
- Mask: Redact sensitive fields (PII, credentials) before indexing.
Build an Ingest Action pipeline for each high-volume source type. Start with the top 3 by volume from your Step 1 analysis. Test each filter against a representative sample before enabling in production.
Step 7: The 30-Day Reduction Project
The fastest path to meaningful cost reduction:
Week 1: Run the volume analysis. Identify your top 5 source types by GB/day. Do not change anything yet.
Week 2: For each of those 5 source types, document what detections currently use it. Check your detection inventory (if you have one) or search your saved alerts for references to those source types. This tells you what you cannot safely drop.
Week 3: Implement drops at the forwarder for events with no detection dependency. Start conservative. Drop only events that are definitively not referenced in any alert or saved search.
Week 4: Measure. Run the volume analysis again. Calculate the reduction percentage. If coverage held (re-run your detections on the same test data and confirm they still fire), expand the filtering scope.
Most teams see 25-35% reduction in the first pass. The second pass, done 30-60 days later with more confidence in what is safe to filter, gets the rest.
Common Mistakes That Create Detection Gaps
Dropping entire source types without a detection audit. You will eventually discover that a Tier 1 alert you relied on for 2 years silently stopped working because the source type it queried no longer exists.
Filtering at the indexer instead of the forwarder. Events filtered at the indexer still count toward your ingest quota. You only save storage, not ingestion cost.
Applying global drops to compliance-required sources. PCI DSS, HIPAA, and SOC 2 auditors will ask for specific log types. Make sure your filter list has been reviewed against your compliance obligations before enabling.
Not documenting what you dropped and why. Six months from now, an incident will happen and someone will ask why a specific log source is missing. Document every drop decision with the date, the detection audit that was performed, and the business justification.
Realistic Outcomes
Organizations that apply the firewall, Windows event, and endpoint deduplication strategies typically see:
- Firewall logs: 40-60% reduction
- Windows Security events: 30-50% reduction
- Endpoint telemetry (with EDR in place): 50-100% reduction if Sysmon is disabled
- Overall bill: 35-55% reduction for a standard enterprise environment
The bottom line
The key constraint is detection coverage. Every byte you drop must be accounted for against your detection inventory. The goal is to stop paying for logs that produce no alerts and support no investigations, not to cut costs by creating blind spots.
Frequently asked questions
How do I know what I can safely drop from Splunk without breaking my detections?
Run a detection dependency audit before dropping anything. Search your saved alerts, correlation searches, and notable event definitions for references to each source type you are considering dropping. In Splunk ES, the 'Data Models' and 'Content Management' views show which correlation searches use which data model fields. For custom alerts, grep your savedsearches.conf for the source type name. Only drop events where zero active detections reference that source type, and then validate by running those detections against a test dataset to confirm they still fire.
Does filtering at the Heavy Forwarder actually reduce my Splunk Cloud bill?
Yes, but only if you drop events before they are transmitted. Events filtered at the indexer via transforms.conf on the indexer side still count against your ingest quota because Splunk counts data as it enters the ingestion pipeline. Drops must happen at the forwarder (via nullQueue in transforms.conf on the forwarder) or via Ingest Actions in Splunk Cloud before the event hits the indexer. If you are on Splunk Cloud, Ingest Actions is the preferred mechanism because it runs on Splunk's infrastructure before billing is counted.
What is the typical Splunk Cloud cost per GB and how does it compare to on-prem?
Splunk Cloud list pricing runs approximately $100 to $200 per GB per day on an annual contract, depending on volume commitments and Enterprise Agreement terms. At 200 GB/day that is roughly $7,300 to $14,600 per day or $2.7M to $5.3M per year. On-prem licensing is typically capacity-based (per GB indexed per day) at a lower rate per GB but with hardware, maintenance, and operations overhead added. The Cloud premium is real, but so is the elimination of hardware capital expenditure. The shock comes from discovering actual ingest volume is 2-4x what was planned for in the business case.
Is there a way to keep long-term log retention without paying full Splunk Cloud storage rates?
Yes. Splunk Cloud's SmartStore feature stores data in object storage (S3 or equivalent) and retrieves it on demand for search. This is dramatically cheaper than hot/warm storage for data older than 30-90 days. For compliance retention where you need the data to exist but rarely query it, move your index's hot to warm to cold tiering thresholds so that data transitions to SmartStore after 30 days. For data where raw events are not needed at all for historical trending, use summary indexing to pre-aggregate the data and then delete the raw events after your minimum required retention period.
Can I use Cribl or a similar pipeline tool to reduce Splunk Cloud costs?
Yes. Cribl Stream (and similar tools like Elastic Logstash with filtering, Gravwell, or Tenzir) sit in front of Splunk as a data pipeline and can filter, aggregate, sample, and route events before they hit Splunk's ingest pipeline. This is especially useful when you cannot modify forwarder configurations directly (e.g., third-party log sources or SaaS API ingestion). Cribl is widely used specifically for Splunk cost reduction. The trade-off is an additional infrastructure component to operate and license.
What Windows Event IDs are safe to drop entirely in most environments?
The safest to drop: 4634 (Logoff) in most detection use cases since you have the logon event; 4656 and 4658 (Object handle open/close) unless you have specific file access detection requirements; 4663 (Object access) at scale unless scoped to specific critical paths; 5156 and 5158 (Windows Filtering Platform connection permitted) if you have network flow data elsewhere; 4672 (Special privilege logon) in isolation, as it is redundant with 4624 when correlated. Never drop: 4625 (logon failure), 4648 (explicit credential use), 4688 (process creation) from servers, 4698/4699 (scheduled task create/delete), 4720/4732 (account/group changes), and all Kerberos failure events (4768 failure, 4771, 4776 failure).
How long does it take to see cost reduction results after implementing filtering?
Splunk Cloud billing is typically calculated on a rolling daily average over your contract period. Changes in ingest volume are visible in the Monitoring Console within hours of implementing forwarder-side drops. If you are on a capacity license (GB/day), you will see the daily average drop within the same billing cycle. If you are on a workload pricing model (compute units), the relationship between ingest reduction and billing is less direct. In both cases, expect to see measurable evidence of volume reduction within 24-48 hours of implementing filters, and billing impact in the next invoice cycle.
Sources & references
Free resources
Critical CVE Reference Card 2025–2026
25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.
Ransomware Incident Response Playbook
Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.
Get threat intel before your inbox does.
50,000+ security professionals read Decryption Digest for early warnings on zero-days, ransomware, and nation-state campaigns. Free, daily, no spam.
Unsubscribe anytime. We never sell your data.

Founder & Cybersecurity Evangelist, Decryption Digest
Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.
Win a $2,495 Black Hat pass.
Full-access to Black Hat USA 2026 in Las Vegas. Subscribe free to enter.
