Automated Facebook Marketplace ads — photos in, sold by lunch

Blog post #39


This morning I had a corner of the garage full of outgrown baby gear and a vague intention to “deal with it eventually.” By lunch, four of those things were listed on Facebook Marketplace and several were already sold. I never opened Facebook myself. I never wrote a single ad. I dropped photos into a folder and Claude did the rest — including driving the browser.

This is the build log for the most boringly useful thing I’ve automated in months.

Editorial illustration: a folder of used baby-gear photos and a receipt flowing into a laptop showing a second-hand marketplace grid, a steaming coffee beside it

The setup is almost insultingly simple

A folder called Begangade anonser. One subfolder per item. Inside each: the photos I took with my phone, and sometimes a snapshot of the original receipt. That’s it. That’s the whole input format.

I point Claude at a subfolder and say, roughly, “lägg ut en annons för den här.” From there:

  • It reads the photo and figures out what the thing actually is. I pointed it at a black plastic lump on the grass and it came back with “BeSafe ISOfix base, the in-car base unit with the support leg for an iZi infant carrier.” Correct, and more specific than I would have been.
  • It writes the ad text into an annons.txt in the same folder, in the exact format of the ads it wrote on previous days — same headers, same “DETTA INGÅR” bullet list, same honest paragraph about wear, same “pickup in Hjärup, no shipping” footer. Consistency for free.
  • It proposes a price with reasoning — original price versus age versus condition — and then waits for me to agree or change it. This boundary is deliberate; more on that below.
  • It opens Facebook Marketplace in my actual browser and fills in the entire form. Title, price, the category dropdown (which isn’t searchable, so it has to open the menu and scroll inside it to find “Baby och barn”), the condition mapping, brand, the full description, and ten product tags typed in one by one.

Then it stops. I drop the photos in, I read it over, I hit publish.

The part that still feels slightly magic

Claude is using the browser the same way I would — through the Claude-in-Chrome extension. It takes a screenshot, finds the field, types, clicks the dropdown, screenshots again to check the custom menu actually opened, scrolls inside it, picks the option. It’s not calling some clean Marketplace API. There is no clean Marketplace API. It’s looking at the page and operating it, in Swedish, in my logged-in session.

When it works — and it did, four times — it feels less like automation and more like handing the task to someone who is very fast and doesn’t get bored typing the eleventh product tag.

Why I still press publish myself

I want to be clear that this is a choice, not a limitation.

Publishing is public and irreversible. Replying to a buyer is public. Setting the price is the one decision where my judgment about this item, this market, this week actually matters. So the workflow is built so Claude does everything up to those moments and then deliberately hands me the wheel: it proposes the price and lets me set it, it fills the form and stops before “Publicera,” and it never answers a buyer message on its own.

This isn’t Claude being timid. I told it to work this way and it now treats those as hard edges. The interesting thing is that it remembers the edges. The price-proposal-not-price-decision rule, the stop-before-publish rule, the never-auto-reply rule — those live in its memory now, so I don’t re-explain them every time I sell a stroller.

We turned the whole thing into a skill

After the fourth ad I asked Claude to package the workflow into a reusable skill, globally, so it’s not something I have to reconstruct from a conversation each time. It now lives as begagnad-annons: the collaboration contract, the exact annons.txt template, the Marketplace form mechanics, and a reference file of browser quirks (more below). Next time I just say “sälj den här” and the whole flow triggers itself.

That’s the part I keep coming back to. The first ad was a task. The fourth was a habit. The skill makes the fifth a one-liner.

The honest, unglamorous bits

Two things that won’t show up in a demo:

browser_batch is broken on facebook.com. Batching multiple browser actions into one call fails with a permission error on Facebook specifically, every time, even right after I approve. Single click/type/screenshot actions work fine. So the form-filling is slower than it could be — one action at a time, screenshot to verify, next action. I had Claude write that quirk down so it stops fighting the system nudges that keep telling it to batch. Net effect: it works, it’s just not instant.

I can’t really sandbox-test this. When we built the skill, the natural next step was the usual eval loop — run it a bunch of times, grade the outputs. But the browser half needs a live, logged-in Facebook session; a sandboxed sub-agent can’t post to my Marketplace. So the skill shipped tested-by-doing rather than tested-by-harness. The four real ads are the test suite. I’m fine with that here — the cost of a bad ad is low and I review every one before it goes live — but it’s worth being honest that “ship it and watch” was the actual QA strategy.

What I notice in retrospect

The thing I’d been avoiding wasn’t hard. It was annoying. Photographing is fine. Selling is fine. Writing the same kind of ad for the eighth time, fighting a dropdown that won’t take keyboard input, typing tags one at a time — that’s the friction that turns “I should sell this” into “it’s still in the garage in October.”

What got automated today isn’t intelligence. It’s the boredom. Claude wrote decent ad copy, sure, but the real unlock was that it didn’t mind doing the tedious browser choreography four times before lunch while I did something else. Several of those items had already found buyers by the time I sat down to write this.

The garage is emptier. The skill is sitting there for next weekend. And the question has quietly flipped from “when will I get around to selling this” to “what else is sitting around that I just haven’t pointed a folder at yet.”


— Stefan