Composed Campaigns
Stack campaigns on top of one another and combine their results — add, multiply, divide, or take the minimum — to express almost any reward logic. A powerful building block, always set up with the Merkl team.
Sometimes a single campaign type isn't enough to express what you want to reward. Composed campaigns let Merkl stack several campaigns on top of one another and combine their results with a formula — so you can express almost any reward logic.
Under the hood, this is the MULTILOG_DUTCH campaign type. It takes a set of sub-campaigns and a compute formula describing how to combine them: you can add, multiply, divide, take the minimum or maximum, apply per-campaign multipliers, and layer on more complex conditional rules. If you can describe the logic, it can almost always be composed.
Never create a composed campaign on your own. MULTILOG_DUTCH is a low-level building block with many degrees of freedom, and a misconfigured formula can distribute rewards incorrectly. Always open a BD ticket on Discord first — we'll configure it for you, or expose a simpler, purpose-built campaign type for your use case.
What you can express
Each sub-campaign produces a number, so you can combine them with arithmetic and functions. A few examples:
- Minimum of two campaigns — reward the smaller of two measured quantities (e.g. cap one position by another).
- Net positions — subtract one campaign from another (e.g.
borrow − supplyfor net borrowing). - Weighted blends — multiply each sub-campaign by a coefficient and sum them.
- Ratios and caps — divide one quantity by another, or cap a reward at a share of a reference value.
Example — Ethena on Plasma. This lend opportunity rewards the minimum of the results of two campaigns, so users only earn where both conditions hold at once.
A building block, not a starting point
MULTILOG_DUTCH is best understood as a master campaign type — a flexible engine that friendlier campaign types are built on. Many of Merkl's campaign types are in fact wrappers around a composed campaign, pre-wired for a specific scenario so creators never touch the raw formula. For example:
- Rewarding several vaults at once under a single campaign.
- Rewarding all the USDC supplied across every Morpho market in one go.
Each wrapper fixes most of the degrees of freedom and exposes only the inputs that make sense for its use case — which is exactly why you should reach for a wrapper (or ask us to build one) rather than a raw composed campaign.
Setting one up
Composed campaigns are not created through the standard Merkl Studio flow. If you have reward logic the existing campaign types can't express, open a BD ticket on Discord — there's very little we can't compose.
For the technical schema (the composedCampaigns list and the composedCampaignsCompute formula), see the schema explorer in the developer docs.