Fox CharacterCharacterAnimationAIby PostMCP AI
Get started
  1. Home
  2. Blog
  3. How to Make Animated Stickers: WhatsApp, Telegram, Discord, iMessage
GUIDES

How to Make Animated Stickers: WhatsApp, Telegram, Discord, iMessage

You have a character and you want it waving, laughing and giving thumbs-ups in your group chats. The hard part is not the animation: it is that WhatsApp, Telegram, Discord, iMessage and Slack each demand a different file, size and length. This guide gives you every limit from the official docs and the exact commands to hit them from one transparent source.

Published October 29, 2026 12 min readBy the Character Animation AI team

Animated sticker size and format requirements, app by app

Every major messaging app supports animated stickers, and no two of them agree on the file. WhatsApp wants animated WebP, Telegram wants VP9 WebM, Discord wants APNG, iMessage takes APNG or GIF, and Slack only animates GIF. Canvas sizes, file caps and durations differ just as much, which is why most “my sticker won’t upload” problems come down to a single number being slightly over. Here is the full set, checked against each platform’s own documentation in October 2026:

DestinationAnimated formatCanvasFile capLengthAlso note
WhatsApp stickerAnimated WebP512 × 512 px, exact500 KB10 s max3 to 30 per pack; a pack is all animated or all static; static 96 × 96 tray icon under 50 KB
Telegram video stickerWebM, VP9, no audio512 px on one side, the other 512 or less256 KB3 s maxUp to 30 fps; should loop; up to 120 per set
Telegram custom emojiWebM, VP9, no audio100 × 100 px256 KB3 s maxAnyone can create; adding and using sets needs Premium; up to 200 per set
Discord stickerAPNG (the API also accepts GIF)320 × 320 px, exact512 KB5 s maxUp to 60 fps; 5 free slots per server, 15 / 30 / 60 at Boost levels 1 to 3
Discord emojiGIF128 × 128 px256 KBNot stated50 static slots plus 50 animated; boosts raise the totals to 100 / 150 / 250
iMessage stickerAPNG or GIF300, 408 or 618 px square500 KBNot statedOne size per pack; ships as an App Store app; GIF transparency is single-colour, APNG’s is 8-bit
Slack custom emojiGIFSquareUnder 128 KB recommended50 framesWorkspace owners can restrict who adds emoji

The tightest limits are Telegram’s 3 seconds and the small caps on Discord emoji and Slack, so a 2 to 3 second loop works everywhere. And since every app wants a transparent background, the one asset worth having is a transparent master at 512 px or larger. Each section below links its official source, because these limits change.

Design rules that make a sticker read at thumbnail size

Stickers are seen small and fast: Discord renders them at 160 × 160 on desktop, and emoji are smaller still. The platforms’ own guidance points the same way:

  • Fill the canvas. Discord’s creator tips say to use as much canvas as possible. Crop tight; empty margins are wasted pixels.
  • Add an outline. WhatsApp recommends an 8 px white outer stroke so stickers stay visible on any chat wallpaper; Telegram suggests a white stroke with a dark shadow.
  • Make the first frame a complete pose. WhatsApp’s guidelines say the animation comes to rest on the first frame after looping, so frame one must not be mid-blink or mid-blur.
  • One emotion per sticker. People pick stickers by feeling (“lol”, “yes!”, “ugh”), and Discord suggests naming each sticker after its emotion.
  • End where you start. A sticker loops constantly; a pop at the seam is far more visible than in a one-off video.
  • Keep lettering short and heavy. One word in a bold face survives at 100 px; a sentence does not.
  • Keep the character identical across the pack. Drift between stickers reads as different characters.
The vector route: Telegram’s other animated format, .TGS, is a Lottie animation exported from After Effects with the Bodymovin-TG plugin (512 × 512, 60 fps, up to 3 seconds, 64 KB), and Discord accepts Lottie stickers only on Verified or Partnered servers. If you animate in vectors, that path is the sharpest; this guide covers rendered (pixel) animation, which every app accepts. The Lottie vs GIF vs transparent video guide compares the two worlds.

Making the animation: draw it, or generate a whole pack from one character

Animating by hand? Any tool works if the export keeps transparency (a PNG sequence, or VP9 WebM or ProRes 4444 with alpha), drawn square at 512 px or larger. Eight to twelve drawings per second is plenty for a sticker.

Otherwise, note that a sticker pack is one character performing several emotions, which is exactly what an AI studio with locked designs does well. In Character Animation AI you describe the character (or upload a sketch or mascot as a reference), pick a style and approve the design; every later animation reuses it, so the pack stays consistent. One animation per emotion:

  • Hello: the Wave preset.
  • Excited: Jump or Bounce.
  • Laughing: Custom, “laughs with eyes squeezed shut, shoulders shaking, then catches its breath”.
  • Approval: Custom, “gives a big thumbs-up and a quick wink, then relaxes”.
  • Chill or waiting: the Idle preset.

A design costs one credit and each animation one more, so a minimum WhatsApp pack (three stickers) is four credits. Clips render at 720 × 720, 24 fps, 4 to 12 seconds, background removed, as transparent WebM, ProRes 4444 MOV, 1-bit-transparent GIF and MP4 (see how it works; the image-to-animation guide covers starting from existing art). AI models are unreliable at lettering, so add caption words afterwards.

The free editor (no credits) does most of the sticker-specific work before you touch a command line. Trim to the single best beat (cuts can be as short as 0.5 seconds), then set the direction to back and forth: the cut plays forwards and then in reverse, so a 1.5-second cut becomes a seamless 3-second loop, exactly Telegram’s limit. Speed (0.5× to 2×) shortens or stretches it further. Then pick the smallest output size at or above your target:

DestinationEditor output sizeCut length to aim for
WhatsApp, Telegram sticker720 Original (scaled to 512 below)3 to 4 s for WhatsApp; 3 s or less for Telegram
iMessage480 Website (to 408) or 360 Small (to 300)2 to 3 s
Discord sticker360 Small (to 320)About 2 s for full-colour APNG; 5 s max
Discord, Slack or Telegram emoji240 Tiny (to 128 or 100)About 3 s (45 frames at 15 fps)

Every saved cut is re-exported in all four formats at the chosen size, so the WebM from the cut is your master for the recipes below.

The ffmpeg gotcha that silently deletes your transparency

Before any recipe, one trap catches almost everyone converting a transparent WebM. A VP9 WebM stores its alpha channel as a separate layer alongside the colour video. ffmpeg’s built-in VP9 decoder ignores that layer, so if you write ffmpeg -i in.webm … the alpha is gone before your filters run, and the sticker comes out on a solid (usually black) square. No error, no warning. The fix is to name Google’s libvpx decoder before the input:

# Wrong: the built-in decoder drops alpha, result is opaque
ffmpeg -i character.webm -frames:v 1 check.png

# Right: force the libvpx-vp9 decoder before -i
ffmpeg -c:v libvpx-vp9 -i character.webm -frames:v 1 check.png

Open both PNGs: the first is opaque, the second transparent. When ffmpeg prints the input stream, the libvpx version reports yuva420p (the “a” is alpha) where the built-in decoder reports yuv420p. Every WebM recipe below starts with -c:v libvpx-vp9 -i for this reason. GIF inputs do not need it: ffmpeg’s GIF decoder keeps transparency on its own. The transparent video formats guide explains how each container stores alpha.

How to make animated WhatsApp stickers

WhatsApp’s rules come from its official sticker guidelines on GitHub: animated WebP, exactly 512 × 512, 500 KB or less, 10 seconds or less, every frame at least 8 ms, and the first frame a complete pose. Convert your transparent master like this:

ffmpeg -c:v libvpx-vp9 -i character.webm -t 4 \
  -vf "fps=15,scale=512:512:flags=lanczos" \
  -c:v libwebp_anim -lossless 0 -quality 60 -compression_level 6 \
  -loop 0 -an sticker.webp
  • -loop 0 is not optional. ffmpeg’s WebP writer defaults to a loop count of 1, which plays the sticker once and stops.
  • libwebp_anim, not libwebp. Many guides use plain -c:v libwebp. That path writes every frame with blending on and no disposal, so on a transparent sticker the earlier frames show through as trails. The animation encoder handles this properly.
  • Size levers, in order of impact: length (-t), frame rate (fps=12 to 15 is plenty), then -quality (drop towards 40). In our test, a bouncing flat-style character at 512 px, 15 fps and 4 seconds came out around 350 KB with libwebp at quality 50.
  • Non-square source? Replace the scale with scale=512:512:force_original_aspect_ratio=decrease,pad=512:512:-1:-1:color=black@0 to centre it on a transparent canvas.

Not every ffmpeg build includes WebP encoding (run ffmpeg -hide_banner -encoders | grep webp; some, including recent Homebrew builds, print nothing). In that case export frames and use img2webp from Google’s libwebp tools (the webp package on Homebrew and most Linux distributions), which loops forever by default:

mkdir -p frames
ffmpeg -c:v libvpx-vp9 -i character.webm -t 4 \
  -vf "fps=15,scale=512:512:flags=lanczos" frames/f_%03d.png
img2webp -loop 0 -lossy -q 60 -m 6 -d 67 frames/f_*.png -o sticker.webp

# Tray icon: static, 96 x 96, under 50 KB
ffmpeg -c:v libvpx-vp9 -i character.webm -frames:v 1 \
  -vf "scale=96:96:flags=lanczos" tray.png

-d 67 is the frame duration in milliseconds (1000 ÷ 15 fps). Getting the finished stickers into WhatsApp has three routes:

  1. A sticker-maker app. Third-party packs reach WhatsApp through an app with an “Add to WhatsApp” button. Sticker apps such as Sticker.ly do this for you (search the Play Store for “WAStickerApps”, the keyword WhatsApp asks them to use). Test how an app treats transparency and re-compression before building a whole pack.
  2. Your own pack app. WhatsApp publishes sample Android and iOS projects in the same GitHub repository: drop in 3 to 30 WebP files and a tray icon, edit the pack details, build. Packs cannot mix static and animated stickers, and each pack needs its own add button.
  3. WhatsApp’s built-in sticker maker. It turns photos into stickers, and since 2025 it can group them into shareable packs, but Meta’s announcements describe photo stickers, not animated ones.

How to make Telegram video stickers and custom emoji

Telegram’s sticker documentation sets the video rules: WebM with the VP9 codec, one side exactly 512 px (the other 512 or less), at most 3 seconds, up to 30 fps, 256 KB or less, no audio stream, and looped. Telegram’s own tips recommend a transparent background, which VP9’s alpha channel provides:

ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 \
  -vf "scale=512:512:force_original_aspect_ratio=decrease:flags=lanczos" \
  -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 400k -an sticker.webm
  • -pix_fmt yuva420p pins an alpha-capable pixel format on the way out. ffmpeg usually picks it from a transparent input anyway, but stating it means a filter added later cannot quietly hand the encoder an opaque format.
  • -an removes any audio stream, which Telegram rejects outright.
  • -b:v 400k is the size dial. 256 KB over 3 seconds is about 680 kbit/s in total, and the alpha layer costs extra on top of the target, so 400k leaves headroom: our test clips landed between 165 and 190 KB. Over the cap? Drop to 300k.
  • Frame rate: a 24 fps master is already under the limit; for a 60 fps source, add fps=30, at the start of the filter.
  • From a GIF: delete the first -c:v libvpx-vp9 (before -i); the rest is identical.

For a video custom emoji, change the scale to scale=100:100 and the bitrate to around 150k. Anyone can create emoji packs, but adding and using custom emoji sets is a Telegram Premium feature, so plan a sticker set for everyone and treat emoji as a bonus for Premium users.

To publish, open the @Stickers bot or its Mini App. Send /newvideo for a video sticker set or /newemojipack for emoji (/start lists the current commands). The bot then walks you through sending each .webm file, assigning it an emoji, and choosing the short name that becomes the pack’s link. A sticker set holds up to 120 stickers and an emoji set up to 200.

Discord animated stickers and animated emoji

Discord’s sticker creator tips ask for APNG (PNG for static), exactly 320 × 320, at most 512 KB, and up to 60 fps; the developer docs add a 5-second cap on animated stickers. Discord’s API and a 2025 Discord blog post also accept GIF, but APNG keeps soft edges:

ffmpeg -c:v libvpx-vp9 -i character.webm -t 2 \
  -vf "fps=12,scale=320:320:flags=lanczos" \
  -plays 0 -f apng sticker.png
  • -plays 0 makes it loop. The APNG default is 1, which plays once and freezes.
  • -f apng is needed because the file ends in .png, and with that extension ffmpeg would otherwise choose its still-image writer.

APNG is lossless, and that bites. In our tests a simple flat-style character at 320 px, 15 fps and 3 seconds came to about 650 KB as full-colour APNG; at 12 fps and 2 seconds it fit at around 350 KB. If you need the longer loop, reduce the image to a 256-colour palette, which brought the same 3-second clip under 200 KB at the cost of hard (1-bit) edges, the same trade-off a GIF makes:

ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 \
  -vf "fps=15,scale=320:320:flags=lanczos,split[a][b];[a]palettegen=reserve_transparent=1[p];[b][p]paletteuse=alpha_threshold=128" \
  -plays 0 -f apng sticker.png

Upload from the desktop or web app (not mobile): Server Settings → Stickers → Upload Sticker, then add a name, a related emoji and a short description for screen readers. Preview it in that upload window; Discord notes that an APNG dropped into chat as an ordinary file will not animate. Every server has 5 free sticker slots, rising to 15, 30 and 60 at Boost levels 1, 2 and 3 (2, 7 and 14 boosts). Anyone in the server can use its stickers there; Nitro members can use them anywhere on Discord.

Animated emoji are GIFs under 256 KB, and Discord’s developer docs describe a 128 × 128 image. The same palette filter produces one (and the 45 frames it makes also fit Slack, below):

ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 \
  -vf "fps=15,scale=128:128:flags=lanczos,split[a][b];[a]palettegen=reserve_transparent=1[p];[b][p]paletteuse=alpha_threshold=128" \
  -loop 0 emoji.gif

Add it under Server Settings → Emoji → Upload Emoji, or through Add Emoji in the desktop emoji picker. Discord’s help centre lists 50 static emoji slots by default plus 50 animated slots that it ties to Nitro, and Boost levels raise the emoji totals to 100, 150 and 250. Using a server’s emoji outside that server requires Nitro. If your Discord character also appears on stream, the PNGTuber avatar guide covers the reactive version of the same idea.

Animated iMessage stickers and Slack custom emoji GIFs

iMessage has two very different things called stickers. Live Stickers are personal: in a Messages conversation tap +, then Stickers, open the Live Stickers tab and tap + to lift a subject out of one of your photos (use a Live Photo and it moves). They come from your camera roll, not from an animation file you made. A distributable pack is an app: Xcode’s sticker pack app template needs no code, you drag images into its sticker asset catalogue, choose the sticker size, test it in the Simulator’s Messages app, and submit it through App Store Connect, which requires the Apple Developer Program ($99 a year).

Apple’s Human Interface Guidelines set three sticker sizes at @3x: Small 300 × 300, Regular 408 × 408 and Large 618 × 618, one size for the whole pack, and each file 500 KB or smaller. Both APNG and GIF animate, but GIF transparency is single-colour while APNG supports 8-bit transparency, so APNG gives cleaner edges on coloured chat bubbles. Reuse the Discord APNG command with scale=408:408 for Regular or scale=300:300 for Small. In our test, full-colour APNG at 408 px stayed under 500 KB at 12 fps for 2 seconds; for longer loops switch to the palette version.

Slack is the simplest and the strictest. Its help article says square images under 128 KB with transparent backgrounds work best, in JPG, PNG or GIF, and that GIFs can include up to 50 frames. At 15 fps that is 3.3 seconds, so the 128 px emoji command above (45 frames) fits the frame limit; just confirm the file is under 128 KB. On desktop, click the smiley face in the message field, then Add emoji → Upload image, name it and save. Custom emoji cannot be added from the Android app, and workspace owners can restrict who adds them.

Selling a sticker pack, and your next step

Stickers you make for yourself, your friends or your own community server are personal use. Selling a pack, publishing a sticker app with ads or purchases, or making stickers of a company’s mascot for its marketing is commercial use. On Character Animation AI only the Professional plan includes a commercial licence; Free, Starter and Creator cover personal, educational and internal projects. Check the pricing page before you put a pack on a store. And only make stickers of characters you own or have permission to use.

A pack that passes every check, in order:

  • One locked character, three to five emotions, each a single clear action on a transparent background.
  • Each clip trimmed to its best beat and set to back and forth, 2 to 3 seconds long, first frame a complete pose.
  • WebM masters decoded with -c:v libvpx-vp9 before -i, every time.
  • Loop flags set: -loop 0 for WebP and GIF, -plays 0 for APNG.
  • File sizes checked against the table at the top before uploading, not after the upload fails.

If you do not have the character yet, the free credits on a new account cover a design and its first two animations, enough to test the whole pipeline end to end; the character design prompts guide helps you get a sticker-friendly design on the first try. Create a free account, make the wave, and see it in your own chat today.