A lot of developers get their first freelance job the same way: not with a big build, but with a broken thing. A contact form that stopped sending. A checkout button that does nothing on mobile. A WordPress site that shows a white screen after an update. A React app that builds locally and fails on the server.
Bug-fix jobs are a good way in. They are small, the client already knows what "done" looks like (the thing works again), and a clean fix often turns into the next job. They are also easy to get wrong, because you are quoting on code you haven't seen, on a server you don't control, for someone who is usually stressed.
I'm a freelance full-stack developer in Karachi, and small fixes are still some of the jobs I enjoy most. This post is the process I'd hand to anyone taking their first one: how to read the post, what to ask, how to get access without putting yourself or the client at risk, how to price something unknown, and how to hand it back so the client remembers you.
If you're completely new to the platforms themselves, the guides on how Upwork works and how Fiverr works on Digital Dialogue cover contracts, orders and payments. Here I'll stay with the developer side of the job.
Step 1: Read the job post like a bug report
Most bug-fix posts are bug reports written by someone who isn't a developer. That's fine. Your first job is to translate it. Read the post once for the problem and once for the clues, and write the clues down before you write anything to the client:
- The symptom. What does the client actually see? "Form not working" can mean the button does nothing, the page reloads, a success message appears but no email arrives, or the email lands in spam.
- When it started. "After the hosting move" or "since the theme update" is the most useful sentence in any bug report. It tells you where to look first.
- The stack, if mentioned. WordPress, Shopify, a Next.js app on Vercel, a PHP site on shared hosting. If it isn't mentioned, the site URL usually tells you a lot.
- Who else touched it. "The previous developer left" means you may be walking into code nobody can explain.
- What the client expects. Some want the bug fixed today. Some want to know why it happened so it doesn't happen again. Those are different jobs.
If there's a public URL, open it. Open the browser console and the network tab, reproduce what you can as a visitor, and note what you see. You're not fixing anything yet. You're checking whether the problem is visible from outside, which changes how confident your proposal can be.
Step 2: Write a proposal that shows how you'll think
A strong bug-fix proposal is short and specific. It doesn't promise a fix in the first line, because you haven't seen the code. It shows the client that you've read their problem and that you have a plan. Something like this:
Hi, I opened the site on my phone and the "Send" button on the contact
page shows a console error after the click (a 500 from the form endpoint),
so the form is reaching the server but failing there.
Since you mentioned it started after the hosting move, my first checks
would be the mail settings on the new server and the PHP version.
How I'd work:
1. Read access first (hosting panel or repo), reproduce on a copy if possible.
2. Send you the cause in plain words before changing anything.
3. Fix, test the form end to end, and send a short note of what changed.
Two questions:
- Do you have a staging copy, or should I make one?
- Which email address should receive the test messages?
Notice what this does. It names what you actually observed, connects it to the client's own clue, gives an order of work, and asks two questions that a real fix needs. It doesn't guess the cause with false certainty, and it doesn't paste a list of every technology you've ever used.
Digital Dialogue's freelancing guides go deeper into proposals in general. For bug fixes, the rule I keep coming back to is: describe the first hour of work, not the whole career.
Step 3: Ask the questions that save the job
Before you accept, a few answers will save you from most bad surprises. You don't need all of them in the proposal, but you need them before you start:
- Can you reproduce it, or can they show it? A screen recording from the client is worth a lot. "It happens sometimes" bugs need more time, and the quote should say so.
- Is there a staging copy or a backup? If there's no backup, making one is your first task, and it belongs in the quote.
- Who owns the hosting, domain and code? If the previous developer still controls the server, access can take days.
- What counts as done? "The form sends to info@ and the client sees a thank-you message" is a finish line. "Make the site work properly" isn't.
- Is anything else broken? Clients often mention a second problem after you've started. Better to hear it now and quote it separately.
Step 4: Get access without putting anyone at risk
This is the part beginners most often get wrong, usually by being too relaxed. A client who sends you their main hosting password in a chat message is trusting you with their whole business. Treat that with care, for their sake and yours.
Some habits that keep access clean:
- Ask for your own login when the system allows it. WordPress, most hosting panels, GitHub, GitLab, Vercel, Netlify and Shopify all let the owner invite a separate user. Your own account can be removed in one click when the job ends, and it keeps a record of what you did.
- Ask for the smallest access that works. For a front-end bug, repository access may be enough. You may not need the hosting panel at all.
- Avoid passwords in chat when you can. If the client has no other option, suggest they change the password after the job, and say so in your delivery note.
- Never ask for payment-account or email-account passwords for a website fix. If a job seems to require them, slow down and ask why.
- Keep a short access log for yourself: what you were given, when, and when you confirmed it was removed.
On marketplaces, keep the conversation and any file sharing on the platform where you can. It protects both sides if something is disputed later.
Step 5: Reproduce, then make a copy, then touch the code
Once you have access, resist the urge to start editing. Reproduce the bug first, on the live site if it's safe to look, and note exactly what happens. Then work on a copy:
# if the project is in git
git clone <repo-url> client-site && cd client-site
git switch -c fix/contact-form-500
# write down the starting point before changing anything
git log -1 --oneline > ../start-point.txt
For sites without git, download a backup through the hosting panel, or ask the client to make one, before you change a single file. Then write a short note as you go. It doesn't have to be pretty. A few lines are enough:
Symptom: POST /contact returns 500 after hosting move
Seen in: server error log, "mail(): Could not instantiate mail function"
Cause: new host blocks PHP mail(); old host allowed it
Fix: send through SMTP using the client's existing mailbox
Tested: 3 test messages to info@, received, not in spam
This note becomes your delivery message later. It also protects you if the same bug comes back after someone else changes something.
Step 6: Price a fix you haven't seen yet
Pricing unknown work is the scariest part, and there's no perfect formula. What works for most beginners is to split the job into a part you can price and a part you can't:
- Fixed price for diagnosis. A small, fixed amount to get access, reproduce the bug and report the cause in plain words. This is honest work with a clear end, and it doesn't depend on what you find.
- Then a quote for the fix itself. Once you know the cause, you can give a firm number, or say "this is a one-line change, it's included."
On Upwork, this fits nicely as two milestones on a fixed-price contract, or as a short hourly contract with a weekly limit if the client prefers. On Fiverr, you can make the diagnosis your basic package and quote the fix through a custom offer. Whichever you choose, write down what the first payment covers so neither side is surprised.
What to avoid is a single low price for "fix the bug" when you can't see the code. If it turns out to be a one-minute fix, you look fine. If it turns out to be a broken plugin that needs replacing, you're stuck doing hours of unpaid work, or asking for more money halfway through, which feels worse for everyone.
Step 7: Fix it the boring way
Small fixes are where it pays to be boring:
- Change the least code that solves the problem. A bug-fix job isn't the moment to refactor the client's codebase or upgrade every dependency.
-
Don't fix things you weren't asked to fix without asking. If you spot something risky, an old plugin, a public
.envfile, an expired certificate, mention it in your note and let the client decide. - Test the whole path, not just the line you changed. For a form, that means filling it in as a visitor and checking the message arrives where it should.
- Check on mobile if the bug was reported on mobile. It sounds obvious, and it's often skipped.
Step 8: Hand it back so the client understands what happened
The delivery message is what the client will remember. Write it for someone who isn't a developer:
The contact form is working again.
What was wrong: your new hosting company blocks the basic way the form
was sending email, so every message failed on their server.
What I changed: the form now sends through your own mailbox (SMTP),
which is more reliable and less likely to land in spam.
What I tested: three test messages from desktop and phone, all received
at info@.
Worth doing: please change the hosting password you shared with me,
and remove my user from the panel when you're happy.
Short, plain, and specific. It explains the cause without blame, lists what changed, shows it was tested, and reminds the client to tidy up access. That last line does a lot for trust.
What a good first bug fix gets you
A clean fix rarely stays a single job. Clients who've just had something broken repaired quickly tend to remember who did it, and the next time something goes wrong, or the next time they want a new page, they already know who to message. A good review on a small job also matters more than people think, because it's the first real proof on a new profile.
None of this needs advanced skills. It needs a habit of reading carefully, asking before acting, working on copies, and explaining what you did. Those habits are what clients are paying for, more than the fix itself.
Top comments (0)