Marketing co-op: the reimbursement ledger and approvals

A marketing co-op is a network-funded pool: franchisees pay into it, and the network pays reimbursements back out of it for approved marketing spend. It is one of the eight program types on [Progra…

10 min read·Updated July 14, 2026
On this page

What this page is

A marketing co-op is a network-funded pool: franchisees pay into it, and the network pays reimbursements back out of it for approved marketing spend. It is one of the eight program types on Programs (the network data.type = 'marketing_coop'), but unlike the other seven, it does not use the generic program detail page. It has its own purpose-built ledger surface, because a co-op isn't really about approved parties or franchisee compliance status, it's about money moving in and out of a shared account, and that needs a different shape: a running balance, a queue of requests waiting on a decision, and a record of what already happened.

Three things live on this page:

  1. A hero panel reading the pool's current balance and its all-time totals.
  2. Pending operator reimbursements, an action queue of requests waiting on an HQ decision.
  3. Recent ledger activity, the record of what has already been decided or posted.

Any signed-in HQ user in the group can open this page and read everything on it. Only a group admin can act on a pending request (approve, decline, or mark paid); everyone else sees the same numbers and rows in read-only form.

Where to find it

Open Programs from the HQ sidebar at hq.verinode.ai/programs. Filter to the Co-op tab, or leave it on All, and click any tile labeled Marketing co-op. Clicking it takes you straight to the dedicated ledger page at hq.verinode.ai/programs/coop/[id], you never land on the generic program detail page for this program type.

The page header shows the program's own name (whatever your HQ admin named it when it was created, e.g. "Network Marketing Co-op"), there's no header button on this page, everything you can do here is inside the two rows below.

How the co-op's terms work

Before the numbers on this page mean anything, it helps to know the rules HQ set when the program was configured. A co-op program carries four terms:

  • Network contribution (match %), a percentage from 0 to 100 of every approved dollar of operator spend that the network reimburses. This is what people mean by "50% match" or "network match rate."
  • Reimbursable categories, a whitelist of spend types the co-op will pay against, for example digital ads, print, trade show, sponsorship, direct mail. A program can carry up to 25 categories.
  • Auto-approve threshold, a dollar amount below which a reimbursement request is meant to clear without individual admin review; above it, a request goes to admin review. Setting this to $0 means every request, regardless of size, needs a review.
  • Reimbursement cycle, how often the network settles approved reimbursements: monthly, quarterly, annual, or on demand.

An optional fine-print description can note caps, restrictions, or exclusions.

Note

These four terms are configured once for the program, they aren't something you set from this ledger page itself. This page is where you work the money: the pending queue and the activity record below. If you need the co-op's match rate, category list, or cycle changed, that's a program-setup conversation with your HQ admin, not a control on this screen.

One consequence worth knowing: the auto-approve threshold describes the intended policy, but every reimbursement request an operator submits lands in Pending operator reimbursements below as a request awaiting judgment, regardless of its dollar amount. There is currently no size below which a request clears itself. Every request gets an explicit Approve or Decline from an admin.

The hero panel

At the top of the page, the headline number is the co-op's current pool balance, all approved and paid-in contributions, minus everything actually paid out in reimbursements. Next to it, a status pill reads one of two things:

  • "N pending" (in Hard Hat Yellow) when there is at least one reimbursement request waiting on a decision.
  • "Pool ready" (in Deere Green) when nothing is pending and the pool has a positive balance.

Under the headline, one of two lines of context appears:

  • Before any activity exists, the empty-state copy: "Marketing co-op tracks franchisee contributions into the network pool and reimbursement claims back out. Contributions land via cron when revenue posts; operators submit reimbursement requests from IQ; HQ approves them here."
  • Once there is any contribution or any pending request, a stats line instead: "$X contributed · $Y approved · $Z paid.", the network's total contributions collected, total reimbursements approved (whether or not they've been paid out yet), and total reimbursements actually disbursed.

Three secondary figures sit beside the headline:

  • Pending approval, the count of reimbursement requests currently awaiting a decision, with the combined dollar amount underneath ("$X awaiting judgment"). This turns from neutral to Hard Hat Yellow whenever it's above zero.
  • Approved (not paid), the dollar gap between what's been approved and what's actually been paid out, dollars that are cleared to pay but haven't been disbursed yet.
  • Paid all-time, the running total of reimbursements the network has actually disbursed.

Tip

The pool balance headline is calculated only from contributions minus paid reimbursements. Money that's been approved but not yet paid still counts as sitting in the pool. If you're trying to gauge how much is really left to commit, subtract the "Approved (not paid)" figure from the headline balance, that money is already spoken for.

Pending operator reimbursements

This is the action queue: reimbursement requests an operator submitted from their own IQ, waiting on HQ's decision. Each one appears as a tile showing:

  • Reimbursement · $X · [franchisee name], the headline.
  • The reason the operator gave, truncated to 80 characters, or "No reason provided" if they left it blank.
  • Submitted N days ago (or "today," or "1 day ago").

Click any tile to open the entry, described below.

Empty state. When there is nothing waiting: "No reimbursement requests waiting on approval. Operator submissions land here as accrued entries with status pending judgment."

Recent ledger activity

Below the pending queue, this row is the record: entries that have already moved past the pending stage, both contributions and decided reimbursements, most recent first (up to 30 shown, drawn from the program's most recent 100 ledger rows overall). Each tile shows:

  • A label naming the kind and its status, exactly as stored: "Contribution · approved", "Contribution · paid", "Reimbursement · approved", "Reimbursement · paid", or "Reimbursement · disputed" (disputed is what a decline sets, see below).
  • A signed dollar amount: +$X for a contribution (money coming into the pool) or −$X for a reimbursement (money going out).
  • The franchisee's name.
  • A date line: "Paid N days ago" if it's been paid, otherwise "Approved N days ago" if it's been approved but not paid, otherwise "Recorded N days ago".

Each status carries its own accent color: accrued entries read Hard Hat Yellow, approved and paid entries read Deere Green, disputed entries read Ember Red, and reversed entries read a neutral border tone.

Click any tile to open the same entry detail described below.

Empty state. When nothing has posted yet: "No ledger activity yet. Contributions appear as monthly debit rows once the cron starts posting; approved reimbursements surface here after HQ approval."

Note

Contribution rows are always read-only on this page, for every user, admin included. They're meant to post automatically (the cron job that posts them on a monthly cadence as revenue comes in hasn't started running yet, which is why you may see none at all even on an active co-op). Only reimbursement rows carry the Approve, Decline, or Mark paid actions described next.

Opening an entry: the ledger entry modal

Clicking any tile, pending or recent, opens the same detail modal. The title bar reads "Reimbursement · $X.XX" or "Contribution · $X.XX" (shown to the cent here, unlike the whole-dollar figures on the tiles).

Inside, you'll see:

  • A line reading "[Franchisee name] · status [status]", for example "Franchisee #A1B2 · status accrued."
  • The reason text the operator gave, if any.
  • A details list with whichever of these fields the entry actually has: Recorded (the date it was created), Approved (if it's been approved), Paid (if it's been paid), Period (a date range, if the request was tied to a specific spend period), and Invoice ref (a reference number, if one was attached).

Reimbursement franchisee name and the privacy boundary

The franchisee name you see (a real location name, or an anonymized label like "Franchisee #A1B2") comes from the same office directory HQ already has for compliance purposes, a co-op contribution is a mandatory network fee, not a private business record, so seeing who's contributing and who's requesting reimbursement is within HQ's normal visibility. Whether you see a real name or an anonymized one depends on how your network is configured: networks running in the default, more cautious mode show a stable anonymized label per franchisee; networks explicitly configured as a single legal entity across locations show the real location name. Either way, HQ never sees the private business detail behind the request, only the ledger fact: who, how much, what category, what status.

Acting on a pending reimbursement (admins only)

If you're a group admin and the entry is a reimbursement still in accrued status, you'll see an optional "Decline reason (if declining)" field (placeholder: "Optional") above the footer buttons:

  • Approve moves the entry to approved and records who approved it and when.
  • Decline moves the entry to disputed and records whatever reason you typed (or none, if you left it blank).

If the entry is a reimbursement already in approved status, you'll instead see an "Invoice / payment reference" field (placeholder: "e.g. ACH-2026-09-1287") and a single Mark paid button, which moves the entry to paid, records the pay date, and attaches the reference you typed if you gave one.

Close is always available and simply dismisses the modal without changing anything.

Non-admins, and anyone looking at a contribution row or an already-decided reimbursement (paid, disputed, or reversed), see the same detail view with no action buttons at all, Close is the only option.

  1. 1Open Programs from the sidebar and click into your Marketing co-op program.
  2. 2Work the Pending operator reimbursements row first, top to bottom, it's a queue and there's no other sort.
  3. 3Click a tile to open it. Read the reason, the amount, and who submitted it.
  4. 4If it looks right, click Approve. If it doesn't (wrong category, no supporting reason, out of policy), type a short decline reason and click Decline.
  5. 5Once an entry shows approved in Recent ledger activity, open it again when you're ready to pay it, attach your payment or invoice reference, and click Mark paid.

If an action fails

The action buttons call the server directly and report back inline, in red, inside the modal. You may see:

  • "Only group admins can approve co-op ledger entries.", you're signed in without the admin role.
  • "Only reimbursement entries can be approved here." / "...can be marked paid." / "...can be declined.", you're trying to act on a contribution row, which never accepts these actions.
  • "Cannot approve an entry in status [status]." / "Cannot mark paid an entry in status [status]." / "Cannot decline an entry in status [status].", someone else already moved this entry (for example, a second admin approved it while you had the modal open), so the requested transition no longer applies.
  • "Not authorized.", the entry's program doesn't belong to your group, this shouldn't happen through normal navigation.

None of these leave the ledger in a bad state, they just mean the action didn't go through, close the modal and re-open the entry to see its current status.

The status lifecycle

Every ledger entry, contribution or reimbursement, moves through the same five possible states:

accruedapprovedpaid, the normal path: recorded, then cleared, then disbursed.

accrueddisputed, an HQ admin declined the request. Despite the label "Decline" on the button, the stored (and displayed) status is "disputed," not "declined."

reversed, a rollback of an entry after the fact. There's no button on this page that produces a reversed entry, if you see one, it was corrected by other means.

Data sources

Data sources

  1. 1.Your operator's reimbursement request, submitted from IQ. Your business.
  2. 2.HQ's approve, decline, and mark-paid decisions on this page. Your business.
  3. 3.The office directory used to resolve franchisee names. Your business.
Was this helpful?