How to wear your own UGC without putting the item on sale
You uploaded (or want to upload) an accessory and you are not sure whether you have to put it on sale to wear it on your avatar. You do not: "on sale" is a separate button, and before that you can wear the item for free inside Studio.
Produced with AI and checked by automated verification. This text carries no source list. No person read this text before publication. Editorial Policy
Yes, you can wear a UGC item you uploaded yourself without putting it on sale. On Roblox, "uploading the item" and "putting the item on sale" are two different steps, and that is exactly where the confusion starts: when moderation approves your accessory, a copy of it lands in your inventory automatically, and you can already equip it on your avatar even if the sale button stays off forever. And there is a route before that one, which costs nothing: wearing the accessory on your character inside Roblox Studio, with no upload, no fee and no waiting for moderation.
Yes, you can wear it without putting it on sale
The problem behind this question is almost never curiosity. It is fear of spending wrong.
The upload fee for a UGC accessory is 750 Robux per item, charged the moment you confirm the upload — before any human or robot looks at your model. If you upload the hat, wait for approval, equip it and discover that it came out the size of a fridge or floating 20 centimetres above the head, the fix is not editing the existing item: it is uploading another one. Four attempts until the scale is right is 3,000 Robux spent just to see the item on the character's body.
So separate the four states of an avatar item in your head, because Roblox's vocabulary mixes them all together:
- A file on your computer — an
.fbxor.objwith the texture. It does not exist for Roblox yet. - An uploaded mesh — you import the model in Studio and it gets an ID. Uploading a mesh and an image is free.
- An approved avatar item — this is where the 750 Robux, the moderation queue, and the copy that appears in your inventory come in.
- An item on sale — a button switched on, with a price and (in practice) a Premium subscription on the account. This is what most people call "publishing".
Wearing the item depends on state 3, never on state 4. And to see how it looks you only need state 1 or 2, which are free. The whole 3,000 Robux bill in the example above is avoidable by testing first.
The two routes: test in Studio or upload for real
Route A — wear it inside Studio, at zero cost
This is the route almost nobody tells a beginner about. You get to see your accessory on the character, walking, with the camera turning, before spending a single Robux.
1. Open Studio and create an empty place. In Roblox Studio, pick New and then Baseplate. It is a grey world with a floor — it works perfectly as a fitting room.
2. Find the Explorer. It is the right-hand panel that lists every object in your game as a tree (Workspace, Players, ReplicatedStorage and so on). If it is not showing, click the View tab in the top bar and then Explorer. Open the Output from the same View tab too: it is the little window where errors and warnings appear, and you are going to need it in five minutes.
3. Turn your mesh into an Accessory. In the top bar there is a tab called Avatar. Inside it is the Accessory Fitting Tool. You point it at your mesh, pick the type (hat, hair, back, face) and the tool generates an Accessory object with the right attachment point already in place — the Attachment named something like HatAttachment, which is what makes the item stick to the head instead of falling on the floor. The tool itself shows a preview on a mannequin. That, literally, is wearing your UGC without publishing anything.
4. Store the Accessory in ReplicatedStorage. In the Explorer, drag the Accessory object into ReplicatedStorage (it is already in the list, you do not need to create it). Double-click its name and rename it to MyAccessory, exactly like that, with that capitalisation.
5. Create the script. Still in the Explorer, hover over ServerScriptService, click the + that appears beside it and choose Script. Paste this page's artifact inside it (delete the print("Hello world!") that comes by default).
6. Press Play. The play button is in the Home tab, or use the F5 key. Your character spawns on the baseplate with the accessory fitted. Turn the camera, walk, crouch. If the item is crooked, you close the test, adjust it in the Accessory Fitting Tool and press Play again. Each of those cycles costs about 30 seconds and zero Robux.
Two important things about this route: the accessory appears only in that test, not on your avatar on the site; and because the script runs on the server, if you test with friends in a multi-player test, everyone sees the item on your character.
Route B — upload for real and equip without selling
Once the item is the way you want it, then it is worth paying.
1. Go to create.roblox.com and sign in with the same account. In the left-hand menu, look for the creations section and then the avatar items list (Avatar Items).
2. Confirm the account requirements. To upload UGC accessories, the account needs identity verification completed. That lives in account settings and costs no Robux, but it can ruin your day if you find out at upload time.
3. Upload the item. You choose the category (hat, hair, back accessory…), send the mesh and the texture, give it a name and a description. The fee appears on the confirmation screen. Read the number on your screen before confirming — the reference figure today is 750 Robux per accessory, and classic clothing (shirt, trousers, t-shirt) costs a fraction of that. What appears on your screen is the source of truth.
4. Wait for moderation. The item sits with a pending status. There is no button to speed it up. While it is pending, it does not appear in your inventory and cannot be equipped.
5. Approved: equip it from the site. When the status turns approved, open roblox.com/my/avatar, pick the item's category (Accessories, Hair, whatever it is) and it is there, because you own a copy. Click to equip. The "put on sale" button stays off, and it makes no difference at all to your using the item. Anyone who runs into you in any game sees the accessory on your avatar normally — they just cannot buy it.
The script that puts the accessory on in playtest
The artifact below is a Script (not a LocalScript) that lives in ServerScriptService. It does three things: waits for each player's character to load, looks for an Accessory object called MyAccessory inside ReplicatedStorage, and fits a copy of it onto the character using Humanoid:AddAccessory, which is the official function for putting an accessory on at runtime.
To use it: paste it into the Script, check that the name in the Explorer matches the NAME_IN_REPLICATEDSTORAGE constant at the top of the code, press F5. If nothing happens, look at the Output: the script tells you in plain words which of the three things was missing (the object does not exist, the object is not an Accessory, or the character has no Humanoid). It also has a small latch so it does not dress the same character twice when you die and respawn.
If you swap the name MyAccessory for another, swap it in both places. A name with a space, an accent or different capitalisation is the number one cause of "I pasted it and nothing happened".
The 750 Robux mistake: uploading before seeing it on the body
The expensive mistake is not technical, it is about order. It is uploading the item to see how it turned out. Each of those tests costs 750 Robux plus the moderation wait, and an approved item cannot have its mesh swapped afterwards — you upload another item, from scratch, with a new fee.
The second most common mistake is the same shape: switching on the sale button thinking that is what unlocks wearing it. It is not. Putting it on sale is for other people to buy it, and it involves a price, a Premium subscription on the account and the Marketplace commission. If your goal is only to wear the item, leave it off.
And there is the mistake inside Studio, which is free but frustrates just as much. Dragging the mesh straight into the character wears nothing:
-- WRONG: a loose MeshPart inside the character has no attachment point
local hat = ReplicatedStorage.MyHat
hat.Parent = character -- falls on the floor, or sits planted at the map originA MeshPart on its own does not know where the head is. What knows that is the Accessory with the Attachment inside it, and that is why the Accessory Fitting Tool step is not optional. If you already have the mesh but no Accessory, the artifact's script will tell you exactly that in the Output.
What to measure afterwards
Write down three numbers from your first item, because they change your decisions on the next ones:
- How many test cycles in Studio you needed until the scale and position were right. If it was five, you saved 3,750 Robux compared with testing by uploading.
- How long moderation took, from clicking upload to the approved status. That number decides whether you can count on an item for a date (an event, a launch) or not.
- Whether the item looks the same outside Studio: once approved and equipped, join any game and look at your avatar through the game camera. Different lighting and character scale reveal problems the grey baseplate hides.
With those three numbers in hand, the next step is deciding whether it is worth opening the item to the public — and that is where price, commission and the sale button come in.
Ready-to-use artifact
--!strict
-- Puts a test accessory on the character, with no upload and nothing on sale.
-- WHERE IT LIVES: a Script (not a LocalScript) inside ServerScriptService.
-- PREREQUISITE: an Accessory object saved in ReplicatedStorage under the name below.
-- Generate that Accessory from the Studio Avatar tab > Accessory Fitting Tool.
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Has to be IDENTICAL to the name shown in the Explorer (capitals count).
local NAME_IN_REPLICATEDSTORAGE = "MyAccessory"
-- Tracks who was already dressed, so respawning does not duplicate the accessory.
local alreadyDressed: { [Model]: boolean } = {}
-- Accepts either an Accessory directly or a Model with an Accessory inside.
local function findAccessory(container: Instance): Accessory?
if container:IsA("Accessory") then
return container
end
local found = container:FindFirstChildWhichIsA("Accessory", true)
if found and found:IsA("Accessory") then
return found
end
return nil
end
local function dress(character: Model)
if alreadyDressed[character] then
return
end
alreadyDressed[character] = true
local humanoid = character:WaitForChild("Humanoid", 10)
if not humanoid or not humanoid:IsA("Humanoid") then
warn("[Test UGC] Could not find the Humanoid in " .. character.Name)
return
end
local original = ReplicatedStorage:FindFirstChild(NAME_IN_REPLICATEDSTORAGE)
if not original then
warn("[Test UGC] There is no '" .. NAME_IN_REPLICATEDSTORAGE .. "' in ReplicatedStorage. Check the name in the Explorer.")
return
end
local accessory = findAccessory(original)
if not accessory then
warn("[Test UGC] '" .. original.Name .. "' does not contain an Accessory. Generate one with the Accessory Fitting Tool (Avatar tab).")
return
end
-- AddAccessory handles the fitting through the Attachment (HatAttachment, etc).
humanoid:AddAccessory(accessory:Clone())
print("[Test UGC] Accessory worn by " .. character.Name)
end
local function onJoin(player: Player)
-- CharacterAppearanceLoaded guarantees the default avatar has already arrived.
player.CharacterAppearanceLoaded:Connect(dress)
if player.Character then
dress(player.Character)
end
end
Players.PlayerAdded:Connect(onJoin)
for _, player in ipairs(Players:GetPlayers()) do
onJoin(player)
end

