The economics of cruise ships

In the wake of coronavirus and tanking stocks, cruise companies have sought assistance from the US government. But for decades, the industry has done everything in its power to avoid paying into the system.


Cruise ships are often called “monsters” of the sea.

If you’ve ever seen one in action, you’ll understand why: A vessel like Royal Caribbean’s Symphony of the Seas is longer than 12 blue whales. At 228k gross tons, it is 5x the size of the once-formidable Titanic. It can hold 6,680 passengers and 2,200 crewmembers, the population of a small American town.

In 2018, 28.5m passengers — the bulk of them from America — spent more than $46B on cruises globally. The biggest players see annual profits in the billions.

But cruise companies have done more to earn the “monster” moniker than churning out huge ships and market gains.

For decades, these companies have utilized century-old loopholes to avoid paying corporate taxes. They’ve gone to great lengths to bypass US employment laws, hiring foreign workers for less than $2/hour. They’ve sheltered themselves as foreign entities while simultaneously benefitting from US taxpayer-funded agencies and resources.

Now, in the wake of a coronavirus crisis that has sunk cruise stocks by double digits, these companies are lobbying for federal assistance.

To better understand the dynamics of this wild industry, we spoke with maritime lawyers, legislators, and cruise experts in 3 countries.

The cruise industry at large


Before we get into how cruise companies circumvent US taxes and regulations, let’s take a quick look at the major players, the money they make, and how they make it.

The global market comprises dozens of cruise lines and more than 250 ships. But 3 players — Carnival Corporation & PLC, Royal Caribbean Cruises LTD, and Norweigan Cruise Line HLD — control roughly 75% of the market.

Zachary Crockett / The Hustle

These companies, which preside over an empire of subsidiary cruise lines, collectively raked in $34.2B in revenue in 2018.

Cruise ships make this money through two channels: Ticket sales and onboard purchases (e.g., alcoholic drinks, casino gambling, spa treatments, art auctions, and shore excursions), which passengers pay for with pre-loaded cruise cards and chip-equipped wristbands.

On average, tickets account for 62% of total revenue and onboard purchases make up the remaining 38%.

Though tickets represent a majority of revenue, onboard purchases account for the lion’s share of the profit, according to several experts.

As a high fixed-cost business, a cruise ship relies on getting as many passengers as possible on the ship — even at fire-sale rates. The major cruise lines will often fill each ship to 105%-110% capacity, then upsell its captive consumers on additional services.

“They have mastered the ability to get their hands into people’s pockets and to take out every last dollar,” says Ross A. Klein, a professor at Memorial University of Newfoundland, who has closely studied the cruise ship industry. “They can almost give a cabin away for free and still make a profit.”

Despite sizeable overhead costs — which include travel agent commissions, fuel, marketing, and payroll — these large crowds yield handsome profits. Industry-wide, cruise lines enjoy net margins of 17%, nearly double the average of some comparably large hotel chains:

  • Carnival: $3.2B net profit (17% margin)
  • Royal Caribbean: $1.8B net profit (19% margin)
  • Norwegian: $955m net profit (16% margin)

To make these figures a bit more relatable, here’s what this works out to on a per-passenger level for a 7-day cruise:

Zachary Crockett / The Hustle

On average, a passenger will spend $1,060 ($151/day) on a ticket and $650 ($92/day) on onboard purchases. After subtracting overhead costs, a ship will make out with roughly $291 in net profit per passenger, per cruise.

That means that at full capacity, a single ship like Royal Caribbean’s Symphony of the Seas might make $9.8m in revenue ($1.7m of which is profit) during one 7-day excursion. That’s $239k in profit per day at sea.

As 50% of this money comes from American travelers, one might expect the cruise industry to be a substantial contributor to the US tax system.

But there’s a catch: These companies aren’t technically American. And they harbor what one legal expert calls a “dirty little secret.”

How cruise companies avoid paying US taxes


Carnival, Royal Caribbean, and Norwegian all have headquarters in Miami, Florida, a city that brands itself as the “Cruise Capital of the World.”

With this homeland base, a large foundation of US customers, and red, white and blue logos, these cruise lines have manufactured an identity as authentically American corporations. President Trump has even called them a “great US business.”

Legal paperwork tells a different story.

International law requires every ship to register with a country and fly its insignia in open waters. A ship is only subject to the laws of the country it is registered in.

Under an obscure, 99-year-old section of the US tax code, cruise companies are able to register their ships with countries that have more lenient laws than the US — an act called flying a “flag of convenience” — and avoid paying into the US tax system.

It’s a tax loophole big enough to drive a cruise ship through.

Zachary Crockett / The Hustle

The cruise industry isn’t alone in avoiding Uncle Sam: US companies use offshore accounts to avoid paying an estimated $90B-per-year in taxes.

But it is especially adept at the practice: Carnival is incorporated in Panama and flies the flags of Panama and the Bahamas; Norwegian is incorporated in, and flies the flag of, the Bahamas; Royal Caribbean has been incorporated in Liberia since 1985, and flies the flags of the Bahamas and Malta.

These impoverished countries often compete with each other to offer cruise lines the cheapest services, much like many US cities groveled for Amazon’s HQ2 by offering large tax cuts.

“Cruise lines want to register somewhere where they pay no taxes, are exempt from labor and wage statues, and don’t have to follow health and safety codes,” says Jim Walker, a Miami-based maritime lawyer. “They’re looking for a place that will leave them alone, not oversee their operations.”

For the most part, that’s what cruise companies have gotten: According to annual report filings, the major cruise lines pay an average tax rate of 0.8% — for below the 21% US corporate tax rate.

The benefits of such arrangements are nominal for the countries that register the ships.

Cruise lines will generally pay a small head tax ($4-$15 per passenger) to call on a port. According to Klein, these countries often spend more on maintaining facilities for cruise ships than they make through the fees.

They might also promise a boost to the economies they frequent. But Klein says they work out deals with local vendors where they take up to 70% of the onshore revenue — and studies have shown that local populations in foreign ports don’t get much out of such partnerships.

A cruise ship employee cleans a slot machine onboard MSC cruises’ Magnifica in Saint-Nazaire (FRANCK PERRY/AFP via Getty Images)

Registering ships abroad also shelters cruise companies from US employment and safety laws.

Cruise ships hire crew members from Southeast Asia, Eastern Europe, and  “anywhere else you can find people willing to work for nothing,” and demand grueling workloads in exchange for comparatively paltry wages.

The standard contract for a crew member like a cleaner or dishwasher requires a mandatory 308 hours per month — 11 hours a day, 7 days a week, for as long as 8-10 months, with no days off — for the equivalent of $400-700 per month, or $1.62 to $2.27 per hour.

Unprotected by labor laws and regulations, crew members who get injured on the job are swiftly replaced, like “fungible goods.”

In its latest report, the Cruise Lines International Association, an influential trade group, argues that the cruise industry has a $52.7B “total economic impact” on the US economy and “supports” 421k American jobs. But Klein says it’s unclear what goes into calculating these figures.

The Hustle asked several major cruise lines to comment on the concerns raised in this article. None of the companies responded.

There is one thing the cruise industry has been expeditious about doing on US soil: Lobbying to keep its exemptions in place.

According to the nonprofit Open Secrets, the cruise industry spent $66.2m in lobbying fees between 1998 and 2019. It also made contributions of at least $1.1m to candidates in cruise ship states, including $29.5k to a US representative from Florida who chairs the Panama Caucus, and $23.5k to a senator who fought to blockade a cruise tax.

$813,807 for a single taxpayer-funded rescue effort


While cruise ships avoid paying US taxes, they simultaneously benefit from the services of taxpayer-funded federal agencies.

Professor Klein, who has testified before Congress on matters of cruise ship safety, says that in the past 25 years:

  • 361 passengers have fallen overboard on cruise ships (14 per year)
  • 353 gastrointestinal/norovirus outbreaks have broken out on cruise ships
  • 500+ environmental violations have been charged to cruise ships

In many of these cases, US agencies have to intervene — and taxpayers, not cruise companies, usually eat the cost.

Rescue teams search for survivors on the Costa Concordia, which struck a rock off the Italian coast in 2012 (Target Presse Agentur Gmbh/Getty Images)

Klein has filed open-records requests and obtained documents on the companies, which he shared with The Hustle. They show that a single cruise ship passenger rescue effort can cost the US Coast Guard and the US Navy from $500k to $1m+. One 2009 search for a woman who fell overboard off the coast of Florida set the Coast Guard back $813,807.

When ships go dead in the water — as was the case with Carnival’s Splendor fire in 2010 and its Triumph disaster in 2013 — these costs can balloon to $5m+.

Walker, the maritime lawyer, adds that, in certain cases, cruise ships also require the resources of taxpayer-funded agencies like the US Public Health Service, Centers for Disease Control and Prevention, United States Citizenship and Immigration Services, and US Customs and Border Protection.

What does this all mean in the context of coronavirus?

In the wake of a COVID-19 pandemic that has infected more than 157k and killed at least 5.8k people worldwide (as of March 14), the hospitality industry is reeling.

Cruise ships — often called “floating petri dishes,” for their adeptness at spreading illnesses — have been hit especially hard. After at least 21 passengers tested positive for COVID-19 aboard Carnival’s Grand Princess, the State Department urged the public to “not travel by cruise ship.”

Customers clamored to cancel trips and cruise stocks fell by 60% — the worst stock performance on record for the industry. 

Initially, some cruise lines attempted to weather the storm by selling tickets at all costs. According to emails obtained by the Miami New Times, salespeople at Norwegian were instructed to respond to coronavirus-inquiring customers with scripted one-liners, like “The only thing you need to worry about for your cruise is do you have enough sunscreen?”

When we called the company’s booking hotline last week, a salesperson told us that coronavirus doesn’t exist in tropical climates.

Zachary Crockett / The Hustle

Some major lines have since self-imposed suspensions on cruise trips to and from US ports for up to 60 days — a move that further imperils their revenue.

The Trump administration has hinted at a potential bailout, and the Cruise Lines International Association is urging its 43k travel agent partners to call the White House to express their support for the industry.

Critics like Klein aren’t having it. “They pay no taxes and now they want taxpayer support?” he says. “What happened to laissez-faire capitalism?”

But as federal aid begins to look unlikely, some cruise operators have shifted their pleas to a different set of ears.

In a video posted to Twitter, Jan Swartz, the President of Carnival’s Princess cruise line, called on the American public to help guide the company through dark waters.

“We ask you to book a future Princess cruise to your dream destination as a sign of encouragement for our team,” she wrote. “With your support we will emerge from this time of trial even stronger.”

Get the 5-minute roundup you’ll actually read in your inbox​

Business and tech news in 5 minutes or less​



How'd Bezos build a billion dollar empire?

In 1994, Jeff Bezos discovered a shocking stat: Internet usage grew 2,300% per year.

Data shows where markets are headed.

And that’s why we built Trends — to show you up-and-coming market opportunities about to explode. Interested?

[email-submission-form button-text="Join Free" include-trends-opt-in="true" success-url="" default-source="thehustleco" default-medium="home-exit-popup" default-campaign="home-page" form-id="exit-popup-general" optinmonster-conversion="true"]
<script type="text/javascript"> var onloadCallback = function() { grecaptcha.render('verify-your-humanity', { 'sitekey' : '6LdddrcZAAAAALyttpvOqiwQGwq5BNhgDz4tMQGE' }); }; function getCookieValue(a) { var b = document.cookie.match('(^|[^;]+)\\s*' + a + '\\s*=\\s*([^;]+)'); return b ? atob(decodeURIComponent(b.pop())) : ''; } function getCookie(name) { var cookieArr = document.cookie.split(";"); for(var i = 0; i < cookieArr.length; i++) { var cookiePair = cookieArr[i].split("="); if(name == cookiePair[0].trim()) { return decodeURIComponent(cookiePair[1]); } } return null; } function setHiddenFieldValue(wrappingDiv, searchParams, className, utmName, cookieName, defaultValue) { var el = wrappingDiv.getElementsByClassName(className)[0]; var existingVal = el.getAttribute('value'); if (utmName == 'ref') { var newVal = searchParams.get(utmName) || getCookie(cookieName); } else { var newVal = searchParams.get(utmName) || getCookieValue(cookieName); } if ((existingVal == null || existingVal == '' || existingVal == defaultValue) && (newVal != null && newVal != '')) { el.setAttribute('value', newVal); } } function setHiddenFieldValueFromUtm( wrappingDiv, searchParams, className, utmName, defaultValue ) { var el = wrappingDiv.getElementsByClassName(className)[0]; if (el != null) { var existingVal = el.getAttribute("value"); var newVal = searchParams.get(utmName); if (newVal != null && newVal != "") { el.setAttribute("value", newVal); } } } function initForm() { var wrappingDivs = document.getElementsByClassName('email-submission');,wrappingDiv => { var sp = new URLSearchParams(; setHiddenFieldValue(wrappingDiv, sp, 'funnel-source', 'utm_source', 'funnel_source', 'thehustleco'); setHiddenFieldValue(wrappingDiv, sp, 'funnel-campaign', 'utm_campaign', 'funnel_campaign', 'home-page'); setHiddenFieldValue(wrappingDiv, sp, 'funnel-medium', 'utm_medium', 'funnel_medium', 'home-exit-popup'); setHiddenFieldValue(wrappingDiv, sp, 'funnel-referral', 'ref', 'funnel_referral', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-a', 'a', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-c', 'c', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-o', 'o', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-oc', 'oc', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-e', 'e', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-f', 'f', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-r', 'r', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-t', 't', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-s1', 's1', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-s2', 's2', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-s3', 's3', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-s4', 's4', ''); setHiddenFieldValueFromUtm(wrappingDiv, sp, 'funnel-s5', 's5', ''); var error_message = getCookieValue('validate-email-message'); if (error_message && error_message.trim() != '') { var error = wrappingDiv.getElementsByClassName('funnel-error')[0]; var prev_email = getCookieValue('funnel_email'); error_message = prev_email + " is not valid. Please try again"; error.innerHTML = error_message; = ''; } }); if (false) { initCaptchaFormV2(); } } function initCaptchaFormV2() { var v3RecaptchaResponseEl = document.getElementById('recaptcha-response-v3'); v3RecaptchaResponseEl.parentNode.removeChild(v3RecaptchaResponseEl); var wrappingDiv = document.getElementById('email-submission'); var subForm = wrappingDiv.getElementsByClassName('email-submission')[0]; var captchaVersion = document.createElement('input'); captchaVersion.class = 'g-recaptcha hidden-input'; captchaVersion.type = 'hidden'; = 'g-recaptcha-response-v2'; captchaVersion.value = 'true'; subForm.appendChild(captchaVersion); var captchaEl = document.createElement('div'); = 'verify-your-humanity'; subForm.prepend(captchaEl); var captchaApiScriptEl = document.createElement('script'); captchaApiScriptEl.src = ''; captchaApiScriptEl.async = true; captchaApiScriptEl.defer = true; document.head.appendChild(captchaApiScriptEl); } window.addEventListener('DOMContentLoaded', (event) => { initForm(); }); if(typeof hp_interval == 'undefined') { var hp_interval = 0; var hp_ts = 0; var hp_try = 0; jQuery(document).ready(function ($) { hp_interval = setInterval(function(){ $('input.hp_ts').val(hp_ts); hp_ts += 1; if(hp_ts >= 180) { clearInterval(hp_interval); } },1000); $('.email-submission:not(.prevent-default)').submit(function (e) { var form = $(this); if(hp_ts < 3 && hp_try < 1) { e.preventDefault(); if (form.find('.email-form-submit-message').length < 1) { form.find('.email-form-wrap').after('<p class="email-form-submit-message" style="padding: 0em 1.5em;">Too fast! Are you a human? Try again please.</p>'); } hp_try += 1; hp_ts = 0; $('input.hp_try').val(hp_try); } }); }); } </script> <div class="email-signup" id=email-submission> <div class="funnel-error" style="display:none;"></div> <form class="email-submission " id="exit-popup-general" action="" method="post" autocomplete="email"> <div class="email-form-wrap"> <input class="funnel-source hidden-input" type="hidden" name="source" value="Revue newsletter"> <input class="funnel-campaign hidden-input" type="hidden" name="campaign" value="Nomadic Notes"> <input class="funnel-medium hidden-input" type="hidden" name="medium" value="email"> <input class="funnel-form-id hidden-input" type="hidden" name="form-id" value="exit-popup-general"> <input class="funnel-referral hidden-input" type="hidden" name="referral_code"> <input class="funnel-fail-url hidden-input" type="hidden" name="fail_url" value=""> <input class="funnel-ip-country-wordpress hidden-input" type="hidden" name="ip_country_wordpress" value="US"> <input class="funnel-submission-url hidden-input" type="hidden" name="submission_url" value=""> <input class="funnel-a hidden-input" type="hidden" name="a" value=""> <input class="funnel-c hidden-input" type="hidden" name="c" value=""> <input class="funnel-o hidden-input" type="hidden" name="o" value=""> <input class="funnel-oc hidden-input" type="hidden" name="oc" value=""> <input class="funnel-e hidden-input" type="hidden" name="e" value=""> <input class="funnel-f hidden-input" type="hidden" name="f" value=""> <input class="funnel-r hidden-input" type="hidden" name="r" value=""> <input class="funnel-t hidden-input" type="hidden" name="t" value=""> <input class="funnel-s1 hidden-input" type="hidden" name="s1" value=""> <input class="funnel-s2 hidden-input" type="hidden" name="s2" value=""> <input class="funnel-s3 hidden-input" type="hidden" name="s3" value=""> <input class="funnel-s4 hidden-input" type="hidden" name="s4" value=""> <input class="funnel-s5 hidden-input" type="hidden" name="s5" value=""> <input class="funnel-success-url hidden-input" type="hidden" name="success_url" value=""> <input id="recaptcha-response-v3" class="g-recaptcha hidden-input" type="hidden" name="g-recaptcha-response" value=""> <div class="signup-icon" style="display:none;"> <svg width="24" viewBox="0 0 24 24" fill="none" xmlns=""><path d="M22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6Zm-2 0-8 5-8-5h16Zm0 12H4V8l8 5 8-5v10Z" fill="#848B92"></path></svg> </div> <input type="hidden" name="hp_ts" class="hp_ts" value="0"> <input type="hidden" name="hp_try" class="hp_try" value="0"> <input type="text" name="first_name" placeholder="Enter your name" value=""> <input class="signup-email" type="email" name="email" placeholder="Your email address" required autocomplete="email"> <input class="email-submit om-trigger-conversion" type="submit" value="Join Free"> </div> <div class="validate-mistake-emails-message" style="display:none;"></div> <div class="form-options" style="display:none"> <div class="form-options-wrap"> <div class="trends-opt-in"> <input id="trends_opt_in_email_submission" class="trends-opt-in-checkbox" type="checkbox" name="trends_opt_in"> <label for="trends_opt_in_email_submission" id="trends_opt_in_label" class="trends-opt-in-text">Yes, I’d like to receive additional marketing emails on hot business opportunities from Trends, by the Hustle.</label> </div> <div class="privacy-text"> <p>We're committed to your privacy. The Hustle uses the information you provide to contact you about our relevant content and services. You may unsubscribe from these communications at any time. For more information, check out our <a href="">Privacy Policy</a>.</p> </div> </div> </div> <div submit-success> <template type="amp-mustache"> <p class="c-message c-message--success">Thank you for subscribing.</p> </template> </div> <div submit-error> <template type="amp-mustache"> <p class="c-message c-message--failed">Your submission failed. Please try again!</p> </template> </div> </form> </div>