The Actual Process
To upload a decal on Roblox, you need to go to the Creator Dashboard at create.roblox.com. From there, click Upload in the top bar and select Decal. You'll be prompted to choose an image file from your computer. The file gets uploaded to Roblox servers and you receive an Asset ID, which is what you actually use in-game. Roblox has strict requirements for what they'll accept. The image needs to be in PNG or JPG format, though PNG is the default and the one you should stick with since it handles transparency better. There's a minimum resolution of 32x32 pixels and a maximum of 1024x1024. Files over 4 MB get rejected outright. You also need a $10 Robux fee per upload now, which is something that changed a while back and still catches people off guard.
How To Upload Decals On Roblox
Here's the practical walkthrough. Create your image in whatever tool you use — Photoshop, GIMP, Aseprite, whatever — make sure it's square and within the size limits. Export it as a PNG. Go to the Creator Dashboard, click Upload, select Decal, pick the file. Wait for it to process. It usually takes about 10 to 30 seconds depending on file size and server load. Once it shows up in your uploaded assets, copy the Asset ID from the URL or the asset page. To actually use it in a game, you either reference it in a script with a Decal object or set it on a BasePart through the properties window in Studio. In Studio, select the part, find the Texture property under the Material section, and paste the Asset ID there. Or you can drop a Decal object directly onto a part and enter the ID in the Texture field. I spent probably two weeks in 2022 dealing with a specific issue where my decals would upload fine, get the Asset ID, but when applied to parts in-game they'd show up completely black or invisible. Turns out Roblox's compression was re-encoding my PNGs as low-quality JPEGs on their end, destroying the color data. The workaround was to convert every decal to a proper sRGB PNG with no alpha channel first, save it with the lowest compression setting possible, and then upload that version. That stopped the black texture problem entirely. I also learned that using the Decal object instead of the Texture property on the part itself is more reliable for complex cases, especially when you need transparency. Texture tends to blend weirdly with the part's base material, but Decal sits on top cleanly.
Another thing people don't typically mention is that uploaded decals go through a moderation queue. If your image has certain colors, symbols, or content patterns, it can get held for hours or even days. I had a simple blue gradient circle get flagged and stuck in moderation for about 18 hours. There's nothing you can really do except wait, unless you edit the image slightly — even changing a pixel or two can reset the moderation check and push it through faster. Don't try to game the system with intentionally suspicious images though, that just makes it worse. There are real limitations here. The 1024x1024 cap means you can't make high-resolution decals for things like large wall murals without some creative tiling or using multiple smaller decals. Transparency doesn't always work the way you expect either — if your PNG has an alpha channel, Roblox will render it correctly on Decal objects, but TransparentMaterial on the part has to be enabled or the transparency gets ignored. And once a decal is uploaded, you cannot change the image. If you made a mistake, you have to delete the asset and upload a new one, which generates a new Asset ID and breaks any references to the old one in your games. For a cleaner workflow, I keep a folder structure on my computer with subfolders for each project, naming files with a version number and a short description. Something like lobby_walltexture_v03.png rather than just texture.png. It sounds trivial until you've uploaded six nearly identical versions and can't tell which Asset ID corresponds to which image.
Get the Full Details

If you're doing this at scale, the manual dashboard method gets tedious. There's no bulk upload option. Each decal is one at a time with the $10 fee. Some studios end up writing a script using the Roblox API to automate uploads, but that requires setting up authentication with an API key and understanding how to handle rate limits and error responses. It's viable if you're uploading hundreds of decals, but for a small project the manual route is fine. The big pitfall I see most beginners run into is trying to use decals on the wrong surface types. Decals respect the BasePart's material in ways that aren't obvious. On Smooth or Plastic materials they look fine, but on Wood, Leaf, or Fabric they blend in weird ways because the material shader modifies the texture mapping. If your decal looks distorted or misplaced, it's often a material issue, not a texture issue. Switching the part to Smooth or checking the NormalMap and TopMap properties can fix it.