Eleven movements built the machine. The twelfth is the schedule that keeps it from breaking silently: a check cadence with an owner on every line, synthetic form monitoring, ad-account funding control, and document flow with tax-office deadlines.
Cadence, synthetic monitoring, the advertising tax and document flow with four breakdowns
The full cadence, QA protocols, the document-flow map
ops_regulation.md, qa_protocols.md, document_flow.md, n8n_ops_watchdog.json, README.md
All thresholds and volumes — from previous movements; the legal structure — from the LUMÉ Bible
A network of four aesthetic-cosmetology studios in Kyiv. An LLC + VAT payer + MoH licence (LUMÉ Bible). Marketing contractors (movement X) are group-3 sole traders. The ad accounts are Meta and Google (Irish entities). There's no dedicated ops manager — the background work is run by the marketing lead, part of it handed to automation.
ops_log — a sheet in the same file as movement VIII's reportn8n_ops_watchdog.jsonEvery line — what · owner · what counts as a failure · where it's written. Full version — ops_regulation.md.
raw_spend = acts / invoices = bank charges1 · baseline
Check when something breaks or when someone asks: noticed the ads stopped — topped them up; the accountant asked for an act — found it.
2 · what's wrong
A reactive model means every breakage first costs money, then gets fixed. A form that stops sending enquiries is discovered by a dip in the report a week later. An ad account at zero balance — by a delivery drop in the middle of a campaign. A missing act — at a tax audit. "When there's time" in practice means "never."
3 · senior level
A cadence: every check has a period, an owner-role (not "the team"), a failure definition and a place to record it. A failure is not a rating but an input to an action with an obvious next step. What a machine can check, n8n_ops_watchdog checks; a human reads the signals and fixes. The result of every check is a row in ops_log; an empty log for a week is visible at the retro and means the cadence isn't running.
4 · outcome
Breakages are caught before they cost money. The cadence isn't a document in a folder — it's a schedule in the calendar plus automation. Checkability: ops_log shows what was done and when.
In movement VIII 6.7% of enquiries went unanswered — partly from a silently broken form or integration. Protocol — qa_protocols.md No. 1.
Every day at 09:05 n8n sends a test enquiry to every live landing page and quiz, waits 2 minutes and checks raw_leads: did a row appear, were the UTMs preserved, was the channel set. Test rows are marked is_test=true and don't reach the metrics.
Failure → an alert to the marketing lead and the developer (movement X), campaigns on that landing are paused until it's fixed.
1 · baseline
Once a month, manually send a test enquiry from every landing and see whether it arrived.
2 · what's wrong
A "once a month" manual check catches a breakage on average two weeks after it happened. If a form stopped sending enquiries on the 3rd and the check is on the 28th — that's 25 days of lost paid leads. This is exactly how the 6.7% unanswered in movement VIII accumulate: not a lazy manager, a silently severed channel.
3 · senior level
Synthetic monitoring: a robot walks the whole enquiry path every day — from the POST on the webhook to a row appearing in the CRM with the right tags. The whole chain is checked (form → n8n → UTM normalisation → write), not "does the page open." A 2-minute window — if the enquiry didn't arrive or arrived with no UTM, campaigns on that point pause automatically, before a human steps in.
4 · outcome
A broken form lives for up to a day, not a week. Lead loss from a technical breakage stops being a hidden line item in the report.
| Step | What we check |
|---|---|
| Inventory | a list of all URLs the ads and organic lead to |
| Tags | GA4 and Meta Pixel on every page, no duplicates |
| Events | walk the funnel with a debugger: page_view, quiz_start, quiz_step, lead fire with the right parameters |
| Conversions | tied to lead, not to page_view and not to a button click with no submit |
| Volume reconciliation | the number of lead events in GA4 ≈ the number of enquiries in raw_leads (a > 10% gap — something isn't counted or is double-counted) |
| Consent | the banner doesn't block the tag after consent; for medical data — a separate checkbox (movement IX) |
1 · baseline
Open the page, check in the extension that the GA4 tag loaded — it's there, so it works.
2 · what's wrong
"The tag loaded" doesn't mean "events are written correctly." A conversion can be tied to the "thank you" page load — and then anyone who just opens it by a direct link counts as a lead. Or the lead event is duplicated by two tags — and CPL in the report is half the real one. A visual check doesn't see this.
3 · senior level
The audit ends with a volume reconciliation: over a month the number of lead events in GA4 should match the number of rows in raw_leads (movement VIII) within 10%. A gap is a signal: the event's on the wrong trigger, a duplicate tag, or enquiries go around the tracking. Plus a check of every funnel event with a debugger, not just the fact the tag loaded.
4 · outcome
The numbers movements VIII and XI make budget decisions on are checked to be counting exactly what they should. A gap is caught in a month, not surfacing during a post-mortem of a failed campaign.
Meta and Google invoice from Irish entities. For a Ukrainian LLC that's two obligations you can't find out about at quarter-end. Details — document_flow.md §3.
art. 141.4.6 of the Tax Code (20% on Meta/Google payments "from own funds") was removed by Law No. 1525-IX effective 01.01.2022; Bible v0.5 kept it active — its status was frozen at the "bill passed a first reading" stage
What actually applies: only 20% VAT on non-resident services (art. 208) — reverse-charge: the VAT-paying recipient accrues 20% of tax liability with a right to a tax credit. Cash-neutral (for taxable activity), but it requires a separate tax invoice registered on time for each bill — otherwise a late-invoice penalty. Branch: if part of the studio's services are VAT-exempt medical (art. 197.1.5), the input VAT on that share won't be credited.
Consequence for movements VIII and XI: in v0.6 the "+20%" is removed. Meta ₴1,942 (not ₴2,331), Google ₴1,504 (not ₴1,805), paid CAC ₴2,106 → ₴1,806, LTV/CAC 8.4× → 9.8×, a mature studio 9.2% → 9.5%. Kill/scale thresholds recomputed. The lesson for the background block: the status of a tax rule is data too, and it goes stale; "a repeal bill is in progress" needed a check on whether it had already become law.
1 · baseline
Attach a card to the ad account, it pays itself. Deal with it when the ads stop.
2 · what's wrong
The ads stop at the worst moment — mid autumn-peak campaign (movement XI) — because the card ran out of money or the bank declined the non-resident payment. It's noticed by a delivery drop, days are lost recovering. And the VAT invoices on non-resident services are remembered when the accountant does the quarter — and it turns out the invoices weren't handed over on time (a late-invoice penalty).
3 · senior level
Three layers of control: daily — automation watches the balance and the "days left" forecast, an alert at < 5 days; a reserve ≥ the monthly budget on the account, so a declined payment doesn't stop campaigns; monthly — invoices downloaded, reconciled with raw_spend and bank charges, passed to the accountant for the advertising tax and the tax invoices. Unit economics is computed off CAC with the tax.
4 · outcome
Campaigns don't stop over payments. VAT invoices on non-resident services are registered on time. And the status of tax rules in the model is checked every quarter — "a repeal bill is in progress" turned out, once, to be four years out of date.
Not accounting — the part that marketing runs, because only marketing knows what the service was and whether the work is closed. Map — document_flow.md.
| Document | Who prepares it | When |
|---|---|---|
| Contract / offer (framework) | lawyer / founder | once at the start |
| Monthly invoice | contractor | by the 5th of the next month |
| Act of services rendered | contractor + both signatures | by the 5th |
| Payment confirmation | the marketing lead records it | on the day of payment |
| Influencers — placement screenshot + "Sponsored" | SMM | on the day it runs |
1 · baseline
Collect acts and invoices when the accountant reminds you before the filing.
2 · what's wrong
By quarter-end it turns out three contractors have no acts for months there was work, one has left and isn't answering, and the influencer integrations have no closing documents at all. Reconstructing after the fact is slow and not always possible; without an act the spend isn't accepted as a cost (extra profit tax), and for sole-trader contractors without correct contracts and activity codes there's a risk of reclassification as employment.
3 · senior level
A calendar with a by-the-5th deadline for the next month: for every active contractor — act + invoice + payment fact in the /docs/contractors/{name}/{month}/ folder. The monthly cadence line checks completeness; no act for a worked month — escalation to close it. The "paid = received and accepted" reconciliation is done by whoever set the brief, not the accountant who sees only the sum.
4 · outcome
By filing time everything is collected. Costs are accepted, the reclassification risk is closed by contracts, payments with no closing documents don't pile up.
n8n_ops_watchdog.json — 26 nodes, import-ready. The automation catches and signals only on a deviation; a human decides and fixes.
| Trigger | What it does |
|---|---|
| Daily 09:05 | a synthetic enquiry on every landing from ops_endpoints → check raw_leads for 2 min → log; alert only on a failure |
| Daily 09:00 | ad-account balance from ad_accounts → "days left" forecast → alert at < 5 days |
| Monday 10:00 | UTM audit for the week against the regex → a message only if the not-to-standard share > 1% |
| Monday 10:00 | HTTP status of the live pages → a message only on non-200 |
| 1st of the month 10:00 | a month-close checklist in Telegram: acts, invoices, backups, access, consents |
Needs: the sheets ops_endpoints (list of forms and pages), ad_accounts (balance, average spend — filled manually or from the ad-account API), ops_log. Variables: LUME_SHEET_ID, LUME_TG_MKT.
Not "dashboard metrics" but boundaries past which the cadence requires an action.
The tax part is a map, not advice. VAT on non-resident services (art. 208), the sole-trader reclassification risk — described from the Tax Code and tax-office clarifications, but application depends on the deal structure and must be agreed with an accountant and a tax lawyer.
The "non-resident advertising tax" was removed from the model (Run 12, grade A). Primary text of Law No. 1525-IX (zakon.rada): art. 141.4.6 of the Tax Code removed effective 01.01.2022. Meta CPL ₴620 stays grade C (the one UA anchor: Rabbit Marketing 200–600 ₴/lead).
The watchdog hasn't run on live n8n. The node and expression syntax is written from platform knowledge. The HTTP nodes for ad-account balances assume data is put into ad_accounts manually or by a separate integration — there's no direct connector to Meta/Google billing in the workflow.
The cadence hasn't been broken in. Frequencies and owners are from practice, not the LUMÉ team's runs. On a real stream some checks will prove redundant, some insufficient; that's fixed at the quarterly retro.
research/source_register.md block R