The Monkee Engine — What Actually Happens When You Hit Create

BEHIND THE SCENES

Here’s what actually happens when you hit Create.

Five things you can click “Create” on inside Blog Monkee: a Blog Post, a Campaign, a Backlink, a Mention, and a Cloud Link. What follows is the real machine that runs behind each one. No marketing gloss: this is traced directly from the running code, real function names and real external calls included, and every place the interface promises more than the code actually does is called out on purpose.

5 pipelines traced
6 live hosting platforms
2 fallback AI models
100% traced to source

ONE ENGINE, FIVE OUTPUTS

Everything traces back to the same publish pipeline.

A Blog Post, a Campaign, a Backlink, a Mention, and a Cloud Link all run through the same client brand profile, the same writing engine, and the same WordPress publish gate, just pointed at a different job.

publishes directlysame-domain internal linkcross-domainbacklinkhosted onname only, no linkbacklink, 6 live hostsPillar PostSupporting PostMention ArticleCloud Link PageBacklink SitePoolMoney Sitethe client’s real site
Four kinds of content, one destination. A Pillar Post publishes straight to the Money Site; a Supporting Post either stays home as an internal link or rides the Backlink Site Pool; a Mention Article lives on that same pool but is written to never link back, only to say the brand’s name; a Cloud Link page is copied to six hosts, each one a backlink. Jump to any pipeline below.

PIPELINE 01 · BLOG POST

Turning one topic into a published, scored article.

Two entirely different systems can write a Blog Monkee post: a durable background pipeline and a live browser-only editor, both built to end up sounding like the same writer.

TWO FRONT DOORS

Submit a topic for a scheduled or campaign post, and it hands off to a durable background job queue. Use the live-preview editor instead, and the whole pipeline runs straight from the browser tab, calling the AI directly, with no queue and no safety net if the tab closes.

POST /api/jobs/content/generate → BullMQ content-generation queue · or contentGenerationService.ts → geminiService.ts direct

GROUNDED IN WHAT’S ALREADY RANKING

Before a word is written, the topic is checked against live Google results: competitor pages, “people also ask” questions, related keywords. That way the outline isn’t working from imagination alone.

EVERY PROMPT REBUILT AROUND ONE CLIENT

The client’s business name, industry, audience, and value proposition go straight into the prompt. If a full brand profile exists, the writer also inherits a required tone of voice, key terminology, a list of forbidden phrases, and real writing samples to imitate. The instructions are explicit that this is a dedicated writer for one business, not a generic assistant giving generic advice.

A QUIET FALLBACK WHEN THE AI STUMBLES

If the primary model gets overloaded or throttled mid-generation, the exact same prompt, client profile included, retries automatically on a second model, and the reverse holds true if that second model is the default. The reader never sees the hiccup.

Gemini ⇄ GPT-4o-mini, 120-second timeout race

SOURCING THE LINKS AND THE PHOTOS

Real cited sources and top competitor pages become the outbound links; if fewer than two survive, the client’s own RSS feeds get searched for something close enough. Photos come from the client’s own image library first, each one checked so a broken or private link can’t slip through, with stock photography filling whatever’s left.

A PUBLISH GATE THAT CAN SAY NO

Right before a post goes live on WordPress, the system scans the finished page for any image still pointing at a private storage link or a raw embedded file. It refuses to publish outright rather than ship a page with broken pictures.

assertNoBrokenImageHosts() inside publishToWordPress()

BEHIND THE CURTAIN

Two genuinely separate systems write blog content: a durable backend pipeline and a live browser-only one. A prompt fix made in one doesn’t automatically reach the other.

Search-engine indexing pings aren’t fired automatically after every publish. That’s a separate, batched action a person triggers afterward for everything at once.

↑ Back to the five pipelines

PIPELINE 02 · CAMPAIGN

One pillar idea becomes a content calendar.

A single flagship topic gets handed off across two chained job queues, so the whole run keeps executing long after the tab that started it is closed.

PLAN THE PILLAR

Pick the money-site client, write one flagship topic, choose whether this run is meant to build backlinks or plant mentions. The AI then turns that single idea into a list of supporting-post topics.

WHO DECIDES WHERE EVERYTHING LIVES

A separate execution step sets the start date, the days between each post, and a placement mode; everything stays on the main site, everything spreads across a set of backlink sites, or a mix of both. The assignment itself is plain arithmetic: post one to site one, post two to site two, wrapping back around once the list runs out.

backlinkClientIds[i % backlinkClientIds.length]

WHOSE VOICE ACTUALLY WRITES IT

The pillar post is written in the main client’s own voice, exactly like a standalone Blog Post. Every supporting post is written in whichever client it actually lands on: the main client’s voice if it stayed home, but the destination site’s own tone, audience, and forbidden phrases the moment it rotates out to a backlink site.

SURVIVES CLOSING THE LAPTOP

The flagship post runs synchronously in the tab that started it, then publishes immediately. Once it’s live, its web address is handed to a background queue that fans every supporting post out to the real content-generation queue, durable and completely independent of the browser that started it.

A REPORT LANDS IN THE INBOX

Once every post in the run has finished or failed, a full report (per-post SEO score, word count, status) is sent to the campaign’s owner.

Sent via the GoHighLevel messaging API

BEHIND THE CURTAIN

There’s an elaborate “Campaign Link Strategy” data model in the database: domain-diversity rules, anchor-text rotation, authority thresholds. None of it is actually called anywhere in the live pipeline. The real backlink mechanic is a one-line URL added to the list of links a supporting post’s writer is given.

What counts as “a backlink” is purely whether the post landed on a different domain than the pillar’s home site, regardless of whether the campaign was labeled “backlink” or “mention” going in. And if a campaign has cloud-linking turned on, finishing the queue also fires off the Cloud Link pipeline automatically, at the same money URL.

↑ Back to the five pipelines

PIPELINE 04 · MENTION

A brand-new article that says a client’s name — on purpose.

Worth stating plainly first: this isn’t a detector that scans the web for places a client is already mentioned. It’s the opposite: it manufactures a fresh mention, on demand, on a site the system already controls.

TWO TRIGGERS

Either a person builds a Mention Campaign naming a target brand, or the system starts one automatically, the instant any scheduled post actually goes live.

PICK A HOST SITE

The same pool of backlink sites is used here, but tracked on its own separate “last used for a mention” timestamp, so mentions and backlinks rotate through the same sites independently of each other.

WRITE AROUND THE NAME

The AI is asked for a topic that lets it mention the target brand naturally and positively, then the full article runs through the exact same writing pipeline as any other post, with one rule written directly into the instructions: never turn the brand’s name into a link.

TWO CLIENTS’ DATA, TWO DIFFERENT JOBS

The article is written in the host site’s own voice, usually the system’s generic defaults, since these are typically bulk-imported sites with no brand profile of their own. The brand actually being mentioned supplies a much narrower slice of information instead: just its name, industry angle, value proposition, and target keywords. That’s enough to describe it accurately, but none of its tone or forbidden-phrase rules, since it isn’t the one doing the talking.

A separate, slimmer mentionTarget object — no brandProfile

EXTRACTING THE EVIDENCE

Once the draft exists, a plain text scan (no AI involved this time) finds every sentence containing the brand’s name, keeps a little of the surrounding context, and holds onto up to ten of these snippets.

extractMentionContext()

BEHIND THE CURTAIN

Mentions and backlinks are close siblings sharing nearly all of the same machinery, the only real difference is one omitted hyperlink, but they run on very different clocks: a mention fires the moment it’s triggered, while a matching backlink has to wait for a companion Cloud Link page to finish deploying before there’s even an address to link to.

The data needed to show a client “here’s everywhere you’ve been mentioned” already exists in the database, but the campaign screen doesn’t call it yet. The collecting is ahead of the showing.

↑ Back to the five pipelines

PIPELINE 05 · CLOUD LINK

One keyword and one web address become a live page.

A short, AI-written page, copied onto six different hosts at once.

TWO INPUTS, ONE PENDING RECORD

A target keyword and the client’s real website address: typed in directly, or handed over automatically by a campaign that just finished. A database row is created immediately in a “pending” state, capped at twenty per campaign, and a background job is queued to do the actual work.

A FOCUSED PAGE, NOT A FULL POST

Not a full blog post: a tight 600 to 900 words, built from a short outline, using the same trusted-source link sourcing as everywhere else, ending in one call-to-action pointed back at the client’s site.

STILL THE CLIENT’S OWN VOICE, JUST SHORTER

Even though it’s a stripped-down page rather than a full post, the writer reads the exact same client profile as everything else: brand voice, value proposition, geographic market, target keywords. So a Cloud Link page reads as if it came from the money site itself, only condensed. When the client’s brand profile has an author link on file, the page’s structured data picks that up automatically.

ASSEMBLED BY HAND, SCRUBBED BEFORE IT GOES LIVE

The AI-written body, a machine-readable business listing built by ordinary code rather than the AI, and a small embedded map keyed to the keyword are stitched into one self-contained page, with every AI-produced piece scrubbed of any script or embedded code before it’s allowed to go anywhere near “live.” The finished page is written to the database first, so nothing is lost if a hosting provider fails partway through the next step.

DEPLOYED TO SIX HOSTS AT ONCE

If some hosts fail and others succeed, that still counts as a win: any address that comes back live is a live backlink.

Amazon S3
Netlify
Cloudflare
GitHub
Neocities
Vercel

TOLD TO THE SEARCH ENGINES RIGHT AWAY

Every address that comes back live is immediately submitted for fast indexing, without waiting on anything else to finish first. And the manager view quietly checks in every eight seconds until every page in sight has either gone live or failed, then stops asking.

BEHIND THE CURTAIN

Only one of these pages is generated at a time, on purpose: a deliberate limit to keep the server from running out of memory, since it runs on comparatively cheap infrastructure.

Deleting the record in the app never takes the live pages down. That’s by design: the entire point is a permanent footprint of links pointing at the client’s site. And re-deploying the exact same page always lands back on the same one of several possible hosts, calculated from the record’s own ID, not chosen freshly each time.

↑ Back to the five pipelines

ONE RUNNING THEME

A direct publish, an internal link, a cross-domain backlink, a link-free brand mention, or a page copied across six hosts: everything Blog Monkee builds points some kind of authority back at a client’s real website.

This is the same engine described on the Technology page, traced here down to the real function names and API calls, straight from the source.

Compiled from a direct reading of the Blog Monkee 3.5 source: packages/backend/src and packages/frontend.