Maritime Intelligence Brief · Verihelm / Dryad Global

MIB — the complete guide

Everything about the Maritime Intelligence Brief in one place: how the free & paid model works, how readers subscribe and get access, and — step by step — how the team produces a weekly edition. Plain English throughout.

Admin repository

Resources & links

Everything that makes an edition. Bookmark this page.

AssetWhere
Master sheet (regional feed)open the Google Sheet
Sync scriptSheet ▸ Extensions ▸ Apps Script (mib-hubdb-sync.gs)
MIB TEMPLATE PAID — clone this (clone weekly to start an edition)open in HubSpot
MIB TEMPLATE FREE — auto-seeded (the Create-free-summary button clones this — don’t clone it yourself)open in HubSpot
HubDB table — regionsMIB · Regional MSI feed
Paid render templateDesign Manager ▸ Verihelm_Theme/templates/verihelm-mib-blog-post.html
BlogsMIB Paid /en/subscriber (193373100713) · MIB Free /maritime-intelligence-brief (215219531370)
See it in action

A worked example edition

A complete demo edition, built by following the exact weekly process. Open it to see a finished paid edition, its regional feed, and the matching free summary.

Paid — full edition

MIB DEMO PAID

Graphic band (from the Featured Image), Weekly Analysis, and the regional feed — 5 regions, with Cyber empty to show auto-hide.

▶ View rendered  ·  edit in HubSpot

Free — summary

MIB DEMO FREE

The short overview + "this week examines" list + subscribe button, sharing the same graphic.

▶ View rendered  ·  edit in HubSpot

🛠️
How it was built (the weekly process): cloned MIB TEMPLATE PAID → set the Featured Image + PDF + Weekly Analysis → added the source links in the sheet and Pushed → clicked Create free summary and wrote the overview. Regions live in the HubDB table under edition key mib-demo. (Reference only — kept as drafts.)
Part 1

The model — what MIB is

1.1 The idea in one minute

Every week there is one Maritime Intelligence Brief, published in two versions from the same reporting:

Free · public

The summary

A short teaser of the week's headline risks. Open to everyone, appears in Google, and points readers at subscribing.

Paid · members only

The full edition

The complete brief — region-by-region detail, source-traced links, the weekly graphic & PDF, and the Weekly Analysis. Behind a login.

Paying members also get the archive — every past full edition, searchable in one place. That back-catalogue is a core part of what they pay for.

1.2 Where each version lives

Three separate publications on the same site, each with one job.

PublicationAddressWhat's on itWho reads it
Channel 16channel16… (home)General maritime newsEveryone · in Google
MIB — Free/maritime-intelligence-briefWeekly summariesEveryone · in Google
MIB — Paid/en/subscriberFull editions + archiveMembers only
🔒
The paid blog is set to members only — anyone not logged in as a paid member hits a sign-in wall, not the content.
📧
The free blog has its own subscription. Readers can subscribe to the MIB Free blog to get only MIB summaries — separate from Channel 16's general news. Publishing a free summary sends an instant notification email to those subscribers (right cadence for a weekly product). The paid blog has no public subscribe form — paid readers get access through membership, not a blog subscription.

1.3 What readers see

A non-member
  • • Reads the free summary, openly and in search.
  • • Sees an "Unlock the full brief" prompt → subscribe / checkout.
  • • Opening a full edition or the archive → a sign-in wall.
A paying member
  • • Logs in once; full editions then open normally.
  • • Reads the complete weekly brief.
  • • Browses & searches the archive of past editions.
🧭
The rule that avoids dead-ends: members-only pages are only for people who already have access. Anyone who needs to get or restore access is always sent to subscribe → checkout, never to a locked page.
Part 2

Access & subscriptions

2.1 Signing up & paying

Payment runs through HubSpot Commerce and Stripe — one clean path.

1
Click subscribe

From a free brief, an email, or the pricing page.

2
Stripe checkout

Pay via the secure HubSpot payment link.

3
Account created

HubSpot records the contact & payment.

4
Access granted

Marked paid, emailed a welcome + how to log in.

2.2 How access is managed

It all hinges on one contact field — mib_tier (free or paid). Workflows keep it correct automatically.

When…The automation…The reader gets…
Someone paysSets paid + adds to the members listWelcome email + instant access
A payment failsStarts a grace period + reminderA "please update payment" nudge, not an instant cut-off
They cancel / don't recoverSets back to free + removes accessA friendly "dropped to the free brief" email with re-subscribe link

The MIB Paid Members list is simply everyone whose mib_tier is paid. That list is the key to the paid blog — being on it opens the members-only content. Because it updates itself from the field, access follows payment with no manual admin.

Part 3

Producing a weekly edition

3.1 An edition lives in two places

SurfaceWhat you author there
The blog post (paid blog)Edition graphic + PDF, the Weekly Analysis, the advisory, the Read More teaser cut.
The master sheet → HubDBThe regional MSI feed — source-traced links, grouped by region.

The post pulls its regional cards from HubDB automatically, matched by an edition key. You never hand-build the cards — you fill a spreadsheet and press a button.

✍️
The free summary is written in the free post — not the paid one. It's a distinct, short overview (headline theatres + a "this week examines" list), not a shortened copy of the full edition. You don't write it inside the paid post. Instead, one click (Create free summary) creates a free-blog draft pre-filled with the graphic + a subscribe button + a placeholder, and you write the short summary directly in that draft. The paid post stays clean; the free summary is fully visible and editable where it lives.
🔁
What “Create free summary” actually does: it clones the “MIB TEMPLATE FREE” post (copies its structure + subscribe button) and the paid post’s featured image into a new dated free draft — you never clone the free template yourself. Prerequisite: create the paid edition post first (the button reads its slug + featured image). It won’t duplicate — if a free draft for that edition already exists, it leaves it alone. To change the default wording/look of every future free draft, edit MIB TEMPLATE FREE.

3.2 One-time setup (the connection)

Done once per person who will push. If the sheet already has a HubDB menu (in the Google Sheet menu bar, after “Help”) and Test connection is green, skip this.

💡
Where “Menu ▸ HubDB” points: the script adds a HubDB menu to this Google Sheet’s menu bar (after “Help”) — that’s what these steps mean by “Menu ▸ HubDB”. It’s separate from HubSpot’s own HubDB database, which is just where the regions are stored.
  1. Create the HubSpot key.

    Settings ▸ Integrations ▸ Private Apps (or the service-key path) ▸ create ▸ Scopes: tick HubDB (read & write) ▸ copy the token (pat-…).

  2. Install the script.

    Master sheet ▸ Extensions ▸ Apps Script ▸ paste mib-hubdb-sync.gs ▸ Save ▸ reload. A HubDB menu appears in the Google Sheet menu bar (after “Help”).

  3. Set the token.

    In the sheet, Menu ▸ HubDBSet HubSpot token… ▸ paste. It's stored in the script, never in a cell.

  4. Test it.

    In the sheet, Menu ▸ HubDB✓ Test connection → green "Connected ✓" = ready.

🔒
Token = password. Never put it in a cell, email, or chat. If exposed, rotate it (app's Auth tab ▸ Rotate) and set the new one.

3.3 The weekly routine

  1. Clone the standard.

    In the paid blog, clone "MIB TEMPLATE PAID". Rename it and set the slug to mib-YYYY-MM-DD.

  2. Fill it in — all click-based.

    Graphic → set the Featured Image (picker). PDF → select the "Download… (PDF)" button and use the link tool → Link to a file. Weekly Analysis → type. Move the Read More separator if needed. No source code.

  3. Set the edition key.

    Sheet ▸ ① Weekly feed tab, cell B3: type the same slug tail, e.g. mib-2026-07-07. Must match exactly.

  4. Add the sources.

    Each link: paste the Source URL in column A, pick the Region from the dropdown. Regions with no news → leave empty.

  5. Auto-fill.

    In the sheet, Menu ▸ HubDBFill headlines & dates. Review — type in any blank dates by hand.

  6. Push.

    In the sheet, Menu ▸ HubDBPush this edition. Confirm the dialog. It sends the regions to HubSpot, replacing just this edition's rows.

  7. Make the free summary.

    In the sheet, Menu ▸ HubDBCreate free summary. It creates a free-blog draft (graphic + subscribe button + placeholder). Write the short summary in that free draft.

  8. Check & publish both.

    Open the paid post — region cards render. When it's right, publish the paid edition and the free summary (publishing the free post notifies MIB Free subscribers).

3.4 Golden rules

Edition key must match the post slug tail. B3 = the last part of the post's URL. Mismatch → the post shows no regions.
Don't rename the ① Weekly feed tab, its column headers, or the HubDB table. The sync matches them by name.
Never "Reset / Overwrite" the HubDB table. The push only replaces one edition. A reset would wipe the whole searchable archive.
🏷️
Naming: table label AREA · Purpose; edition key & slug mib-YYYY-MM-DD. Keeps tables findable (HubDB has no folders).

3.5 What to expect

Empty regions vanish. No rows for a region → it doesn't show. To mark one deliberately quiet, add a row headed "No significant activity reported this week." with no URL.
Re-pushing is safe. Push again after edits — it replaces this edition cleanly, no duplicates, never touching other editions.
Read More is a teaser, not the paywall. It only sets how much shows on the archive list. Access is the membership gate.
ℹ️
Some dates won't auto-fill. Paywalled / no-metadata sites come up blank — type those in. Headlines succeed far more often than dates.

3.6 Troubleshooting

SymptomCause & fix
No HubDB menu (in the sheet)Script not installed / sheet not reloaded. Paste script ▸ Save ▸ reload. Still missing → run onOpen once from the editor and Allow.
Test connection 401Token wrong/blank/rotated. Re-copy ▸ Set HubSpot token… again.
Test connection 403Missing scope. Add HubDB (read & write) ▸ save ▸ test again.
Post shows no regionsEdition-key mismatch. Make B3 exactly the post slug tail ▸ push again.
Date looks like Sat Jun 06 2026…Old script. Re-paste the latest mib-hubdb-sync.gs.
Push says "Unknown region"A Region isn't a table option. Use the dropdown; don't free-type.
Part 4

Operations & go-live

4.1 Testing status

Confirmed

  • The paid content is locked — logged-out readers hit the sign-in wall, not the brief.
  • Free blogs public & in search; paid blog isn't leaking to Google or feeds.
  • The production pipeline works end to end — sheet → fill → push → HubDB → renders on the post (idempotent, archive-safe, empty regions collapse).

Still to do before go-live

  • Full access test: a test purchase (Stripe test card) → member granted, emailed, can read.
  • Cancel / lapse test: access removed + "dropped to free" email fires.
  • Fix two automated emails whose links currently 404 before switching them on.
🛡️
The payment & access workflows are built but deliberately switched off until a test purchase is signed off — so no real subscriber is wrongly granted or cut off.

4.2 Go-live (cutover)

A short, ordered, reversible sequence. Nothing affecting live readers switches until this day.

#StepWhy the order
1Confirm the paid blog is locked and has real editionsDon't open the doors before the room is furnished and the lock works
2Fix & repoint every button/email link to its live pageNo subscriber lands on a broken link
3Point "subscribe" at the live checkoutNew sign-ups now flow to real payment
4Switch on the payment & access automationsOnly after the test purchase passes
5Final live check (a real login sees the full edition; a non-member is walled)Proves the loop before announcing
6Retire the old bits (legacy access groups, manual mailout, unused lists)Last, once nothing depends on them

Every step is reversible. The legacy archive is left in place untouched — it isn't part of the new paid product.

4.3 Reference

ThingValue
Paid blogchannel16.dryadglobal.com/en/subscriber
Post slug / edition keymib-YYYY-MM-DD
Access field / members listmib_tier = paid
HubDB tableMIB · Regional MSI feed (id 355219068)
RegionsEurope · Middle East · Africa · Asia & Australia · Americas · Cyber
Sync script / menumib-hubdb-sync.gs
Menu actions✓ Test connection · Fill headlines & dates · Push this edition · Set token
MIB — complete guide · Verihelm / Dryad Global (HubSpot portal 4795492). Model, subscriptions, weekly production, and go-live. Keep the edition key and the tab / column / table names stable; everything else is safe to edit.