81
Repsense

The Road to Ceuta: Mapping the Online Mobilisation Infrastructure

0.0sFASTEST 6-GROUP SPREAD

In July 2026, posts telling people the Ceuta border was open spread through Moroccan Facebook groups faster than any person can type. We traced how. This report walks through the operation in six steps, mapped from 25,335 captured posts.

Window1 Jul – 17 Aug 2026 Dataset25,335 captured posts · 9 platforms
SCROLL ↓
Research scope
25,335
Posts captured from the 14 groups
9
Platforms monitored
48
Days · 1 Jul – 17 Aug 2026
1,201
Narrative threads detected
The bottom line

A small operation with a repeatable routine ran the campaign: it pushed the same post into fourteen existing communities at once, hid it under celebrity hashtags, and moved recruits to WhatsApp.

14
Facebook groups used · all existed before the campaign
81s
One post placed in 6 groups · shortest gap in this run: 4s
One post's route through the system
The machinery in five stages: a text is written once, an operator places it in the fourteen groups, two hashtag sets carry it to its audiences, readers are moved to WhatsApp, and the crossing follows. The example shown is the "legal loophole" post of 29 July. The same machinery served both waves of the summer: its posts preceded the mass crossing of 30 July, and the same groups and WhatsApp contacts then recruited for the 15 August attempt.
1
The post is written
… استغلال ثغرة قانونية …
"a legal loophole means Spain cannot send you back"
The claim is false: the Spanish court ruling it cites does not ban returns, it sets out the procedure for carrying them out.
2
One click posts it
An operator places the text in six groups in 81 seconds – the first two only 4 seconds apart. Across the ten fastest runs the shortest gap measured is 2 seconds. The machinery is active from 08:00 to 01:00 (UTC+1).
3
It lands in 6 of the 14 groups
This run reached six established diaspora communities; over the summer the same routine used all fourteen.
4
Readers message WhatsApp
The posts point readers to WhatsApp: 22 numbers and invite links over the summer, each retired and replaced after about a week. After 8 Aug no new contact appears in public – planning continues in private chats.
5
The crossing
30 Jul: tens of thousands cross at Ceuta. 15 Aug: a second attempt gathers at Fnideq and is stopped.
01

The campaign ran inside fourteen pre-existing diaspora communities

How much of the groups' activity was the campaign
4.0% CAMPAIGN CONTENT
1,009 posts – Ceuta campaign content
24,326 posts – everything else these groups posted.

Fourteen Facebook groups already existed for Moroccans abroad and those hoping to leave: everyday talk about visas, transport, work in Europe. The campaign posted into these communities. Its content made up 4% of what the groups posted this summer – and that 4% was enough: within weeks, tens of thousands crossed at Ceuta.

The fourteen groups
Node size and number = cross-posted posts the group carried, i.e. posts whose text also appeared in at least one other group (1 Jul – 16 Aug) · teal chords = texts shared between two groups · dashed spokes = groups that carried @haraga_europa_900. Hover a node for its total capture.
34Haraga Melilla 2023 🇪🇸31Haraga Tanger–Málaga24Haraga_maroc عشاق الغربة11الغربة LGhorba 🛳️22Haraga EUROPA 🇪🇸8Transporte LGhorba7lGhorba الغربة · tiktok11HARAGA8Haraga groupe5Haraga oropa 🇪🇦⛵1Haraga Ispania 🚤1haraga melilla@haraga_europa_900
@haraga_europa_900 (promoted account) Hub-carrier group Amplifier group Shared campaign
@haraga_europa_900 is the promoted account the ring re-posted: it appears 28 times in the capture, always behind the same fixed hashtag block. Six of the twelve groups carried it repeatedly – those six are the hub carriers. The diagram maps the twelve groups in the cross-posting chains; the table below lists all fourteen groups in the capture.
GroupPostsTextsRatioActiveRole in the chainsTier
Haraga Tanger malaga2411561.51 Jul – 16 Augin both posting listshub carrier
Haraga melilla 2023 🇪🇸1661321.31 Jul – 16 Augin both posting listshub carrier
الغربة LGhorba 🌎✈️🛳️109761.41 Jul – 7 Auglist Ahub carrier
Haraga_maroc عشاق الغربة101761.34 Jul – 16 Auglist A · starts the 16 Aug runhub carrier
Haraga EUROPA 🇪🇸🇩🇪🇨🇵🇪🇺98811.23 Jul – 16 Auglist Bhub carrier
Transporte Lghorba94691.41 Jul – 16 Auglist Ahub carrier
Lghorba 🗼الغربة 🇮🇹72252.91 Jul – 16 Aughighest repetition in the ring
HARAGA37281.36 Jul – 16 Auglist A · first group in 4 runsamplifier
Haraga groupe30231.34 Jul – 16 Auglist Bamplifier
lGhorba ✈️🛬 الغربة · tiktok26241.13 Jul – 16 Auglist Aamplifier
Haraga oropa 🇪🇦⛵🇮🇹18151.23 Jul – 16 Auglist Bamplifier
haraga melilla12101.229 Jul – 16 Augjoins the 16 Aug runamplifier
🚤 Haraga 🛫 Ispania 🇪🇦431.315 Jul – 6 Auglogistics posts onlyamplifier
Haraga 2020111.030 Julsingle post
How to read this: "posts" is everything we captured from the group; "texts" is how many different messages those posts contained. Divide one by the other and you get the ratio: at 1.0 every post is unique, like a normal conversation; the higher the ratio, the more the same messages were posted again and again, which marks the group as a noticeboard for copies rather than a conversation. "List A" and "list B" are the two saved lists of groups the posting tool used through July – each run placed the same text in one list's groups, always in the same order. "Tier": hub carriers re-posted the promoted account @haraga_europa_900; amplifiers carried its texts on.
From Fnideq to Jijel: where the posts set out from
How to read this: when group members wrote about setting out, they named towns. Bar length = how many group posts name the town.

Group members were not commenting on the news – they were organising journeys, naming departure points across Morocco (Casablanca, Marrakech) and as far as Jijel on the Algerian coast, about 1,300 km from Ceuta.

02

The same text was posted into six groups, in the same order

On 29 July, the same recruitment text – "a legal loophole means Spain cannot send you back" – appeared word for word in six different groups within 81 seconds. The same six groups, in the same order, took three different recruitment texts that day – at 15:23, 18:40 and 19:24. Press play to watch the fastest of the three at real measured timings.

One post, six groups, 81 seconds
00:00.0
29 Jul 18:40 · "legal loophole" post · timestamps as captured, scaled 10×
the post Group 1 · HARAGA+0s Group 2 · Transporte Lghorba+4s Group 3 · الغربة LGhorba+19s Group 4 · lGhorba tiktok+39s Group 5 · Haraga_maroc+74s Group 6 · Haraga Tanger malaga+81s
Exhibit A: one post, from writing to six groups
29 Jul 18:40 · 6 groups · 81s · shortest gap 4s · same six groups, same order, three times that day
أكثر من 1000 مهاجر مغربي هرب من المغرب 🇲🇦 إلى سبتة المحتلة 🇪🇦😨🏊‍♂️
والسبب استغلال ثغرة قانونية وضعتها الحكومة الإسبانية وهي حظر إرجاع المهاجرين الذين دخلو المياه الدولية الإسبانية في مدينتي سبتة ومليلية المحتلتين ✌️🇪🇦
#الغربة_عشقي
"More than 1,000 Moroccan migrants have fled from Morocco to occupied Ceuta. The reason: the exploitation of a legal loophole set by the Spanish government – a ban on returning migrants who have entered Spanish international waters at the occupied cities of Ceuta and Melilla."
THE RULING IT CITES IN FACT SETS A STANDARD RETURN PROCEDURE
The post as shared in the groups, 29 July
Screenshot: Facebook, captured during monitoring
Was it a person or a bot? The timing says: human hands with a tool
How to read this: we measured the wait between each group receiving the post, across the ten fastest spreads (45 measured waits in total).
Too fast for hand-posting

The shortest measured wait between two groups is 2 seconds, against a median of 16s. Opening a second group, pasting and publishing by hand cannot be done in 2 seconds.

Too uneven for a scheduler

The waits are uneven – 2 to 122 seconds, no fixed rhythm. A program running on a timer would post at even intervals.

One or more people using a mass-posting tool

Software that pushes one text into a saved list of groups with one click, operated by hand. The tool explains the 2-second gaps; the human hand explains the uneven rhythm. How many hands share the tool, the data does not show.

03

The posting has a daily rhythm: silent at night, heaviest in the evening

We placed all 1,014 campaign posts from the 14 groups on a 24-hour clock (UTC+1, the local time of the target audience). The same rhythm repeats daily: almost nothing between 02:00 and 07:00, steady posting through the day, and the heaviest volume in the evening.

Campaign posts by hour of day · all 14 groups · UTC+1
02:00–07:00 · almost silent40 posts · 4% of everything
20:00–23:00 · the busiest hours378 posts · 37% of everything
08:00–20:00 · steady postingthe remaining 596 posts fall here and in the late evening
00:0004:0008:0012:0016:0020:0024:00

The rhythm rules out one thing only: a program posting continuously on a server. The heaviest posting fell on the evening hours, which are the peak engagement window on Facebook.

04

One account disguised its posts as celebrity content

On 29 and 30 July, 32 posts closed with the same block of hashtags about Harry Potter, Harry Styles and hairstyles. The tags pushed those posts into entertainment feeds, where they reached people outside the groups, and where border-related keyword checks do not look.

foad.nabil.58
29 Jul · reposted media, credited to @haraga_europa_900
الله يسهل عليك وعلى جميع يارب
"May God make it easy for you and for everyone" — followed by a credit line: [emoji] @haraga_europa_900
#harrypotter #harleydavidson #hairstyle #harrystyles #happyvalentinesday #happybirthdaytome #harrypotter #haircut #hair #halloween #happyholidays #hatersgonnahate #haraga_europa_900 #haraharamahadev #hara #harajukustyle #moc #mor #moroccotravel #ori #oro #oro18k #morroco #morningmotivation #morenailuminada #morphebrushes #morena #moroccotravel #haraga #ميلانو #ايطاليا

A captured post, reproduced with its full hashtag tail. The highlighted tags have nothing to do with migration: #harrypotter appears on 37 campaign posts, the other four on 32 each.

All hashtags in the block start with "ha" – the pattern you get when someone types two letters and accepts the phone's hashtag suggestions. The campaign's own tag #haraga begins with the same two letters, so those suggestions would have surfaced every time it was typed – likely how the disguise was found. The ring hijacks other popular reach tags the same way, such as #fyp #viral and others.

What stopped on 30 July, and what kept going
How to read this: each bar shows how long a marker stayed in use, from 1 July to 17 August. The red line is 30 July.
JUL 1JUL 15AUG 1AUG 17

The two tag sets did different jobs, and that shows in when they stopped. The celebrity tags existed only to push posts into entertainment feeds. The diaspora tags are how the intended audience finds the content.

The block that never stopped · verbatim, same order every time
#algerie#espana#france#ghorba#haraga#italy#maroc#tunisie
One detail never changed: a block of eight country and migration hashtags, always the same tags in the same order. It appears on 159 posts between 1 July and 16 August – 47 with the base block, 25 with #paris added, 4 with #lwalida – and every one of those posts sits inside the 14 groups; the block appears nowhere else in the dataset. Whoever wrote these posts pasted the same tag block every time, which makes it a signature of this specific network.
05

Recruits were moved from public posts to private WhatsApp chats

The public posts did the advertising; the practical conversation happened in private. Campaign posts carried 22 different WhatsApp contacts – 9 group invite links and 13 phone numbers – and the numbers changed roughly every week, the way burner phones do: as one went quiet, a new one appeared. Weekly rotation is operational security – contacts retired before they draw attention – and it reads as a maintained recruitment layer rather than spontaneous community organising.

9
Group invite links
13
Direct-chat numbers
86
Public posts carried a WhatsApp contact
8 Aug
Last contact seen in public · 7 days before the date
Contacts were retired and replaced roughly every week
How to read this: each row is one WhatsApp contact (masked), ordered by when it first appeared. A bar shows the days that contact was advertised in public posts. The staircase shape means rotation: as one contact goes quiet, a new one starts. The amber line marks 8 August, the last day any contact appeared publicly.
JUL 1JUL 15AUG 1AUG 17

The contacts were maintained like burner phones: as one went quiet, a new one appeared, roughly weekly. The captured numbers are Moroccan, Egyptian, Dutch and Spanish. After 8 August no contact appears in public – a week before the 15 August date, recruitment had moved fully into private chats.

06

The tool ran again on 16 August, carrying content unrelated to migration

On the morning of 16 August, the day after the failed crossing, the tool ran again – this time carrying a post about a student event held that day at an Algerian university, nothing to do with migration. The capability remains in place for whatever is advertised next, and monitoring keyed to migration keywords does not see it between campaigns.

How we know it is the same machinery
Four markers tie the 16 August run to the July operation, all from the data.
The same groups

All seven groups in the 16 August chain are July ring groups, matched by Facebook group ID. The run happened inside the same network, not in a new set of groups.

7 / 7 group IDs match · seeded by Haraga_maroc, July list A
The same speed signature

The post moved from group to group every 13.4 seconds on average – in July the pace was 13.5. The shortest gap was 3 seconds, too fast for hand-posting, and the gaps were uneven, unlike a scheduler's.

94s / 7 groups · gaps 3–32s · same pattern as the other 17 spreads, 8 Jul – 16 Aug
The merged lists

Through July the tool posted to two separate lists of groups. The 16 August run placed one text across groups from both lists in a single sequence – the first time the two were combined.

list A + list B → one list of 7 · first combined run
The unbroken tag signature

The diaspora tag block runs through these same groups from 1 July to 16 August without a break – the channel's identity never changed.

#haraga #ghorba + 6 countries
16 Aug · 09:41 (UTC+1)
7 groups
94s
The widest one-click spread of the entire 48 days

The morning after police stopped the second crossing attempt, one identical post appeared in seven of the fourteen groups within 94 seconds – the same one-click posting pattern as in July, and the widest single spread of the whole monitoring period. This time the post had nothing to do with migration. The tool and the groups exist independently of the Ceuta campaign, and whoever holds them can point them at another date or another cause.

07

What the posts promised

Three things stand out: the false claim was assembled in stages rather than invented, a small set of formulas was repeated for weeks, and the strongest recruitment argument was that everyone else was already going.

The formulas: a handful of lines, posted for weeks
Each of these is a short text repeated across the ring over many days rather than a one-off post. Arabic as captured, translation beneath.
27 Jul – 13 Aug · Facebook
عن جمال أوروبا أتحدث
“It is the beauty of Europe I am speaking of”

Posted again and again for two and a half weeks behind a fixed tag tail ending in #paris.

15 – 30 Jul · Instagram, then Facebook
الله يسهل عليك وعلى جميع يارب
“May God make it easy for you, and for everyone”

A blessing posted every few days through July from accounts tagging #haraga_europe_officiel.

02 Aug · Facebook
أصغر حرااگ… وقتما بغا كايدخل لسبتة وقتما عجبو كايخرج هههه
“The youngest harrag… he goes into Ceuta whenever he wants and comes out whenever he likes, haha”

The same promise as the loophole post – that the border does not hold – delivered as a joke.

30 Jul · Facebook
هجرة جماعية نحو سبتة المحتلة.. إذهبوا إلى الحبشة (إسبانيا) بها ملك لا يظلم عنده أحد
“A mass departure towards occupied Ceuta. Go to Abyssinia (Spain), it has a king under whom no one is wronged”

The Prophet's instruction to the first Muslim emigrants, with Spain written in where Abyssinia stood. The post frames the crossing as religiously permitted.

01 Aug · Facebook
خبر عاااجل: الحاجز البحري الجديد بسبتة… الطول: 500 متر، الارتفاع فوق…
“Breaking: the new sea barrier at Ceuta… length: 500 metres, height above…”

The new barrier at the Tarajal spur, circulated with its measurements – practical detail for a reader planning to get around it.

05 Aug · TikTok
“See you there on 15 August” – a new call for a mass entry, named as circulating on WhatsApp and Facebook in Morocco

The second date, advertised in the same channel ten days ahead.

The strongest argument was that everyone was already going
On 30 July the posts shift from argument to reporting: three from that day.
30 Jul · Facebook
نساء وشيوخ وقاصرون.. هجرة جماعية من الفنيدق نحو سبتة
“Women, old men and minors – a mass departure from Fnideq towards Ceuta”
30 Jul · Facebook
لقطة اليوم من الفنيدق: رجل وزوجته وإبنته في طريقهم إلى سبتة، وخلفهم سرباي شاف الناس كيهربوا خلى الكليان كيتسناو القهوة وضربها
“Today's shot from Fnideq: a man, his wife and his daughter on their way to Ceuta – and behind them a waiter who saw people leaving, left his customers waiting for their coffee, and ran”
30 Jul · Facebook
عاجل من الفنيدق: بجنبات معبر باب سبتة والمراهقين باغيين يهاجرو.. شوفو شنو واقع
“Breaking from Fnideq: beside the Bab Sebta crossing, and the teenagers want to go – look what's happening”

What pulled hardest was the feeling that everyone was already going. A family walking, a waiter leaving his tables, teenagers at the crossing – for a reader still hesitating, these scenes say that people like them have decided, and that waiting means being left behind.

Conclusions

How the campaign was run

C·01

It borrowed its audience

Fourteen existing diaspora groups carried the posts. Nothing was built, so nothing could be taken down without touching real communities.

C·02

It posted with a tool, driven by hand

Identical posts landed in six groups in 81 seconds, with gaps as short as 2 seconds – too fast for hand-posting, too uneven for a scheduler.

C·03

Its posting kept a daily rhythm

Near-silent from 02:00 to 07:00, heaviest from 20:00 to 23:00 (UTC+1) – the evening hours when Facebook engagement peaks.

C·04

It hid its posts under celebrity hashtags

#harrypotter and four similar tags pushed the posts into entertainment feeds and past border-keyword checks.

C·05

It closed deals on WhatsApp, on rotating numbers

22 contacts, changed roughly weekly, moved recruits from public posts to private chats. From 8 August the contacts stopped appearing in public at all.

C·06

It recruited with a handful of repeated lines

The same few short texts were re-posted across the ring for weeks: a promise of Europe’s beauty, a blessing for the road, a joke that the border does not hold. Several ran behind the fixed tag block of section 04.

C·07

Its strongest argument was that everyone was already going

On 30 July the groups filled with scenes of real departures – families walking, teenagers gathering at the crossing. Every post carries the same signal: everyone around you is already going.

C·08

Its machinery outlived it

The morning after police stopped the second crossing attempt, an identical post appeared in seven of the same groups within 94 seconds – at a similar speed to July – this time on an entirely different topic, unrelated to migration. The infrastructure is intact and reusable.

Method & verification

Data. Two data sets underpin this report, both covering 1 Jul – 17 Aug 2026. The first is the unfiltered capture of the fourteen groups – 25,335 posts, everything the groups published. The second is the cross-platform topic set – 12,337 posts and comments across nine platforms that matched the Ceuta topic (Facebook 4,177 · TikTok 2,230 · X 2,203 · Bluesky 1,733 · Instagram 1,026 · YouTube 957 · Threads 9 · Reddit 1 · web 1)

Tools. Narrative detection and topic analysis were performed on Havel, Repsense’s narrative intelligence platform.

Repsense REPSENSE NARRATIVE INTELLIGENCE