Reputation Scores
How Magma scores sellers and buyers from 0 to 100, what moves the score, who can see it, and how to improve it.
Every node on Magma has two reputation scores, one as a seller and one as a buyer. Each runs from 0 to 100 and is built only from that node's Magma orders over the last 90 days, with recent orders counting most.
Automatic matching favours sellers with higher scores and passes over sellers whose score is too low, so a seller's score directly affects how many orders they get.
We changed how scores work in November 2026. The old score mixed in network-wide signals such as node centrality and could drop to zero after a single bad order. The new score is based only on how you trade on Magma, recovers as you complete orders, and comes with a breakdown so you can see why it is what it is.
What goes into the score
Both scores have two parts:
- Completion: the share of your orders that went through. This matters most.
- Quality: how well the completed orders went. Quality can lower the score, but never by more than a quarter.
Seller score
| Part | What counts |
|---|---|
| Completion | Orders you completed, against orders you rejected, let time out, failed to open, or opened incorrectly. |
| Response time | How quickly you accept or reject new orders. |
| Open time | How quickly you open the channel after the buyer pays. |
| Kept open | Whether channels stay open for the full lease you promised. |
| Fee promise | Whether you keep your channel fees within the cap in your offer. |
Buyer score
| Part | What counts |
|---|---|
| Completion | Orders you paid, against orders you let expire, cancelled, or that sellers could not open because your node was unreachable. |
| Payment time | How quickly you pay once the seller accepts. |
| Kept open | Whether you leave the channel open for the full lease. |
How the score behaves
- New nodes start in the middle. A node with no orders is neither perfect nor zero, and its first few orders move the score gradually rather than all at once.
- Recent orders count most. An order's weight drops steadily as it ages, so a bad stretch fades within weeks rather than months.
- One bad order is not the end. A failure lowers the score in proportion to how many orders you have; it no longer wipes it out.
- One buyer counts once. However many orders a single buyer places with you, at most one failed order from that buyer counts against you. A buyer placing order after order cannot drag your score down.
- Rejections need a buyer others could serve. A rejection only counts against you once the buyer has completed an order with another seller. Orders you let time out, or fail to open after the buyer paid, always count.
- Missing data is not held against you. If there is nothing to judge a quality part on yet, it is left out rather than scored as zero.
When the buyer's node is the problem
Sometimes a seller cannot complete an order because the buyer's node cannot be reached, or will not accept the channel size. Sellers can say so when they reject an order by passing a cancellation_reason:
cancellation_reason | Use when |
|---|---|
UNABLE_TO_CONNECT_TO_NODE | You could not connect to the buyer's node. |
SELLER_UNAVAILABLE | You can no longer serve orders, for example because your node is going offline. |
A reason that puts the failure on the buyer is only accepted once another seller has reported the same buyer. When it is accepted, the order counts against the buyer instead of you and shows up in your breakdown under excluded. Without that confirmation the order counts as an ordinary rejection, so the reason cannot be used to shield a seller's score from orders they simply chose not to fill. SELLER_UNAVAILABLE always counts as a rejection; it tells the buyer why.
Either way, repeated orders from the same buyer only count once, and rejecting a buyer that no other seller has completed an order with does not count at all. If an unreachable buyer keeps ordering from you, reject each order with UNABLE_TO_CONNECT_TO_NODE rather than letting it time out.
See Sell Liquidity for the reject mutation.
Who sees what
| Where | What is shown | Visible to |
|---|---|---|
MarketOffer.seller_score | The seller's score, as a number. | Everyone |
MarketOrder.seller_reputation | The seller's full breakdown. | The order's buyer |
MarketOrder.buyer_reputation | The buyer's full breakdown. | The order's seller |
AccountNode.reputation | Your own seller and buyer breakdowns. | You |
Read your own breakdown from your account's nodes:
query MyReputation {
user {
nodes {
pubkey
reputation {
seller {
score
completion
quality
sample_size
counts { completed rejected no_response failed_to_open invalid_opening excluded }
components { key value score sample }
}
buyer {
score
counts { paid failed_to_pay unreachable }
components { key value score sample }
}
}
}
}
}Each entry in components has a key (for example responseTime), the measured value (a rate from 0 to 1, or a median in seconds), its score from 0 to 1, and the number of orders it is based on.
Improving your score
As a seller:
- Accept or reject new orders quickly. Automating this through the API helps most.
- Only list offers you can fill. Disable an offer or lower its size when your on-chain funds run low instead of rejecting the orders it attracts.
- Open the channel promptly after payment, and keep it open for the full lease.
- Keep your fees within the cap you advertised.
- When a buyer's node is unreachable, reject with
UNABLE_TO_CONNECT_TO_NODErather than letting the order time out.
As a buyer:
- Make sure your node is online and reachable before you buy, and accepts channels of the size you order.
- Pay promptly once the seller accepts.
- Keep the channel open for the full lease.
Next steps
- Sell Liquidity - accept, reject, and open channels.
- Order Lifecycle - every order status and what it means.
- FAQ - common questions.