Pinterest's bulk upload silently drops duplicate-link rows
A 16-row bulk pin CSV created only 2 pins because Pinterest deduplicates rows by destination link, not by image.
The symptom
I prepared a CSV with 16 rows for Pinterest’s bulk pin creation, 16 distinct images, all valid, uploaded it, and Pinterest scheduled 2 pins. No error, no warning about the other 14 rows. They simply did not exist after the upload.
What was actually happening
Pinterest’s bulk upload deduplicates by destination Link, not by image. My 16 rows had 16 unique images but pointed at only 2 unique destination URLs. Pinterest treated every row sharing a URL as a duplicate of the first one and kept exactly one pin per unique link, which is how 16 rows collapsed to 2.
Here is the shape of the broken file. Note the repeated Link column:
Title,Media URL,Link
Pin 1,https://cdn.example.com/img01.png,https://example.com/l/thing
Pin 2,https://cdn.example.com/img02.png,https://example.com/l/thing
Pin 3,https://cdn.example.com/img03.png,https://example.com/l/thing
Same Link on every row, so Pinterest kept one and dropped the rest.
The fix
Make every row’s Link unique. The clean way is a per-pin UTM query string, which Pinterest reads as a distinct destination:
Title,Media URL,Link
Pin 1,https://cdn.example.com/img01.png,https://example.com/l/thing?utm_source=pinterest&utm_medium=pin&utm_content=pin01
Pin 2,https://cdn.example.com/img02.png,https://example.com/l/thing?utm_source=pinterest&utm_medium=pin&utm_content=pin02
Pin 3,https://cdn.example.com/img03.png,https://example.com/l/thing?utm_source=pinterest&utm_medium=pin&utm_content=pin03
Now every Link is distinct, so all 16 rows survive: 16/16 scheduled. The UTM is not just a dedupe trick, it also lets you attribute clicks per pin in analytics, so you find out which image actually drives traffic.
One more thing to check while you are in there: the Media URL column must be a publicly reachable image URL. If Pinterest cannot fetch it, that row fails too, for a different reason.
The lesson
Pinterest bulk upload deduplicates by destination link, not by image. Give every row a unique Link (a per-pin UTM does it) and your full batch goes through.