Built and operated by the studio

Automatic Facebook and Instagram posting from a product catalogue

Every day, Raftul copiilor posts the night’s best real price drops to its Facebook Page and Instagram account, one at a time, from its own server. The software chooses the offers, draws each post’s picture, writes the caption from verified fields, checks the offer once more just before publishing, and stops when anything is uncertain.

The project in one minute

The real Raftul copiilor page and profile: product cards, factual captions with the affiliate disclosure, and the way back to the site.

Read the transcript

All project videos, with transcripts

1:16English narration and subtitles

The public Raftul copiilor Facebook page and Instagram profile, recorded at about 8 frames per second. Published results only; nothing was posted during the recording. Synthetic English voice (Microsoft Edge TTS), English subtitles in the picture.

  • every 5 mina check between 07:00 and 21:00, Bucharest time
  • 60-120 minrandom gap between two posts on the same channel
  • 3 + 1posts a day at most: Facebook, then Instagram

What it is, in short

A publishing job inside the Raftul copiilor site. It reads the site’s own price-drop rules and database, so a post can never say something the site does not. Posts link to the product’s page on the site, not straight to the shop, and the commission is disclosed on the caption’s third line, visible before “more”.

It is deliberately conservative: a few posts a day per channel, never the same product or brand too often, and no post at all on a day without real price drops. The bar is never lowered to fill a schedule.

The Raftul copiilor Facebook Page seen by a logged-out visitor: an automatic post with a −58% price card for a Rubik’s cube, 66.99 lei against 157.99 lei, and the Page’s photo grid of earlier price cards.
The Facebook Page as a logged-out visitor sees it: an automatic post with its price card and, on the left, the photo grid of earlier cards. The follower count is hidden; we publish no audience figures.

How a day of automatic posting goes

  1. Nightly importThe catalogue import ends by rebuilding the table of price drops.
  2. Today’s poolThe first run that finds today’s rows chooses up to 20 offers, once. No rows from today means nothing is posted.
  3. Channel’s turnFrom 08:00, when a channel’s time comes, the next offer is checked again against the site’s rules; one that stopped being true is skipped.
  4. Card and captionThe picture is drawn and checked again; on Instagram, once more after the media container is ready.
  5. Publish and waitOne post goes out. The next time is drawn 60 to 120 minutes later, in the same transaction that records the answer.

What qualifies for a post

Only falls the site’s own front page trusts: today’s price against the lowest price observed in the 30 days before the fall, never a shop’s “old price”; at most 70%; the fall within 14 days; the price seen by three imports; and the shop’s last complete read finished today and still saw the offer.

SettingDefaultWhy
Minimum fall40%On a measured day, 409 offers had fallen 40% or more. From 30% the list grew by 1,055, mostly one retailer’s sale.
Minimum saving25 leiA big percentage of a small price is not worth a post.
Daily shortlist20At most 4 posts go out a day (3 on Facebook, 1 on Instagram). The rest of the list replaces offers that stop being true or fail a check during the day.
Per shop / brand / category5 / 2 / 3That same day, 95% of the 40% list came from a single shop.
Instagram per day1Instagram warned the account after its first 3 posts in 101 minutes. Raised slowly, only after weeks without a warning.
Same brand on a channel3 days apartVariety, and less like a feed of ads.
Gap between channels60 minThe same moment and picture on both looked like cross-posting; a product posted on one is not posted on the other for 7 days.
Same fall againneverA further fall may be posted after 7 days; the same product through another shop may not.

Post images drawn by code, in Instagram’s tallest shape

Each card is a 1080×1350 JPEG, the only format Instagram accepts and its tallest feed shape. The product’s photo comes through the site’s own image proxy under the same safety rules; a shop that refuses the photo leaves no card, and the job moves to the next offer, because a logo is not a product.

Under the photo: the discount, today’s price against the reference price, the rule behind the comparison, the shop and the date the price was seen. No AI touches the card, so it says exactly what the data says.

A post card drawn by the publishing software: discount tag, the product picture, today’s price against the reference price, the comparison rule, the shop and the date the price was seen.
A card drawn by the publishing software, shown with demonstration data and the site’s own illustration. Nothing was posted for this example.

Where the posts lead

Facebook posts link to the product’s page on raftulcopiilor.ro, where the shop buttons go through the affiliate link and are counted as the site’s clicks. On Instagram, where caption links cannot be clicked, the caption gives a short address to type and the profile links to /oferte: a page listing every posted product by day, with today’s price, so someone who saw a post days ago still finds it, at its current price.

Instagram posts also carry the “Paid partnership” label. If Instagram refuses it, the post fails and says so; turning the label off is the owner’s decision, not an automatic fix.

Desktop
Raftul copiilor’s “offers from our posts” page: the products posted on Facebook and Instagram, grouped by day, each with today’s price, the reference price and where it was posted.
Phone
The offers-from-our-posts page on a phone, with day chips and the commission notice.
The /oferte page on a desktop and a phone: the products from the posts, grouped by day, each marked with where it was posted.

Staying in good standing with Meta

Both the Facebook Page and the Instagram account had warnings early on, and the software was shaped by them. A token, a permission, a block or an Instagram restriction (codes 2207050 and 2207051) pauses that channel until a person resumes it, because asking again deepens a restriction. Instagram’s own “share to Facebook” stays off, so a post is never published twice on the Page.

WhenWhat happens
Refused, or never sentNothing is public. That offer is dropped for the day; the channel tries the next one after a wait.
Token or permission gone, blocked, Instagram restricting the accountThe channel pauses until someone resumes it, after looking at the app’s account status.
Answer lost, or Meta failed while publishingThe outcome is unknown and may be public, so that channel posts nothing until a person marks it published or failed. A duplicate is worse than a quiet day.
A run killed mid-postTreated the same way after 15 minutes.

Operated from a few commands

There is no admin screen on purpose: these commands answer every question that came up so far.

  • statustoday’s pool, last posts, each channel’s next time and health in one line
  • previewcards and captions for what would be chosen now; posts nothing
  • exclude <listing>never post this offer
  • resolve <id> published|failedsettle an unknown outcome after looking at the page
  • resume facebookrestart a channel after fixing what paused it
  • checkthe token still reaches both accounts

Who this kind of automation suits

  • Shops and catalogues that post the same kind of update often: offers, new arrivals, back in stock, price drops.
  • Affiliate and deal sites that want posts to send people to their own pages, with the commission disclosed.
  • Marketplaces, property and car listings, event venues: any business whose posts are really rows of data with a picture.
  • Teams tired of copying data into a design tool and a scheduler every morning.

What we would adapt for you

  • Selection rules over your data: what deserves a post, how often, and what must never be posted.
  • A card design in your brand, drawn by code from verified fields.
  • Caption templates with the disclosures your sector needs.
  • Channels: a Facebook Page and an Instagram professional account through Meta’s official API; others after checking their rules.
  • A dry-run mode, a ledger of every post, daily caps and pause on doubt.

Technology used

  • Python 3.12
  • Meta Graph API
  • Instagram Content Publishing API
  • Pillow
  • httpx
  • SQLite
  • SQLAlchemy
  • Docker Compose
  • systemd timers
  • pytest

The paid side: Facebook ads

Posts reach followers; ads reach new people. The Facebook ads automation tool turns one product link into a checked campaign with its own picture, video and audience.

What this case study does not claim

The pipeline publishes to Facebook and Instagram only; the products’ TikTok and YouTube channels carry videos we upload ourselves. We publish no follower, reach or revenue figures. This is the publishing engine itself; the price alerts and the catalogue are described in the Raftul copiilor case study.

Questions about automatic social media posting

Can Facebook and Instagram posts be published automatically?

Yes, through Meta’s official Graph API, with a Facebook Page, an Instagram professional account linked to it, your own Meta app and a long-lived Page token. Standard access is enough for your own accounts.

Will Instagram flag automated posting?

It can. Raftul copiilor’s account was warned after three posts in 101 minutes. We now keep Instagram to one post a day, space channels apart, vary products and brands, and raise caps only slowly.

Does it use AI to write the posts?

Not for prices. Captions are filled from verified data by templates, so a post never states a price the data does not support. AI-written variations can be added for softer content, reviewed before publishing.

Can it post to TikTok or YouTube?

Their posting APIs need an audit and a creator-controlled flow, so unattended posting to any account is not a safe promise. We check eligibility for your accounts first.

What happens if a price changes before the post goes out?

The offer is checked again when its turn comes, again after the card is drawn, and on Instagram once more before publishing. An offer that stopped being true is skipped.

Can you build this for my business?

Yes, from your catalogue, database, spreadsheet or API, in your brand. See our social media posting automation service.

Services this project demonstrates

Want your social posts made from your own data?

Tell us what you post and where the data lives. We build the rules, the cards and the safety checks around it.

Discuss your project