Viaggianow · AI Marketing Manager · Product tour, 27 August 2026
Sixteen specialist AI agents plan, write and measure the marketing for a travel agency — and not one of them can spend a euro, publish a post or answer a customer until a person says yes.
A travel agency running campaigns across Italy, Egypt, Germany and the Gulf needs a marketing team it cannot afford: someone to plan campaigns, write posts in nine languages, buy ads, chase leads, watch reviews, and explain last week's numbers.
Viaggianow is that team, as software. The manager states an objective; specialist agents produce structured, sourced work; and every action with consequences — money, publishing, messaging a customer — stops at an approval queue until a human decides.
The product is not the content generation. Anything can generate content. The product is the gate, the audit trail, and the refusal to state a price or an availability the system has not actually looked up.
This is a real sequence, so it is numbered. Each step is enforced in the API, not in the interface — a caller with a valid token and the wrong approval still gets a 403.
A specialist returns structured output — a campaign plan, ad copy, a reply draft — with its sources attached.
Anything that spends, publishes, sends or answers publicly becomes an approval request, bundled by intent.
ApprovalGateMiddleware refuses the action at the API. Unknown state fails closed: a campaign with no budget row is refused, not treated as zero.
Approve, or request revision with a reason. The Chief Agent regenerates against that reason.
Who, what, when, which agent, which automation rule. Append-only, and it outlives everything else.
An Owner may switch on an automation rule to skip the queue for a narrow case — activating a campaign under a budget cap, say. Those rules carry a hard ceiling in a stated currency (an exchange rate inside a safety limit makes the limit soft, and a stale one makes it wrong), cannot be activated without a ceiling if they commit spend, cannot have that ceiling raised while live, and every bypass they perform is written to the same trail with the rule’s own id attached.
Opens on what needs a decision today, not on a wall of charts. Every KPI tile carries its own provenance badge, and a tile only reads LIVE when every metric behind it is live — blended ROAS stays MOCK when it divides live revenue by mock spend.
That rule exists because a dashboard which rounds “partly real” up to “real” is worse than one that says nothing at all.
Every figure is labelled mock because no analytics provider is
connected yet. The badge comes from whichever adapter answered, not from a hand-typed string.
The queue the whole product exists to feed. Items arrive bundled by intent — a campaign plan and the six ads it implies are one decision, not seven.
Requesting a revision is a first-class action carrying a written reason, because “no” without a reason produces the same output again.
Decided items stay visible behind a toggle. Hiding them would make the screen disagree with the audit trail that still names them.
| Item | Type | Raised by | |
|---|---|---|---|
| Estate in Costiera 2026 Go live · €4,000 cap |
campaign | Chief Agent | Approve |
| 3 posts · Sharm el-Sheikh IT, DE, AR |
content | Copywriting | Approve |
| Reply to 1★ review safety complaint · escalated |
urgent | Reputation | Review |
| Newsletter · September 2,140 consented contacts |
Email Agent | Revise |
Journey #1 of the vision document, covered end to end by Playwright against the real stack.
The Chief Agent answers in the manager’s own words — “why did bookings drop this week?” — by calling the Analytics Agent and reporting what it found.
The answer separates measured data from hypothesis and labels which is which, cites the campaigns and channels it used, and offers the next action as a button that still goes through the approval queue.
An agent may only state figures a tool call returned. Anything else is marked a draft or an estimate and is blocked from every publishing path.
Structure, sourcing and the approval button are shipped and tested. The
language itself needs an Anthropic__ApiKey — see “what is honestly not done” below.
Six working areas, each a real screen against a real database.
Destination, audience, markets, channels, budget — then Generate strategy. Paid Ads, Copywriting and Creative return one structured plan that lands in the queue as a single bundled request.
A campaign moves through a real state machine: Draft → Pending → Approved → Active → Completed. Stopping is never behind an approval — you can always halt spending immediately; only starting it needs a yes.
Spend is derived from metric rows rather than typed in, so the budget bar cannot quietly disagree with the numbers underneath it.
| Name ↓ | Market | Objective | Status | Budget |
|---|---|---|---|---|
| Estate in Costiera 2026 | Italy | Bookings | active | 1,840 / 4,000 |
| Sharm Winter Sun | Germany | Awareness | pending | 0 / 2,500 |
| عروض البحر الأحمر | Egypt | Leads | active | 920 / 1,500 |
| Winterreise nach Ägypten | Austria | Bookings | draft | — |
Sorting reaches all seven list screens and carries a unique tiebreaker, so paging a tied column never repeats or drops a row.
A board by pipeline stage, with a score band on each card. The score is an additive rule over five factors, not a calibrated probability — so the detail page shows the whole sentence that produced it, never a bare 0–100.
Companies can be created inline from the lead form: the need appears halfway through typing, and navigating away to satisfy it would discard the half-entered form. Typing a name that already exists selects the existing row instead of creating a twin.
Consent status is a first-class field on every contact, and opt-out is enforced in the send layer rather than in the interface.
English, Italian, German, Spanish, French, Portuguese, Russian, Chinese and Arabic. Arabic flips the entire interface to right-to-left — navigation, icons, tables and the sidebar transform — because a translated string in a left-to-right shell is not a localised product.
Content is generated per market, not translated from an English original. A German winter-sun ad and an Egyptian one are different arguments, not the same sentence twice.
The same components, mirrored. Layout uses logical properties throughout, so direction is a data change rather than a second stylesheet.
Thirty-five routes, each behind a role check enforced at the API. This is the complete list — nothing here is planned or partial unless it says so.
KPI tiles with per-metric provenance, daily plan, alert feed.
In-app onboarding that states known gaps rather than hiding them.
The queue. Approve, or request revision with a reason.
Chief Agent, conversation history, sourced answers, inline actions.
List, detail, state machine, derived spend against budget.
Wizard that emits one bundled strategy request.
Ads by campaign and channel, with platform publish state.
Headline, body, creative, daily budget, approval state.
Concepts kept as words about a picture, not fabricated images.
Scheduled posts by channel and market, colour-coded.
Per-market, per-language items with A/B variant groups.
Pipeline stages, score bands, inline company creation.
Opportunities, activities, the full scoring explanation.
The suppression register, searchable and demonstrable.
Reviews, deterministic triage, escalation, draft replies.
Campaign ROAS, anomalies, budget advice, each able to say “I don’t know”.
Daily snapshots, comparisons, CSV/PDF export, scheduled delivery.
The roster, per-agent cost, task history, reachability.
Versioned prompts in the database, never hardcoded.
Brand memory the agents retrieve from before writing.
Nine providers, credential vault, connection probe, sync.
Rules with hard ceilings and their bypass history.
Countries and languages the agency actually sells to.
Invite, assign roles, deactivate — enforced at three points.
Two-factor enrolment, recovery codes, session policy.
Append-only trail of every AI action and human decision.
All sixteen are built, registered and contract-conformant — a shared test suite enforces the same shape on every one. Nine are reachable from a real trigger today. The other seven are a product decision, not a missing feature.
Wiring them would take an afternoon and would be the wrong call. The vision names all sixteen but specifies a trigger for none of them, and they appear in none of the user journeys. Connecting them to entry points nobody asked for would be a product built by whoever was nearest the keyboard. A test pins the current state, so each agent must either be reachable or carry a written note saying what it is waiting for — the gap cannot widen quietly.
The question for the business is which of the seven it actually wants, and what should set each one going. That is a conversation, and it is a short one.
| Integration | State | What that means |
|---|---|---|
| Meta Marketing | live adapter, off | Reads spend and performance. Read-only by construction — it has no way to create or fund anything. |
| Google Analytics 4 + Search Console | live adapter, off | Switches on with one setting. Needs a service account granted Viewer on the property. |
| Google Ads | live adapter, off | Creates campaigns paused, under a daily ceiling, behind the approval gate. |
| SendGrid email | live adapter, off | Consent and suppression are enforced above the adapter, so no adapter can bypass them. |
| WhatsApp, CRM, payments, social | mock | Mock adapters with the same contract, so swapping one in changes configuration, not code. |
| Booking engine | blocked | The revenue source of truth. Needs the vendor named before an adapter can exist. |
Nothing is claimed live without a tested credential. With no configuration every
provider reports Mock, and a test asserts exactly that, so real traffic cannot
appear unnoticed.
Stated plainly, because a demo that hides this is a demo that breaks in the room.
Four stages, in the order they unblock each other. This is a sequence, so it is numbered — stage 2 is worth little until stage 1 lands.
Nothing here needs new code. Every item is a credential or a decision, and each one converts work already paid for into working software.
mock badge on the dashboard with real traffic, spend and search data.The MVP proved the workflows are correct. This stage is about the twentieth time someone does them, not the first.
Everything so far tells you what was published and what it cost. This stage tells you what it earned — and lets the system act on that with a ceiling.
The architecture already assumes a single tenant carefully enough that multi-tenancy is an addition rather than a rewrite.
The hard part of an AI product is not generating text. It is being trusted with the consequences — and trust is made of unglamorous things: a gate that fails closed, a ceiling that cannot be raised while live, a badge that admits when a number is fake, an agent that says “I don’t know” rather than guessing.
Those are built, tested and deployed. They are also the parts nobody builds after the fact, because retrofitting an approval gate into a system that has been publishing for six months means auditing everything it already did.
What remains is mostly credentials and product decisions, not engineering. That is an unusually good position to be in.
Judge it on the workflow, the safety model and the engineering — those are demonstrable today at viaggianow.site. Do not yet judge it on the quality of AI output, because no agent has spoken to a real model. That is one key away, and it is the first thing to fix; but until it is fixed, anyone claiming the AI is proven would be overselling it.