learn-ship-ecommerce-enabler-with-phoebe / Analyst session 6 of 8
Ship It: Social Commerce Enablers · Analyst session 6 of 8

Content to creator yield

Serai's studio makes thousands of assets a quarter and its creator network places them in listings, live streams and creators' own links. The platforms report, at best, a total per creator, credited before anyone has cancelled or sent anything back. Tonight you follow the second dependency chain from session 1 end to end: stamp every asset with an id that survives the trip, join the order back to it, count only what settled, and then rank six creators three ways and watch the list turn upside down. Every creator figure on this page is constructed.

🟠 Advanced Analysts Python, pandas 45 min
0-3 · Welcome 3-19 · Tag, settle, divide 19-41 · Build-along: six creators, three ways 41-45 · Q&A
Part 0

Where tonight sits on the track

Sessions 4 and 5 were the live channel: an event spec per minute, then the stage metrics as code. Tonight moves to the content half of the estate. Session 1 drew two chains that carry most of the value, and this is the second one: content archive, then tagged archive, then creator and content yield. The archive is owned; the yield is what brands ask about every quarter review; the tag in the middle is the link nobody budgets for. The data is six creators and one quarter, constructed, so your numbers will differ. The arithmetic and the traps will not.

🎫 Clear all three quiz questions to stamp your passport Live = presented in the 45 minutes Self-study = the full depth, after class ★ Build-along = run the code yourself

★ What you walk out with tonight. A creator table in pandas that separates attributed from settled GMV, three rankings that answer three different questions, a commission check that shows what paying on attributed costs, and a working sketch of the asset-tag join that lets an enabler measure content the platforms never report back.

Part 1 · covers the content to tagged archive to yield chain

The chain: content, tag, order

6 min live

An asset is only measurable if something on the order points back at it. The platforms credit a creator with a total, and the listing with a total, but not "this 30-second clip, placed in this stream, sold these units". So the enabler builds that link itself: a persistent asset id stamped at export, carried into every placement, and read back off the order.

ONE ASSET, ONE ID, THREE PLACEMENTS, ONE WAY BACK the id has to survive the trip, or the order points at nothing ASSET A-101 video for SKU SK-7 id stamped at export Listing listing id mapped to A-101 Live stream run sheet logs A-101 Creator's link link sub-id = A-101 Orders each keeps asset_id plus status: settled or not join on asset_id tagged archive: settled GMV per asset No tag, no join: the platform can tell you what a creator sold, never which asset sold it.
🔍 Click to zoom - the teal box is the only thing Serai fully owns, which is why the id has to start there
LiveWhat the tag is, and where it has to ride4 min▶

The tag is one id per asset, minted in Serai's archive when the asset is exported, never re-minted when it is re-cut or re-posted. A re-cut is a new asset with a parent id; a re-post is the same asset in a new placement. Get that distinction wrong and one clip shows up as five, each with a fifth of the credit.

Then the id has to ride on something the order will carry back. Each placement offers a different carrier:

PlacementWhere the id ridesWhat the order gives backGrain you can reach
ListingSerai's catalogue maps the listing's content version to the asset idListing id and order timeAsset per listing version; mixed if two assets run at once
Live streamThe run sheet logs which asset was on screen, per minuteStream id and minute, from session 4's minute tableAsset per stream minute
Creator's linkA sub-id on the affiliate link, set to the asset idThe sub-id on the attributed orderAsset per creator, cleanly

The link is the cleanest carrier and the stream the most work, which is exactly why session 4 put one clock on the minute table. The platforms do not hand back content-level performance in a form you can pipe into a warehouse; the tag is how an enabler builds its own.

Self-studyWhy the archive is owned and the yield is only partial3 min▶

On the obtainability scale from session 1, the content archive is owned: Serai made every file and knows who, when and for which SKU. Creator results are partial: the affiliate report returns what the platform credited to each creator, in the platform's window, and nothing about which asset did the work. The tag does not make the platform's data any fuller. It makes Serai's side rich enough that a thin order row (an id, a sub-id, a minute) is enough to join on.

This is also why the tag has to exist before anyone asks for yield. An order placed last quarter against an untagged asset cannot be credited retroactively; there is nothing on the order to join. Every quarter without the tag is a quarter of yield you will never be able to report.

Real world

Constructed: the brand that asked "which video". A skincare brand on Serai's books (constructed) asked at its quarter review which of the 40 assets made that quarter it should re-shoot. The affiliate report said creator C4 sold well; it could not say with what. Serai's answer was a promise to tag from next quarter. The same review a quarter later had an answer per asset, because the link sub-ids had been set at export. Nothing about the platform changed; the join did.

Part 2 · covers attributed versus settled GMV

Attributed is not settled

6 min live

Attributed GMV is the value of orders the platform credited to a creator. Settled GMV is what is left after cancellations and returns, the money that actually reached the brand. The gap is not constant across creators, so the ranking changes, and if commission is paid on the attributed number, so does the bill.

ATTRIBUTED VERSUS SETTLED, ONE QUARTER, CONSTRUCTED attributed (commission is paid on this) settled 42.0k 29.4k 31.0k 19.8k 25.0k 21.3k 18.5k 16.7k 12.4k 11.2k 9.8k 9.2k C1 C5 C3 C2 C6 C4 1st, stays 1st 2nd, drops to 3rd 3rd, rises to 2nd 4th, stays 5th, stays 6th, stays C5 loses 36 percent of its attributed GMV to cancellations and returns; on settled, C3 passes it.
🔍 Click to zoom - the teal bar is the one the commission ignores: C5 is paid on 31.0k and delivered 19.8k
LiveThe six creators, and the two rankings4 min▶

One quarter, commission 8 percent of attributed GMV. All constructed.

CreatorFollowersAttributed GMVSettled GMVNot settled
C12,100,000$42,000$29,40030%
C2180,000$18,500$16,65010%
C3650,000$25,000$21,25015%
C445,000$9,800$9,2126%
C51,400,000$31,000$19,84036%
C690,000$12,400$11,16010%

Ranked by attributed: C1, C5, C3, C2, C6, C4. Ranked by settled: C1, C3, C5, C2, C6, C4. Only one pair swaps, and it is the pair that matters: C5, the second-biggest name on the books, is the one whose buyers send the most back. On attributed, C5 is paid 8 percent of $31,000, which is $2,480. On settled it would be $1,587.20.

For the equation GMV itself is built from, link out to the GMV equation in the ecommerce metrics course. The enabler twist is that there are two parties' GMV on one order, the platform's credit and the brand's settlement, and they are not the same number.

Self-studyWhat a high not-settled share usually means, and what it does not3 min▶

A creator whose attributed orders settle at 64 percent, like C5, is worth a conversation, not a verdict. The usual readings: the audience buys on impulse and returns; the creator's claims about the product did not match the product; an attribution window credits the creator with orders they barely touched, which buyers cancel. The data on this table cannot tell those apart. The order-level return reasons, where the platform gives them, sometimes can.

Two things the map does not record, so check them for your own programmes before you call anything overpaid: whether a platform claws back commission on a returned order, and how long after the order a return can still land. Both decide when "settled" is final, and a settled figure read too early is just a smaller attributed figure.

Serai's own network keeps a share of the commissions it brokers, so a commission paid on attributed flatters Serai's line too. Say that out loud when you propose moving to settled; the room will already be thinking it.

Real world

A listed marketplace counts orders before they settle, and says so. Sea Limited's annual report on Form 20-F for fiscal 2019 defines Shopee's GMV as including shipping and other charges, and counts an order "regardless of whether the transaction is settled or if the item is returned". That is a legitimate headline definition for a marketplace, written down where a reader can find it. The lesson for an enabler is not that either number is wrong. It is that the platform's number and the brand's number are defined differently on purpose, and a creator ranking must say which one it used. (Sea Limited, Annual Report on Form 20-F for the fiscal year 2019, "Conventions" definitions.)

Part 3 · covers yield denominators

Yield per what

4 min live

"Yield" is a ratio, and the denominator is the question. Divide settled GMV by followers and the list inverts: the smallest creator comes first and the biggest comes last. Neither list is wrong. They answer different questions, and the analyst's job is to say which question each one answers before anyone rebooks anybody.

SAME SIX CREATORS, TWO DENOMINATORS, CONSTRUCTED rank by settled GMV rank by settled per 1,000 followers 1 · C1 $29,400 2 · C3 $21,250 3 · C5 $19,840 4 · C2 $16,650 5 · C6 $11,160 6 · C4 $9,212 C4 $204.7 C6 $124.0 C2 $92.5 C3 $32.7 C5 $14.2 C1 $14.0 reaches most converts most per follower Same six creators, same settled GMV. The denominator decides who is first, so name it next to every rank.
🔍 Click to zoom - 45,000 followers settled more per head than 2,100,000 did, and both facts are true at once
LiveFour denominators, four questions3 min▶
YieldQuestion it answersWho wins here (constructed)The trap
Settled GMVWho moves the most money, and who reaches most?C1Rewards audience size; says nothing about fit
Settled per 1,000 followersWhose audience buys? Who to rebook, or book more of?C4, at $204.7Small bases are noisy; one quarter is one draw
Settled per assetWhich content to remake, and which to retire?Needs the tagAn asset placed ten times gets ten times the chances
Settled per placementWhere to put the next asset: listing, stream or link?Needs the tagPlacements differ in traffic; compare within a SKU

The first two need only the affiliate report plus a settlement feed. The last two need the tag from Part 1, which is the whole argument for building it. The build-along computes both on a tiny constructed archive.

Self-studyWhat per-follower yield cannot tell you3 min▶

C4 settled $204.7 per 1,000 followers in one constructed quarter. Whether that holds if Serai books C4 three times as often is not in the data. A small, loyal audience can tire of being sold to, and nothing on this table measures that. Treat the per-follower ranking as the shortlist for a test, not as the answer: book C4 more for one quarter and watch whether settled per 1,000 followers holds.

Which content traits actually sell (the hook, the length, the host, the first minute) is a modelling question, and it has its own home: the live commerce analytics course builds those models. The tag you build tonight is what makes its methods possible on an enabler's own archive.

Real world

Constructed: the rebooking meeting that ran two lists. Serai's creator team (constructed) came to a planning meeting with one list, ranked by attributed GMV, and proposed renewing C5 at a higher rate. The analyst brought two more: settled, where C5 slipped to third, and settled per 1,000 followers, where C5 was fifth and C4 first. The meeting kept C1 for reach, moved C5 to a settled-GMV trial, and booked C4 for a test quarter. Three lists, three decisions, and nobody argued about which list was "right", because each one said its denominator in the header.

Build-along

Rank six creators three ways

★ 22 min · everyone builds

Six rows of constructed creator data, then a tiny constructed archive of four assets and eight orders. Build the creator table, compute settled and the not-settled share, rank three ways, price the commission both ways, then sketch the asset-tag join. Every output below is what the code printed on pandas 2.1, run top to bottom as one script; the data is constructed, so on your own estate your numbers will differ.

TWO GRAINS, ONE SCRIPT steps 1 to 3: creator grain, what the platform reports Creator table 6 rows, constructed Settled, not-settled % attributed minus returns Three rankings by attributed, settled, 1k Commission check 8% paid on attributed steps 4 and 5: asset grain, what the tag lets Serai build assets asset_id, creator, sku orders asset_id rode in merge on asset_id validate many_to_one settled per asset and per placement untagged: 1 of 8 orders The top row reads totals a platform reports. The bottom row builds the grain it does not report.
🔍 Click to zoom - validate="many_to_one" is the line that stops a duplicated asset id from doubling GMV silently

Build the six-row creator table, and compute settled from what did not settle. Keep the cancelled and returned value as its own column: settled is a subtraction you can audit, not a number someone typed. The figures are the constructed creator table, one quarter.

★ Step 1 · six creators, constructedimport pandas as pd cols = ["creator", "followers", "attributed", "cancelled_returned"] rows = [ # one quarter, constructed ("C1", 2_100_000, 42_000, 12_600), ("C2", 180_000, 18_500, 1_850), ("C3", 650_000, 25_000, 3_750), ("C4", 45_000, 9_800, 588), ("C5", 1_400_000, 31_000, 11_160), ("C6", 90_000, 12_400, 1_240), ] cr = pd.DataFrame(rows, columns=cols) cr["settled"] = cr["attributed"] - cr["cancelled_returned"] cr["not_settled_pct"] = (cr["cancelled_returned"] / cr["attributed"] * 100).round(1) print(cr[["creator", "attributed", "settled", "not_settled_pct"]].to_string(index=False)) print("total", cr["attributed"].sum(), cr["settled"].sum()) # creator attributed settled not_settled_pct # C1 42000 29400 30.0 # C2 18500 16650 10.0 # C3 25000 21250 15.0 # C4 9800 9212 6.0 # C5 31000 19840 36.0 # C6 12400 11160 10.0 # total 138700 107512

Rank three ways from one function. One helper sorts by any column, so the three lists cannot drift apart in how they break ties or which way they sort. Print the per-follower table too: the ranking is the headline, the values are the evidence.

★ Step 2 · three rankingscr["per_1k"] = (cr["settled"] / (cr["followers"] / 1_000)).round(1) def rank(col): return " ".join(cr.sort_values(col, ascending=False)["creator"]) print("by attributed: ", rank("attributed")) print("by settled: ", rank("settled")) print("by settled per 1k: ", rank("per_1k")) print(cr.sort_values("per_1k", ascending=False) [["creator", "followers", "settled", "per_1k"]].to_string(index=False)) # by attributed: C1 C5 C3 C2 C6 C4 # by settled: C1 C3 C5 C2 C6 C4 # by settled per 1k: C4 C6 C2 C3 C5 C1 # creator followers settled per_1k # C4 45000 9212 204.7 # C6 90000 11160 124.0 # C2 180000 16650 92.5 # C3 650000 21250 32.7 # C5 1400000 19840 14.2 # C1 2100000 29400 14.0

Price the commission both ways. The constructed contract pays 8 percent of attributed GMV. Put the settled alternative next to it, per creator, and print the difference. It is the number that starts the renegotiation, so it has to be one anyone can re-run.

★ Step 3 · commission on attributed versus settledRATE = 0.08 # paid on ATTRIBUTED GMV cr["paid"] = cr["attributed"] * RATE cr["if_settled"] = cr["settled"] * RATE cr["overpaid"] = cr["paid"] - cr["if_settled"] print(cr[["creator", "paid", "if_settled", "overpaid"]].round(2).to_string(index=False)) print("total overpaid:", round(cr["overpaid"].sum(), 2)) # creator paid if_settled overpaid # C1 3360.0 2352.00 1008.00 # C2 1480.0 1332.00 148.00 # C3 2000.0 1700.00 300.00 # C4 784.0 736.96 47.04 # C5 2480.0 1587.20 892.80 # C6 992.0 892.80 99.20 # total overpaid: 2495.04

Sketch the tagged archive and join the orders back. A constructed archive of four assets and eight orders. Each order carries the asset id that rode in on its placement, and one does not. The validate="many_to_one" argument makes pandas fail loudly if an asset id appears twice in the archive, instead of quietly doubling every order that joins to it.

★ Step 4 · the asset-tag joinassets = pd.DataFrame({ # the tagged archive, constructed "asset_id": ["A-101", "A-102", "A-103", "A-104"], "creator": ["C4", "C4", "C5", "C5"], "sku": ["SK-7", "SK-7", "SK-2", "SK-2"], }) orders = pd.DataFrame({ # asset_id rode in on the placement "order_id": ["o1", "o2", "o3", "o4", "o5", "o6", "o7", "o8"], "asset_id": ["A-101", "A-101", "A-102", "A-103", "A-103", "A-103", "A-104", None], "placement": ["listing", "stream", "link", "link", "link", "stream", "listing", "listing"], "gmv": [40, 40, 25, 60, 60, 60, 30, 55], "status": ["settled", "settled", "settled", "returned", "settled", "cancelled", "settled", "settled"], }) orders["settled_gmv"] = orders["gmv"].where(orders["status"] == "settled", 0) joined = orders.merge(assets, on="asset_id", how="left", validate="many_to_one") print("untagged orders:", joined["creator"].isna().sum(), "of", len(joined)) # untagged orders: 1 of 8

Read yield per asset and per placement, and report the untagged share with it. A-103 was credited 180 and settled 60: the per-asset view finds the same problem the creator view found for C5, one level down, where it can be fixed by changing the content. The untagged order stays out of the asset view and in the report as a coverage line.

★ Step 5 · settled per asset, per placement, per creatortagged = joined.dropna(subset=["creator"]) per_asset = (tagged.groupby(["asset_id", "creator", "sku"], as_index=False) [["gmv", "settled_gmv"]].sum()) print(per_asset.to_string(index=False)) print(tagged.groupby("placement")["settled_gmv"].sum().to_dict()) print(tagged.groupby("creator")["settled_gmv"].sum().to_dict()) # asset_id creator sku gmv settled_gmv # A-101 C4 SK-7 80 80 # A-102 C4 SK-7 25 25 # A-103 C5 SK-2 180 60 # A-104 C5 SK-2 30 30 # {'link': 85, 'listing': 70, 'stream': 40} # {'C4': 105, 'C5': 90}

Report the tag coverage on every yield table. "Settled per asset, 7 of 8 orders tagged" is a number a brand can trust; the same table without the coverage line quietly assumes the untagged orders look like the tagged ones. Session 7 puts both the yield definition and its coverage rule into the metric registry.

Homework

Before session 7

30 min
  1. Pull one quarter of your own creator or affiliate report and add a settled column from your settlement feed. Rank both ways and write down every creator who moves by more than one place.
  2. Find out, for each programme you run, whether commission is paid on attributed or settled GMV and when a return stops counting. Write both on one line per programme, with the date you checked.
  3. Pick 20 assets from last month and trace each one: does any order carry something that points back to it? Count how many you could join today, and name the carrier for each placement.
  4. Write the header for each of the four yield tables (settled, per 1,000 followers, per asset, per placement) as one sentence: the question it answers and the decision it feeds.
Check yourself

Three questions

Clear all three and Analyst session 6 gets stamped in your passport.

1 · Why does an enabler need its own asset id on every piece of content?

The archive is owned and the creator results are partial. The tag makes Serai's side rich enough that a thin order row joins to the asset that sold it, and an order placed against an untagged asset can never be credited later.

2 · C5 is second on attributed GMV and third on settled. What explains the move?

$31,000 attributed became $19,840 settled; C3's $25,000 became $21,250. Same rate for everyone, different return behaviour. On attributed, C5 is paid $2,480; on settled it would be $1,587.20.

3 · On settled GMV per 1,000 followers, C4 is first and C1 last. What should the planning meeting do with that list?

Each denominator answers its own question. Settled GMV says who reaches most; per 1,000 followers says whose audience converts. One constructed quarter is one draw, so the per-follower list earns a test, not a verdict.

Sources covered

What this session teaches, and where it came from

✓The tag chain: content to tagged archive to yieldThe track's own chain, drawn in analyst session 1; the carriers per placement and the skincare brand story are constructed
✓Attributed versus settled GMVPractice, on a constructed six-creator table; the platform-side definition anchored on Sea Limited, Annual Report on Form 20-F for the fiscal year 2019, "Conventions" definitions
✓Yield denominatorsPractice: settled, per 1,000 followers, per asset, per placement; every figure constructed and re-run in pandas
◐Which content traits sellModelled in the live commerce analytics course, linked rather than re-taught

Every fact on this page, and its verification tier, is recorded in the course's source map.

Analyst session 6 cheat sheet · pin this

Tag at exportOne persistent id per asset, minted once; a re-cut is a new asset with a parent id.
Ride a carrierListing version map, stream run sheet per minute, link sub-id. No carrier, no join.
Settled, not attributedAttributed is the platform's credit; settled is what reached the brand. Rank on settled.
Price the commissionPaid on attributed, C5 costs $2,480; on settled, $1,587.20. Print both.
Name the denominatorSettled for reach, per 1,000 followers for fit, per asset for content, per placement for where.
Report coverageEvery yield table says how many orders were tagged. validate="many_to_one" on the join.