You just built your new Discord bot, and it works. It replies to commands, plays music (if it’s a music bot), and registers slash commands, but everything feels a bit slow. You made yourself a simple /ping
command, and after running it, you get this:

Yeah… Disappointing
Discord bots have two kinds of pings you’ll see:
- WebSocket ping: This is how quickly your bot talks to Discord’s servers.
- Response time: This is how long it takes for your bot to reply after someone uses a command.
If either one is too high, your bot’s gonna feel slow, commands take forever, music cuts out, and everything feels laggy.
Doesn’t matter if it’s a simple bot or a big moderation bot; keeping ping low makes everything run smoother.
In this blog, we’ll start with a slow, high-ping bot and improve it step by step, explaining why each issue occurs, how to fix it, and what kind of result you can expect. Let’s dig in.
Step 1: Switch to a Better Host
In most cases, the problem is that you are running your bot on your PC or a Free Hosting Plan.
Running your bot on your laptop, Wi-Fi, or a free hosting plan (such as Glitch or Replit) is fine for testing purposes. But those platforms aren’t optimized for uptime, speed, or scalability. You share resources with others, you’re limited in bandwidth, and you can get disconnected randomly.
Also, Discord’s servers are global; if your bot is hosted far from the nearest Discord region, every single request has to travel a longer distance, and that means more latency.
What should you do?
Move to a VPS or a reliable Cloud Host. Here are some examples:
- Cybrancee: Built for Discord bots, offering a lot of resources and locations. Also, it has a user-friendly panel and easy deployment.
- Railway: Easy deploy, free tier, fast boot. Best for small bots.
- Pebble Host / BisectHosting / ZAP-Hosting: Simple panel and Discord-focused services.
- Hetzner / DigitalOcean / Linode: Great for advanced users who want full control.
Pro tip: Host your bot in the region closest to your users. If most of your community is in Europe, don’t host it in the U.S.
In this blog, I’m going to host my bot on Cybrancee. You can have a look. Prices start at $1.49.
Let’s see how our ping looks now.

Massive improvement just by moving your hosting.
Step 2: Reduce Event Listeners and Gateway Intents
Another problem can be that your bot listens to every single event.
By default, many bots subscribe to a ton of Discord gateway events they don’t even use.
Events like voiceStateUpdate
, presenceUpdate
, or guildMemberUpdate
are constantly updating, especially in large servers.
Every event your bot listens to consumes RAM and CPU, forcing it to handle more data even if it doesn’t need to.
What should you do?
Make your bot listen to only what it needs.
In discord.js v14, you can customize gateway intents when creating the bot. Here’s how:
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
- Don’t add
voiceStateUpdate
if you’re not doing anything with voice. - Use
presenceUpdate
only if you’re tracking user status. - Avoid
guildPresences
andguildMembers
in large servers unless absolutely needed.
After a little bit of cleaning the code.

Step 3: Optimize Your Command Code
Most of the time, you may do too much in one go.
A lot of beginners write all the logic inside the command handler directly. Things like:
- Reading files with
fs.readFileSync()
, this function blocks everything. - Querying a slow database multiple times.
- Making network requests on each command.
- Massive if/else chains instead of a clean logic.
All of these block your event loop and delay the bot’s ability to respond quickly.
What should you do?
- Use sync functions and await properly.
- Split long logic into modules or helpers.
- Avoid blocking functions (use
fs.promise
instead offs.readFileSync()
) - Don’t make the same DB/API call over and over; cache your result (if it’s the same).
For example:
Instead of
const config = JSON.prase(fs.readFileSync(‘config.json’));
Use
const config = JSON.prase(await fs.promise.readFile(‘config.json’));
Also, use try/catch properly to avoid unhandled errors that freeze your bot.
After some optimization:

Step 4: Cache Database Results
If you are querying the database every time, that can be a problem.
If your bot calls the database every time a command runs, that adds unnecessary delay. If the DB is hosted somewhere else (like MongoDB Atlas), there is a network latency combined with query time.
What should you do?
Use the In-Memory Caching function. Here’s a simple, basic in-memory cache using a Map:
const userCache = new Map();
async function getUserData(userId) {
if (userCache.has(userId)) return userCache.get(userId);
const data = await db.users.findOne({ id: userId });
userCache.set(userId, data);
return data;
}
Pro tip: Also add indexes to your Mongo/SQL collections so they query faster.
Let’s see how the ping looks after adding caching functions:

Step 5: External API Calls
If you have a bot that calls external APIs (e.g., weather, currency, songs, etc.). If that API is slow or down, your whole bot will be slow.
What should you do?
Add some timeouts plus background fetching. Also, use AbortController
for fetch requests, and don’t wait forever. AbortController is a built-in JavaScript class used to abort asynchronous operations, such as fetch
requests, or anything that supports AbortSignal API. Basically, AbortController
is like a cancel button for your API call, if you’re making a request to the Discord API (e.g., getting user info), and something changes (e.g., user goes offline), you can use AbortController
to stop the request before it finishes, so your bot doesn’t waste time or crash.
Here’s an example:
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 3000); // 3s timeout
try {
const res = await fetch('https://api.com/data', { signal: controller.signal });
const json = await res.json();
clearTimeout(timeout);
return json;
} catch (err) {
return { error: 'API failed or slow' };
}
If it’s not something important, fetch it in the background and cache it every few minutes.
After we fixed the slow calls:

Bonus: Track Ping Over Time
If you really want to see how your bot performs over time, you can set up a ping monitor.
Here’s how to set up a ping monitor and see how your bot performs:
setInterval(() => {
console.log(`[${new Date().toISOString()}] Ping: ${client.ws.ping}ms`);
}, 60000);
This function logs your bot’s ping into a file or database every 6 minutes.Use tools like UptimeRobot, Grafana, or Prometheus if you want to see the ping on a dashboard.
Final Result
We started with this:

The bot was hosted on Wi-Fi, listening to everything, querying slow APIs live, and blocking on file reads.
Now we have this:

The bot is hosted properly, cleaned up, optimized, and lightning fast.
Summary
If you want your bot to respond quickly and feel smooth to users, there are a few things that make a big difference. Start by hosting your bot on a reliable VPS or cloud hosting service, ideally in a region close to your user base. This cuts down on latency from the start.
Next, try to keep things lightweight. Don’t overload your bot with every possible event from Discord; use only the gateway intents you actually need. The same goes for your codebase; keep it clean and logical.
Behind the scenes, check your bot’s handle data. If it’s constantly calling a database or external API, caching those calls can help a lot. Use timeout and background tasks for anything slow, especially API calls that are slow.
Finally, keep an eye on performance over time. Monitor ping regularly so you know when something breaks or slows down.
Low ping isn’t just a number; it’s about making your bot feel responsive. Whether you’re building a personal tool or running a public bot, these tweaks can make a big difference.
Happy coding!