A crop-science multinational was struggling to turn retailers' high-volume TikTok activity into farmer engagement or product demand. Across its fragmented distribution network, shops were posting frequently but followers stayed almost flat, even though smallholder farmers regularly engage with TikTok and other short-form video.
We built an AI-powered social commerce platform that generates short-form video from six locally tuned channel settings (accent, vocabulary, tone, appearance, music and format), then uses engagement signals to keep improving the content.
Live channels were piloted across three markets, with retailer-specific calls to action, QR codes and AI-assisted conversation routing. 380 retailers went live, reaching over a million farmers, while marketing costs fell 50% and product awareness rose 55%.
Voices contributed by field teams, indexed by province. A national accent reads as an outsider in the delta, so it is not used there.
The company sells to the wholesaler, the wholesaler sells to the local shop, and only the shop ever meets a farmer. So interest created at the far end has to travel back through three sets of incentives before it looks like revenue. TikTok sits outside all of it.
The brief assumed shops couldn't make content. Several of them had been posting steadily for months. When we asked what happened afterwards, four things came back.
What the app rewards, when to post, why one video reaches ten thousand people and the next reaches forty. They were treating it like a noticeboard.
A farmer who wants the product has to work out who posted it, where they are, and how to reach them. Most don't bother.
Templates handed down from a national team, in a voice that reads as an outsider. Farmers scroll straight past.
Nothing connects a view to somebody walking in. So posting is a favour to head office.
A farmer sitting opposite a multinational agrees with the multinational. So we went where they already were, in formats they were comfortable with, and handed the room to someone local. The workshops came later, with the field teams, once we had something to analyse.
We wanted to know two things. Can farmers tell AI video from real video, and what gives it away.
So we built a spot-the-AI test, the same material in several versions, each with a different tell, then talked afterwards about which clues they'd noticed. Most of them clocked it, which we'd expected.
What we hadn't expected was that it didn't bother them. The reasoning was the same in every session: it looks realistic enough, it feels local, and it tells me something useful. Nobody cared who made it.
We'd been treating authenticity as the thing to protect. Asked why they preferred one version over another, farmers said it sounded local.
So we split it into six things a pipeline could set, vary and test on its own.
Farmers named a capital-city accent as a reason they scrolled past. Strongest lever we found, by a distance.
Rầy nâu, not Nilaparvata lugens. One unfamiliar word and they're gone.
Friendly, often funny, sometimes argumentative.
Dress and setting came up alongside accent in the reasons farmers gave.
Generic backing tracks get skipped. The music shortlist refreshes from what's trending.
Not a piece to camera. The first two seconds decide whether the rest gets watched.
Each channel stores six settings and every video it makes inherits them. That's the difference between one national voice that reads as an outsider and a local one per province at roughly the same cost. It's the whole reason this works across eight markets.
Too many things to test one at a time, one season to do it in, and nobody wanted a study that produced a report instead of growth. We had permission to build real channels, so the test channels were live and grew while they produced results.
Two identical channels don't grow identically. So we ran each condition across a group of channels instead of in pairs, and worked out the normal range of random variation first, using channels running no condition at all.
A great hook on a channel with the wrong accent still fails. Tested separately, the factors gave results that fell apart when combined. Grouping them into categories measured them at the level they work.
Testing every combination would have taken longer than anyone would wait, and most of the combinations would have been dull. So we ranked the categories first, then spent the precise tests inside the one that moved.
Spot-the-AI test across formats, with the AI question asked after the material.
Farmers spot AI and don't object, as long as it feels local and tells them something useful.
Stopped spending on realism. Put that effort into accent, vocabulary, music and tone instead.
Two-stage factor test on live channels, groups instead of pairs, with the normal range of variation established first.
Localisation moves growth more than anything else. Within that, accent beat vocabulary, music and appearance.
A channel became a set of six local settings, inherited by every video it makes. A regional voice per market instead of one national one.
Shop interviews about their own channels, and what happens after a farmer comments.
They post plenty. They lose people at the moment of wanting the product, because nothing tells the farmer where to go.
The end card became a working thing instead of a line of text: named shop, QR code, and comments routed to a thread that carries the context.
How much posting is needed, against what TikTok tolerates before an account looks automated.
Below ten posts a day channels didn't grow. Above thirty, or at regular intervals, accounts got flagged as automated.
Real human touches and slightly random timing built into the pipeline, because TikTok flags accounts that post without them.
One account kept coming up. The reason turned out to be that the AI presenter resembled a well-known local figure.
Likeness became an explicit guardrail from that point on.
Farmers talk at length about channels they enjoy, and a lot of it connects to nothing you can build. We treated it as noise for the first few sessions.
That channel-by-channel enthusiasm was where localisation first showed up, even when the specific reason was unusable. The discipline was separating what we learned from what we were allowed to do about it, and holding the second conversation later with legal in the room.
A farmer with a phone was already there. Part II is the machinery behind that video, and the one point where a person has to stand.
The research found that localisation moves farmers and that the end card was broken. This is how that became a working system: what each tool does, where the human sits, and why it isn't one model doing everything.
Drawn as a blueprint because the interesting part is the distance between a farmer tapping a video and a shop knowing they exist. Everything below the second line was invisible before.
Each tool does the narrow thing it's good at. The joins took the longest to settle: what gets passed on, what gets held back, and where a person can stop it.
Each of the six parts of localisation had to become a setting with a tool behind it. Otherwise it stays a workshop finding on a wall.
Accent mattered most and took the longest to build. A national voice model gives you the capital city, which reads as an outsider in the delta. Switching to a regional voice produced the biggest change we measured.
Vocabulary needed a lookup table. Left alone, the model reaches for the scientific name every time. So the pest word list sits outside the prompt, one per region.
Set the region and the crop, and everything downstream inherits it.
Shops were losing farmers at the moment of wanting the product. The old version said something like “contact us”, and the farmer had to work out who “us” was, where they were, and how to reach them.
TikTok isn't a controlled environment. The algorithm moves, seasons move, and one viral post can swamp a week of careful work. The three problems above are what we designed around.
Making video is the obvious use, and plenty of tools do it. What matters is what happens after publishing.
A comment tells you a pest is showing up in a province. A watch-through curve tells you the hook worked and the middle didn't. An end card nobody follows tells you it's wrong for that region.
All three feed the same place, and the model uses them to decide what to draft tomorrow.
A person closes the loop by deciding. The system doesn't act on its own reading.
Most of the design work in a pipeline like this sits in the handoffs. These took the longest to settle.
| Join | What passes | What deliberately doesn’t | Why |
|---|---|---|---|
| Signal → Claude | Topic, region, crop, how far the signal has spread | Raw engagement counts | A loud trend and a real problem are different things. Passing the volume through made the model overclaim. |
| Claude → ElevenLabs | Script, register, pacing marks | Anything unreviewed with a claim in it | Once it has a voice it sounds finished, and finished things get published. |
| Claude → assembly | Scene list, footage tags, caption text | Product names in the visuals | Showing a product on screen counts as a regulated claim in several of these markets. |
| Assembly → check | The draft video, plus whatever the model was unsure about | An automatic pass | That uncertainty flag is what makes review fast enough to survive. |
| Check → n8n | Approved video, channel, earliest post time | An exact schedule | Exact schedules look like a bot, so the scheduler varies the timing itself. |
| Comments → routing | Intent class, province, video context | Any generated agronomic answer | The system opens the door. The shop walks through it. |
Eleven screens went live, making and managing content. This part is where the intelligence belongs: six capabilities that make the system learn per region and cost less with every market.
These went live during the sprint or were written up for the vendor build. The last column is where each one goes next, now we've watched them get used.
| Surface | State | What it does | Where it goes next |
|---|---|---|---|
| Onboarding | Built | Country, language and role. Different views for shop, service and content teams. | Choosing a role is where governance starts. Who can approve what belongs here, in plain sight. |
| Trend analytics | Built | Pest, disease, treatment and competitor mentions. Audience matching by influencer, keyword and region. | It follows trends. The version that matters gets ahead of them. See capability 03. |
| Virality Lab | Built | Content suggestions with a score, plus recommended music, posting time, tone and length. | The score becomes regional, says what it predicts and carries a range. See capability 05. |
| Channel dashboard | Built | All channels in one view with stage, followers and engagement. | The stage controls what a channel is allowed to do. A channel goes live once an expert is named against it. |
| Growth automation | Built | Each channel as its own small brand. Goals, repost suggestions, channel settings. | The six local settings belong here, inherited by everything the channel makes. |
| Content creation | Built | Five ways in, from an agronomist's voice memo to a filled-in brief. | The strongest thing we built. Every line now traces back to a timestamp in the source. |
| Media library | Built | Upload, with automatic tagging by crop, pest, disease and treatment. | Rights become a property of the file, so restrictions travel with it into every video. |
| Content library | Built | Everything published, filterable, remixable, with performance per post. | A history trail traces any claim back to the source it came from. |
| Funnel conversion | Built | Six stages with generated tasks, a lead list, CRM links and local platform links. | The stages are right. The handover into Zalo and LINE decides whether any of it works. |
| POS tools | Built | QR codes, discount and voucher codes, redemption tracking. | The only attribution we get, and the one place a view turns into a number you can bank. |
| Review queue | Not built | A queue of claims that need an agronomist, ordered by consequence. | The queue everything else depends on. It's how an expert steps in, and how the system learns what it can publish on its own. |
We spent a season learning that localisation beats everything else. But a voice that works in one province doesn't necessarily work in the next, and audiences shift between seasons.
Doing that by hand across eight markets isn't realistic. So the experiment becomes part of the machine: each local variation is an option, posting volume is the budget, and the system shifts nightly toward whatever is working in that province.
The important decision is what it optimises for. Optimise on engagement and it optimises for whatever holds attention, which isn't the same as what sells.
A person sets the options and defines the goal.
Picking “Vietnamese” gives you a Hanoi voice, and in the Mekong Delta that's the capital-city problem again, one level down. If accent is the strongest lever, it deserves to be measured.
By the time a pest is trending on TikTok, the same video is being made across the country and the farmers who needed it acted a fortnight ago.
It's in the comments first. The same question from the same three districts, before anyone has posted about it.
So instead of ranking nationwide mentions, group incoming comments and searches by province and crop, and watch for a group growing where it wasn't. Then check that against the farming calendar. A rise that matches expected pest pressure for the week counts. One that doesn't gets flagged for a person to look at.
That's the difference between a content tool and an early-warning one.
Both of these replace something we shipped with a weaker version of it. Both turn a judgement call into something you can test.
The hidden rules we wrote with legal stop the model saying certain things. You can't test a prohibition on every video, and a longer prompt gives it more room to fail.
The stronger version looks each claim up. A claim in a draft has to match the registered product label for that province, or an approved technical document. Anything that can't be matched gets stripped out or sent for review. Registration varies by province, so this also solves a problem we had no answer for.
Compliance becomes a pass or fail on every video, with a log.
The Virality Lab put a percentage on every suggestion, and within a week people were treating it as a target.
The replacement is narrower and honest: one model per region, trained on that region's own watch-through, saves and thread-opens, scoring a draft against the audience it is for and showing how sure it is.
Where there isn't enough local data, it refuses to produce a number instead of inventing one.
The handover from comment to shop is still manual, and it's where most of the value leaks. Software can hold that gap, as long as its job is drawn tightly enough.
It opens the thread, confirms province and crop, works out which shop stocks the thing, and hands over with a summary of what the farmer already said.
It doesn't diagnose. It doesn't name a dose. The moment the conversation turns agronomic, it stops and fetches a person.
It only does what it can do without error, because a wrong farming answer costs more than a slow one.
Getting to eight markets was done the expensive way. New channels from zero, new voices, new content, and the learning curve paid for again each time. That works once.
Crop mix, pest calendar, how people use the app, language family, shop structure. Worked out from data already held.
A new province starts with the settings, hook patterns and content calendar from the market most like it, instead of from nothing.
Inherited settings are a starting position. The nightly allocation pulls them toward what works locally within weeks.
Voice bank, pest word list, registered product list and local music. Everything else carries across.
An argument about voices and guardrails only counts once it's a screen someone taps at the end of a working day. What follows is what shipped, and what should have.
The shipped screens, redrawn. The change running through all of them is the same: wherever the system did something on its own, the screen says so, says which part did it, and says whether a person still has to confirm.
Name, user type, country and language. Four roles: admin, shop, service team, content team.
Role became a permission model. The market panel checks for a regional voice and a named agronomist at setup, so blockers show up before a channel exists.
accent picks the nearest regional voice automatically. Anything with commercial or farming consequence is marked never.
You can set up and run a starter channel today. Live selling and product recommendation stay locked until one is assigned.
FYP simulator matching influencers, keywords and regions. Top trends, keywords, followers and farmer leads. Emerging pests, diseases, treatments and competitor products. One-click video from trending data.
Local pest names lead, scientific names sit behind them. Every signal shows how far it has spread and whether anything backs it up.
scout groups and ranks continuously. One-click generation stays, but a thin signal makes it a draft instead of automatic.
The volume is concentrated in three large accounts. Generation stays a draft until an agronomist confirms it.
Suggestions for video with a score, trending music, best posting time, regional tone, crop and pest themes, length and end-card suggestions.
The suggestions are unchanged and good. The score is now trained per region, says what it predicts, and shows a range.
dial shifts posting budget nightly across variations. Where a province has no history, no number is produced at all.
A number built from 41 posts would be made up, and a number on a screen becomes a target within a week. Publish it unscored and scoring switches itself on at around 200 posts.
Five ways in: voice memo, remix, article, trend, filled-in form. Under five minutes to a finished video. Faceless with voiceover, or a generated presenter.
The queue and the five ways in stay. Hooks come from a question the audience already has or an observation in the source, and every line traces back to a timestamp in it.
accent sets voice and vocabulary from the channel. ward reads every claim and decides whether it can ship.
"Rầy nâu đang xuất hiện sớm hơn mọi năm ở ba tỉnh. Bà con nên ra ruộng kiểm tra gốc lúa tuần này."
Can't be scheduled until it's cleared. The queue is four hours. Everything else in this draft is ready.
Goals such as 1,000 followers in 30 days. Suggestions on what to repost, which comments to turn into video, who to follow. Channel settings for accent, tone, crop and segment.
The follower goal is demoted. What opens live selling is a named expert and an answer rate. Posting frequency shows the band between too slow to grow and flagged as a bot.
dial spends the daily post budget across variations and varies the timing so the account reads as a person.
Enough volume to grow, irregular enough to look human.
The original used 1,000 followers as the gate. Two of these four are about being able to answer.
Upload images or video. Automatic tagging by pest, disease, crop and treatment. Faster search and video making.
A source and rights column. The pilot used footage scraped off the web and nothing tracked where any of it came from.
Tagging stays automatic. Rights belong to the file, so restrictions travel with it into every video.
Everything published across channels. Filter, remix, repost or reassign, with performance per post.
A history trail. A remix of a remix of a voice memo now shows that chain, so any claim can be traced back to the mouth it came from.
When a source claim is corrected, everything made from it gets flagged instead of quietly carrying on.
Two videos made from it flagged automatically. Neither has been reposted since.
Awareness, prospect, lead, contact, follow-up, action. Generated tasks at every stage, a lead list, CRM links, order form. LINE, Zalo, WeChat and WhatsApp.
The tasks stay. Three stages now carry a real mechanism instead of an instruction: the end card knows the shop, the comment opens the thread, the thread carries the context.
usher opens threads and routes them by province. It stops the moment a question turns agronomic.
"Lá lúa bị vàng đầu, có phải đạo ôn không?"
The shop picks it up with the photo attached, and escalates to the agronomist if they ask.
QR codes for stock, discounts and vouchers. Batch numbers and quantities. Voucher stats: issued, redeemed, total value.
Codes are issued per channel, so a scan traces back to the video and province that produced it. Registration is checked against the province where it's scanned.
Attribution runs automatically. An unregistered product warns at the counter before the sale, instead of showing up in a compliance report later.
Warn before the sale. A registered alternative is offered automatically.
Manage growth across starter, growth and live. Filter by crop, stage and followers. Quick stats and suggested actions.
Each row carries a readiness bar and the specific blocker. A channel can be growing well and still be locked, and the screen says which.
The fourth card is amber on purpose. Threads opened at 3.6% of reach is the weak step, so the screen leads with it instead of follower totals.
Rice Farming Expert TH has the audience but no agronomist named for Chiang Rai, so the two locked features stay locked.
The screens above make things. These decide things, and each one comes straight out of the research.
Ten other screens assume an expert can step in. This is where they do it.
Ordered by consequence first, then by how long a farmer has waited. Dose, timing and diagnosis always land here whatever the model's confidence.
It escalates on consequence. A confident wrong answer would never have escalated under the original design.
"Likely nitrogen deficiency at this stage. Consider a foliar application."
Yellowing tips at 40 days matches nitrogen deficiency, bacterial leaf blight and water stress. The model is confident and the three responses are different, so consequence decides.
Accent carried most of the localisation effect. Picking “Vietnamese” gives you a Hanoi voice, which in the delta is the capital-city problem one level down.
Voices contributed by field teams, indexed by province. Selection is a measured distance from the audience's own speech.
Matching is automatic. Where nothing sits close enough it says so instead of falling back, because a wrong accent is worse than a neutral one.
Below the 0.20 threshold. Applied to every asset this channel produces.
The nearest contributed voice is 0.44 away. The system won't substitute the national default. Recruit a local contributor, or publish faceless with captions.
Trends tell you what already happened. The farmers who needed that content acted a fortnight ago, and every channel in the country is now posting it.
Groups incoming comments and searches by province and crop, and watches for a group growing where it wasn't. Checks it against the farming calendar.
Spotting it is automatic. Acting on it isn't. A new group with no seasonal basis goes to an agronomist before anything is drafted.
Spread across several places, seasonally plausible, and nobody is posting about it yet.
The topic is already saturated. No advantage in adding to it.
Fast growth with no seasonal basis is either a new problem or a misidentification. Both need a person before anything is published.
The agronomy team asked for access to this screen before the commercial team did. Early clusters are the only part of the platform producing something the company couldn't already buy: a read on what's happening in fields, ahead of the field force.
The hidden rules we wrote with legal stop the model saying certain things. Prohibitions are hard to test and easy to route around as prompts get longer.
Every claim gets matched against the registered label for that province or an approved document. What can't be matched is stripped or sent for review. Registration varies by province, which was previously unanswered.
It runs on every video, with a log. A nightly test suite runs against the rules, and a failure blocks the release.
The features stayed and the floor moved up. Legal helped design the rules instead of reviewing output, which is a far better use of them and the reason this works past one market.
The factor test cost a season and the answer is already going stale. Audiences shift, sounds change, a voice that lands in one province drifts in the next. Doing it by hand across eight markets isn't realistic.
Each local variation is an option, posting volume is the budget, and the split shifts nightly toward what works in that province. The others keep a small share.
A person sets the options and defines the goal. The machine only decides how much to spend on each.
The losing options keep a slice, so the system notices when the audience shifts. Converging with no floor is a trap.
Reward views and it finds rage bait within a fortnight, and it'll be right to. Only a person can change this.
The product works in one province. Whether it's a business depends on how little has to be rebuilt for the next one.
What makes it a business is the part that builds up: the data the platform collects, and the things that only become possible once you hold it.
None of it can be bought. It only exists if you run the platform and read what comes back.
Four sets of data build up just from running it, and each one makes something further down this page possible.
All four are by-products of running the channels.
Every comment sorted, grouped and dated. A running map of what's worrying people, district by district, ahead of the field force.
Which accent, vocabulary, music and tone hold attention in which province. The output of every night the system runs.
Every queue item an expert approved, corrected or rejected, with the reason attached.
Comment to thread to scan, with the post, province and crop attached. The only chain in the whole system that reaches a sale.
A new province inherits settings, hook patterns and a content calendar from the market most like it, then the system corrects them within weeks. What has to be built fresh is a short list, and that list is the real cost of a market.