Home > Knowledge > Why Your Nipples Hurt After a Long Ride (And How to Stop It)

Why Your Nipples Hurt After a Long Ride (And How to Stop It)

Published:
BikePush is supported by our readers, we may receive a commission, at no extra cost to you - read more here
As an Amazon Associate, I earn from qualifying purchases.
Receive cycling tips and updates straight to your inbox, completely free!
Subscribe here.

You made it home after the big one. Sixty miles, good legs, good company. Then you step into the shower and yelp.

Hot water finds two raw, burning spots you did not earn with effort. Nobody warned you at the cafe stop. Nobody puts this on Strava.

Finish this article. The text is done: fact-checked, intro restructured, converted to article-wp.html, all link anchors bolded. Two stages remain, in this order.

Work through them both. Ask me to approve social candidates before you place them, and ask me to approve the image plan before you generate. Do not ask permission for anything else.

#####################################################################
# STAGE A — SOCIAL EMBEDS
#####################################################################

Put other people's YouTube videos, Instagram posts and X posts INSIDE the article body, to break up walls of text with something that keeps the reader on the page.

Proven on two BikePush articles. The first cost 89 cents through bad actor choices. The second cost 8 cents. Follow this and it stays under 10 cents.

--- A1. Read the article and decide what each section needs ---

Read article.md. For every section decide: video, still image, or nothing.

THERE IS NO QUOTA. No 50/50 split, no minimum. Some articles take one embed, some three, some sections take nothing — and nothing is the right answer more often than not.

- VIDEO when there is something to DEMONSTRATE, or someone to be convinced by.
- STILL IMAGE when the section is dense but has nothing to demonstrate — a wall of statistics, an abstract argument. Those get handled in Stage B, not here.
- NOTHING when the section already moves, is short, or is the closing section.

Weight toward the first half of the article. Roughly one break per 400-600 words is comfortable.

--- A2. Pick keywords from the article, not from your own description ---

Use phrases people actually title and caption posts with.

WORKS: "goblet squat form", "pre ride bike check", "romanian deadlift technique"
RETURNS ZERO: "dusty old bike restore", "deadlift cyclist", "returning to cycling after years off"

Multi-word intent does not survive Instagram search — it latches onto the head term. Single concepts work.

"Bike" means MOTORCYCLE on both Instagram and YouTube. Expect motorcycle noise in maintenance searches.

--- A3. Run the searches. Exact actors, batched, one run per platform ---

Batch every keyword into ONE run per platform. Start fees dominate small runs.

YOUTUBE — streamers/youtube-scraper (official, 4.8 stars). $0.003/video, no start fee.
{
  "searchQueries": ["keyword one", "keyword two", "keyword three"],
  "maxResults": 4,
  "maxResultsShorts": 0,
  "maxResultStreams": 0,
  "sortingOrder": "relevance",
  "videoType": "video",
  "lengthFilter": "between420"
}
GOTCHA: lengthFilter is "under4", "between420" or "plus20". NOT "between4and20".

INSTAGRAM — scrapesmith/instagram-search-scraper-api. $0.0014/result + $0.005 start.
{
  "keywords": ["keyword one", "keyword two"],
  "maxResultsPerKeyword": 10
}

X — scraper_one/x-posts-search. $0.00025/result + $0.0025 start.
{
  "query": "your search phrase",
  "searchType": "top",
  "resultsCount": 30
}
GOTCHA: searchType must be lowercase "top" or "latest". NOT "Top".

DO NOT USE:
- crawlerbros/instagram-keyword-search-scraper — $0.05 start fee, 3x the price
- apify/instagram-scraper — cannot do topic search, only hashtag/profile/place/user
- bovi/reddit-scraper — searchQuery is broken, returns zero for any value
- Reddit generally — text-only card, no motion, weak for dwell time

Tell me what the run cost.

--- A3b. WARNINGS SPECIFIC TO THIS ARTICLE. READ BEFORE SEARCHING ---

THIS IS A WEIGHT ARTICLE. That category is full of content this article actively argues against, and embedding any of it would contradict the piece on its own page.

NEVER SEARCH weight-loss language. Do not search "winter weight gain", "lose weight cycling", "weight loss for cyclists", "cycling to lose weight", "belly fat", or anything similar. Those terms return the diet industry, not cycling.

REJECT ON SIGHT, without showing me:
- Before-and-after or body transformation content
- Supplement, detox, meal-replacement or "fat burner" promotion
- Fasting or extreme-deficit evangelism
- Anything with a body-shaming or "get shredded" frame
- Scale-obsessive content. The article explicitly says judge the trend, not the Tuesday number.
- Weight-loss influencers generally, however large their following

SEARCH THE TRAINING SIDE INSTEAD. The legitimate candidates are about keeping a floor of riding through winter, which is the article's actual advice:
  GOOD: "winter base training cyclists", "indoor training winter cycling", "cycling in cold weather tips", "off season training plan cyclists", "zwift winter training"

Prefer coaching channels and sports-science creators over anyone in the weight-loss space, no matter how well their video matches on keywords.

The FOOD sections ("Handle November food before January weight") are better served by an IMAGE than a video. There is no trustworthy short video about holiday eating that will not drift into diet content. Leave those sections to Stage B.

Two or three embeds is plenty here, and one is fine.

--- A4. Filter hard before showing me anything ---

AVOID THE GIANTS. GCN (3.6M subs) and similar are too easy to reach for and will end up in every article. Prefer 50k-300k subscriber creators and coaching outfits. Never two embeds from the same brand in one article.

HIGH ENGAGEMENT IS NOT RELEVANCE. A 565k-view video of a pro racer is wrong for a 45-year-old hobbyist.

REJECT ON X:
- Link-share posts. A headline plus a URL is a bookmark, not content.
- Under ~5,000 views. Renders as a thin card.
- Accounts you cannot vouch for — politically-flavoured display names, fringe health claims, anything that puts an unvetted personality on the site.
X often fails this filter entirely. Dropping it is a valid outcome.

--- A5. Verify, then LOOK at them ---

YouTube embeddability:
curl -s "https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=VIDEO_ID&format=json"
JSON back = embeddable. Error = skip it.

INSTAGRAM: PREFER CAROUSELS AND PHOTOS OVER REELS.
mediaType "carousel" or "photo" = static, reader stays on your page. GOOD.
mediaType "reel" = thumbnail plus "Watch on Instagram", sends the reader OFF the site. Confirmed twice on the live site while logged in. Decorative only.

THEN OPEN EVERY SHORTLISTED CANDIDATE IN A BROWSER AND LOOK AT IT. Separate tabs, never reuse one.

WHEN OPENING A YOUTUBE CANDIDATE, USE THE EMBED URL, NOT THE WATCH PAGE: https://www.youtube.com/embed/VIDEO_ID . A watch page AUTOPLAYS WITH SOUND the moment it loads, which is intolerable when several are opened at once. The embed URL shows a static thumbnail until clicked. Same for Instagram: open https://www.instagram.com/p/SHORTCODE/embed/captioned/ rather than the post page.

Metadata cannot see the footage — a post whose caption, engagement and account all looked ideal turned out to be desert mountain-bike content on a road-cycling article. Not optional.

--- A6. Present to me, grouped by section ---

Two or three options per spot, not one. For each give: the creator NAME, the platform, the format (photos or video), the duration, and the EXACT SECTION HEADING it would sit under. Mark your recommendation.

Also list the sections getting nothing, so I can see the whole shape.

Wait for my approval before writing anything into the file.

--- A7. Place them in article-wp.html ---

PLACE AT THE START OR MIDWAY THROUGH A SECTION, NEVER AT THE END. The embed lands right after the claim it supports, before the section's closing takeaway line, so the takeaway keeps the last word.

Embeds go in article-wp.html ONLY, never in article.md. They are the one thing that lives in the HTML alone.

YOUTUBE (16:9):
<!-- wp:html -->
<div style="position:relative; padding-bottom:56.25%; height:0; overflow:hidden; max-width:100%; margin:1.5em 0;">
<iframe src="https://www.youtube.com/embed/VIDEO_ID" style="position:absolute; top:0; left:0; width:100%; height:100%; border:0;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="VIDEO TITLE"></iframe>
</div>
<!-- /wp:html -->

YOUTUBE SHORTS (9:16) — do NOT use the padding-bottom wrapper. WP Rocket's lazy-load placeholder ignores the absolute-positioned height rule and leaves ~950px of black gap:
<!-- wp:html -->
<div style="max-width:360px; margin:1.5em auto;">
<iframe src="https://www.youtube.com/embed/VIDEO_ID" style="border:0; width:100%; aspect-ratio:9/16;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="VIDEO TITLE"></iframe>
</div>
<!-- /wp:html -->

INSTAGRAM — direct iframe ONLY:
<!-- wp:html -->
<iframe src="https://www.instagram.com/p/SHORTCODE/embed/captioned/" frameborder="0" scrolling="no" style="max-width:100%; margin:1.5em auto; display:block; border:0;"></iframe>
<!-- /wp:html -->

NEVER use the official blockquote + embed.js widget on bikepush.com. It loads, swaps in a real iframe, then sits at forever because Instagram's cross-origin sizing message never arrives. Three fixes were tried and all failed. The direct iframe sidesteps it.
Height is a fixed guess: ~1000 for a carousel, ~1271 for a reel. Check the live page and adjust.

X (UNTESTED on bikepush.com — verify on the live page):
<!-- wp:html -->
<blockquote class="twitter-tweet"><a href="https://twitter.com/USER/status/ID"></a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!-- /wp:html -->

#####################################################################
# STAGE B — IMAGES
#####################################################################

Now that the embeds are settled you know which sections still need an image. Embeds fill some gaps, images fill the rest.

Follow blog-post-writer Stage 7 as written:
G:\My Drive\workos-bikepush\.workos\skills\blog-post-writer\references\stages\stage-7-images.md

Read that file and follow it. The essentials:

- Featured image ALWAYS, 1600x900, no question asked. Photoreal editorial, NO embedded text.
- Body images ALWAYS confirmed with me first. Present a ranked table of candidates and use AskUserQuestion with the exact image count in each option.
- Only sections with a concrete, honestly depictable subject get an image. A statistical finding or an abstract argument does not. Do not force one.
- In-post default 1200x800.

- EVERY IMAGE SHIPS AS A COMPRESSED JPG, QUALITY 80. NEVER PNG. This is a hard rule and it keeps getting missed. Gemini/nano-banana outputs PNG by default, so you MUST convert. Do not hand over a .png file under any circumstances.

  Convert and resize in one step with PIL:
  python -c "from PIL import Image; im=Image.open(SRC).convert("RGB"); im=im.resize((1600,900), Image.LANCZOS); im.save(DEST, "JPEG", quality=80, optimize=True)"

  Use (1600,900) for featured, (1200,800) for in-post. Delete the intermediate PNG afterwards.
  Sanity check the result: a 1600x900 quality-80 JPG should land around 150-250KB. If a file is over 500KB or ends in .png, it is wrong.
- Files go in images/ with alt text and an images/image-placement.md. NEVER modify article.md.
- No text of any kind in any image — no headline, caption, watermark, logo, or readable signage.

- IMAGE SUBJECTS FOR THIS ARTICLE: NO bathroom scales, NO measuring tapes, NO before-and-after framing, NO close-ups of anyone's midsection, NO diet food styled as virtuous (salad-on-a-white-plate). All of that fights the article, which argues against scale-watching and crash dieting.
  Photograph WINTER RIDING and ORDINARY FOOD instead: a rider in winter kit on a cold road, a turbo trainer set up in a garage with low winter light through the window, frost on a bike left outside, a normal kitchen table with real food on it, warm indoor light against a dark afternoon. The mood is "keep riding through the cold months", not "lose weight".
- Riders on a road must be on the RIGHT-hand side, riding with the direction of travel (US convention). Verify visually, do not assume the prompt worked.
- Readers are hobby cyclists 40-80+. Ordinary adults, frequently 45+, realistic road bikes. Not young pro racers or models.

IMAGE GENERATION — the provider keys are NOT loaded in the shell by default. The check will report "not ready" until you load them:

cd "C:/Users/whitw/.claude/plugins/cache/authority-hacker-plugins/image-generation/1.1.1"
set -a && . "G:/My Drive/workos-bikepush/.env" && set +a
python skills/image-generation/scripts/check_providers.py

Both OpenAI (gpt-image-2) and Gemini are available once loaded. Stage 7 is written for Gemini/nano-banana. If you use gpt-image instead, note that 2048x1152 is the 16:9 size and 1536x1024 the 3:2, then resize to exact dimensions with PIL.

#####################################################################
# WHEN BOTH STAGES ARE DONE
#####################################################################

Tell me:
- what the Apify run cost
- which embeds went in which sections
- where the image files are and their alt text
- confirmation that article.md was not modified

Then I will upload the images to the WordPress media library, paste article-wp.html into the Code editor, and publish.

DO NOT check embeds by opening article-wp.html directly — it is a Gutenberg fragment and embeds always misrender on a local file. Only the live published page tells the truth. WP Rocket also lazy-loads iframes: they sit at src="about:blank" until a REAL scroll reaches them, so an embed that looks broken is usually just unloaded.

Still outstanding after publishing, but not your job in this thread: meta description (/meta-description-creative) and Facebook promo (/facebook-alternative-hooks-image-link-to-site).
Pin

If your nipples hurt after a long ride, you are dealing with friction chafing. Doctors call it jogger’s nipple, and cyclists get the same condition from a jersey instead of a singlet. It stings, it can bleed, and it is fixable.

The pattern is simple. A little rubbing means nothing at mile 10. The same rubbing repeated for four hours breaks skin. Cleveland Clinic describes this clearly in its jogger’s nipple guide.

The Short Answer: It Is Chafing, and It Has a Name

Think of a rope dragged once across a branch. No mark. Drag it ten thousand times and the bark wears through.

Your jersey does the same work on a long ride. Every pedal stroke, every breath, every shrug on a climb slides fabric across your chest. Sweat adds grip. Hours add repetitions.

That is why short spins rarely cause trouble and centuries do. Friction multiplied by hours is the diagnosis.

The signs match chafing too. Redness, tenderness, dry or cracked skin, and sometimes bright spots of blood on the jersey.

Both sides often hurt together. Pain that sits right on the tip points to fabric, not fitness.

The 4 Things That Make It Worse on the Bike

Everybody sweats. Not everybody chafes. These four turn a mild rub into a shower you will remember.

1. A Loose or Rough Jersey

A flappy jersey moves more with each mile. Raised seams, ironed-on logos, and zipper plackets can all saw away for hours.

Road position makes it worse. You are leaned forward, chest stretched, fabric pulled tight then slack as you sit up for food or a climb. Bib straps can shift the layer underneath and add another pressure line.

A smooth, snug synthetic jersey chafes less than a loose one.

Hands feeling along the raised inner seam of a plain cycling jersey laid flat on a tablePin

Check the inside of your favorite long-ride jersey with your fingertips. If you feel a ridge over the chest, that ridge has your name on it at mile 50. For fabric background, our wicking fabric basics explains why synthetics move sweat better than cotton.

2. Sweat and Rain That Soak the Fabric

Dry fabric glides. Wet fabric grabs.

On a long ride you soak a jersey twice over, first with sweat, then again if the sky opens. The wet cloth clings, gets heavier, and drags with every breath.

So a jersey that feels fine for an hour turns rough by hour three. A 2023 review of friction and sweat research found that moisture raises the coefficient of friction, and repetitive motion does the rest.

Our rain riding tips for commuters help with the clothing side of wet days. For nipples specifically, assume any soaked ride needs a barrier before you roll out.

3. Cold Air That Changes the Shape

You have felt this one on a crisp descent. Cold makes nipples stand out, which gives fabric more to catch.

A 45°F (7°C) morning start is classic. You roll out with a damp base layer, hit a long downhill, and cold air hardens everything. The next two hours become a slow sanding job.

Winter layers can help or hurt. A soft base layer that stays put protects. A loose thermal that bunches and slides harms. Our winter layering guide shows how to keep chest layers from shifting.

4. The Wrong Base Layer, Especially Cotton

Cotton is kind for about 30 minutes. Then it holds sweat, stretches, and turns into sandpaper.

Older riders often own a beloved cotton undershirt that feels soft in the kitchen. On the bike it stays wet and moves around. Merino blends and slick polyester base layers stay closer to the skin and shed moisture instead of storing it.

Fit matters as much as fiber. A base layer that rides up leaves a folded edge right across the chest. A bib with tall, rough straps can do the same job underneath.

One more thing, and it surprises people. I wear a good wicking base layer even when it is hot. The instinct on a summer ride is to strip back to the jersey alone, which puts fabric straight onto skin for four hours. A thin summer layer takes that friction instead, and the heat cost is smaller than it sounds. A review of sports clothing in the heat found no meaningful difference in core temperature, heart rate or sweat loss across fabrics and layers at the intensities most of us ride at.

How to Stop It Before the Next Long Ride

You do not need a new wardrobe. You need stillness between skin and cloth, plus one backup layer when rides run long.

Start with fabric and fit.

Wear a snug synthetic jersey with flat seams and no raised print over the nipples. Try a different size if your current one balloons in the wind or pulls tight across the chest. Some riders sew a smooth patch inside, about the size of a playing card, to cover an irritating seam.

Surgical tape, an anti-chafe balm stick, fabric plasters and a folded merino base layer on a wooden table beside a cycling helmetPin

Next, add a physical barrier for anything over about three hours. Small adhesive bandages, surgical tape, or purpose-made nipple covers stay put far longer than cream. Trim or shave chest hair around the spot first, or removal later will teach you a new kind of pain.

Then use lube the smart way. Petroleum jelly works for a coffee ride but riders report it rubs off on long, hot days. Sport balms like Body Glide or Cramer Skin Lube are made for long, sweaty efforts. Tape for long rides, lube for short ones.

Women riders get extra protection from a well-fitted sports bra that stops movement. The documented risk pattern is riding without that support, which lets fabric travel. With bib shorts, check where bra straps and bib straps cross. If they stack over the same line, adjust one so you are not doubling pressure.

Sore Right Now? Treat It Like This

Yesterday already happened. Today is about calm healing, not toughing it out.

Rinse gently with mild soap and lukewarm water. Pat dry, do not rub.

Dab on plain petroleum ointment, or an antibiotic ointment if skin is cracked. Wear a soft, loose shirt and skip the scratchy jersey until the tenderness fades.

Most mild cases settle within a few days. Give it rest or ride short and easy with bandages on. Do not scrub off scabs in the shower.

Watch for infection while it heals. Spreading redness, swelling, yellow crust, pus, fever, or pain that grows means call your doctor. So does skin that is simply not improving after a few days.

It is the same rule our long-distance cycling guide gives for saddle sores. Small problems stay small when you act early.

When It Is Not Just Chafing

Almost every case after a long ride is friction. A few patterns deserve a second thought.

Cold-only pain without redness or broken skin can be sensitivity to cold and wind rather than true chafing. Hormonal shifts can make nipples tender for days at a time, in men and women, without any ride to explain it. New soap, laundry detergent, sunscreen, or embrocation can trigger contact dermatitis with itch and rash beyond the nipple tip.

Infection looks angrier. One-sided swelling, throbbing pain, warmth, pus, or fever is not simple rub.

There is also a rare but important exception. Breastcancer.org lists nipple pain warning signs that should prompt a visit, including spontaneous bloody discharge, a nipple that newly flattens or turns inward, and scaling or persistent redness.

Cleveland Clinic adds two more to that call the doctor list. A lump in the breast, or skin that changes color or texture, is worth a check either way.

Chafing hits both sides after a long effort and then improves. One-sided changes that persist with no ride to explain them need a doctor.

Check the jersey before the next long one, pack tape with your tubes, and give sore skin a few days to heal.

Know a riding buddy who suffers in silence? Share it below👇

Mark BikePush
Article By:
Mark is the founder of BikePush, a cycling website. When he's not working on BikePush, you can find him out riding.

Leave a Comment