Let’s be honest: This episode could have been as boring as a man in a black suit at the Met Gala — all the drama ultimately has been leading up to a simple vote, after all. And might I remind you, there is no cash prize up for grabs! This is just for a nice vacation, which a lot of these cast members could probably get through brand deals or sponsored trips anyway. So, you know, not exactly the highest stakes in the world. Yet the finale still manages to include a couple of genuinely gasp-worthy moments, thanks to some final shuffling of couples … but, mostly, to the strategically timed presentation of some previously unseen footage.
I’d even argue that the flashback that finally tells us whether Harry kissed Melinda is actually more dramatic than the reveal of the winning couple. Say what you want about Harry, but he was born to be on reality TV. I mean, the man has a podcast called Boyfriend Material, on which he recently revealed that his home WiFi network is called [checks notes] Harry’s Creampie Shop. (He claims that he has matured out of the name but doesn’t know how to change it.) Harry’s such a textbook example of toxicity that he makes me wanna watch, if only out of a sort of horrified academic interest. There’s a reason Netflix waited until the last few minutes of the episode to resolve his story line.
But Jessica has to make a decision before knowing for sure what happened. Harry is still insisting that he was mostly talking to Melinda about Jessica (and never made that pregnancy comment). Thankfully, Jessica’s intuition tells her that he’s not as good of a guy as he wants to be yet. She decides not to match with him, and I’m pleasantly surprised that Harry doesn’t start crying or throwing up. The bar truly could not be lower, but I do think it represents some personal growth that he can accept her decision and leave the house without making a scene.
With one couple down, it’s time for our last compatibility challenge, which is basically The Newlywed Game combined with a bridge race. Chris and Tolú win, while Stevan and a very competitive Alara are a close second. Bryton and Elys are last but don’t seem pressed. Elys is so distracted by Bryton’s body that it doesn’t seem like she even hears what’s coming out of his mouth, which might actually be for the best (Dominique has alleged on TikTok that she had several non-aired arguments with Bryton over his use of hate speech).
Tolú and Chris go on a victory date, where she asks about his high body count. In case you couldn’t tell from her delivery of “community penis” during the challenge, she has a comparatively low number. Chris assures her that he’s never cheated … in any of his three committed relationships. Maybe I’m being cynical, but that feels like a cop-out. Does he cheat if he considers a relationship to be more casual? But Tolú seems satisfied with his answer, and they definitely still feel like a team when they arrive at the final boardroom.
Here, their game plan is to be nice but strategic, which they accomplish with their co-ed choices. They decide to send Izzy and Christine on dates with Jessica and Nigel, respectively. I think at this point, everyone feels bad for Izzy. He matched up with Micah, but so far seems to just be listening to her vent about Kaz. And Tolú’s gotta look out for that bald-head, Megamind connection with her literal day one. Meanwhile, Christine and Nigel had chemistry when they kissed during a drinking game, which Kaz is still jealous about despite the fact that he wasn’t participating at the time. Removing both Kaz and Micah’s matches from the house also has the added benefit of creating an opportunity for Tolú’s bestie, Micah, to get the closure she clearly desperately wants.
On the dates, Izzy makes Jessica feel comfortable when he’s not dripping sweat into her mouth. Christine hints to Nigel that she’s ready for a man who will actively pursue her. Back at the house, Kaz takes the opportunity to tell Micah that he got frustrated because he cares, misses her, and will leave if she doesn’t want to couple up again. That’s apparently enough to convince Micah that his feelings are genuine, sigh.
At the final mixer, Christine is pissed when Micah fills her in about Kaz’s change of heart. Christine herself has been weighing her options, but she thinks Kaz is settling for an ex because he feels threatened. She and Kaz argue, and all of her friends are now very much Team Nigel. It’s sweet that Nigel and Christine both admit to finding each other cute when they crossed paths in New York, and Nigel affirms that he sees serious potential for a real relationship. I’m not the only one who feels like their personalities are compatible: Tolú plays Cupid by daring them to kiss in front of everyone.
However, the group games abruptly end when Alara gets upset over Stevan’s apparent eagerness to start a round of spin-the-bottle. If only Izzy had successfully convinced everyone to play Vroom and Skrrt (?), whatever that is! Anyway, I suppose it’s about time for us to see a crack in Alara and Stevan’s otherwise strong match. He calms her down pretty quickly and assures her that he’s fully committed, later even setting up another romantic date for her.
We end the night with no one leaving: Jessica is Izzy’s latest friendship match, Christine and Nigel match, and Kaz and Micah rematch (after he apologizes and suggests that Christine was just his way of getting over her). The next morning, however, Jessica and Izzy inform everyone that they are unmatching. We learned at the mixer that Harry sent her a lengthy apology letter, and she says she is just not over that relationship yet. Hats off to Izzy, who made a pretty cringey first impression but turned it around by being so mature about his bad luck in the house.
The remaining couples go on one-on-one activity dates where they discuss what will happen once they leave Tulum. Of course, everyone claims they want to visit each other and try making a relationship work, no matter how far apart they live. Tolú cries during a confessional while reflecting on how much she likes Chris; Kaz says that talking about a future with Micah made him “a little bit hard.” Two types of people!
Just like that, it’s time for a mini-reunion moderated by Nick Lachey. All our eliminated singles, with the exception of the presumably heartbroken Justin, are back with the couples to share some last thoughts. It’s pretty much what you’d expect. Dominique takes shots at Bryton and Chris; all of Kaz’s exes question his character … Christine goes as far as saying that Kaz’s perfect match is the devil, although that might be influenced by Kaz’s decision to randomly insult Nigel. It’s interesting to hear Xanthi suggest that Stevan isn’t genuine. I feel like his edit made him seem pretty honest, and it feels like he communicated his decision to choose Alara better than the other guys who jumped ship. On the other hand, Xanthi has been such a girl’s girl this entire season, so maybe there’s something she knows that we don’t.
Before the final vote, Nick asks if anyone has anything they’d like to say. Harry alludes to making “silly decisions” and embarrassing himself, and Netflix finally steps in to drop some receipts. We don’t see them kiss, but we do hear Melinda whispering to Harry that the cameras aren’t on them and no one’s looking. When she brings up their “treacherous kiss,” he says he wants to sleep with her. He then tells Chris he did something bad that he can’t talk about on camera and directly asks the crew if they got footage of the kiss or not. “I didn’t mean to do it,” he says. We also get to hear the put-a-baby-in-you conversation Melinda told Jessica about, which feels just as disrespectful as a kiss!
You’ve gotta hand it to Netflix. Harry has shown us who he is for ten episodes straight. Of course he’s capable of kissing another girl and lying about it. People who watched him on Too Hot to Handle already know that. However, Netflix was still able to plant some doubt because it knew viewers would question why there wasn’t more proof, even just a bit of audio or video from before or after the moment. It turns out the producers had that, but they were just holding onto the footage to maximize impact. Now, do I think it sounded like Melinda was slightly encouraging Harry to kiss her and didn’t necessarily tell her girls that part? Yes. But downplaying flirtiness is very different from fully inventing a kiss for clout, and it’s wild that she had to sit through a week of hate before the truth came out. As far as we see, Harry never apologizes directly to her for the gaslighting.
Back to the voting! Our perfect match this season is … Christine and Nigel?? All the potential options we’ve been agonizing over have been beaten by a couple that was only together for a single episode. Call that deux ex match-ina. I’m happy they beat the odds as a new match, and it looks like they had fun on their trip to Thailand, so good for them!
This result is a reminder that winning Perfect Match is kinda like campaigning to become prom king and queen. Sure, it’s cutest when a couple who genuinely likes each other wins, but it’s ultimately a joint popularity contest. No matter how much everyone likes Tolú, do you think Melinda, Dominique, or Bryton would ever send Chris on an all-expenses-paid vacation? Given that Christine and Nigel only won by one vote, it seems possible that Xanthi’s concerns about Stevan could’ve tipped the balance against his seemingly solid match. Basically, you’ve gotta be compatible not just with your partner but also with the entire house. So it actually makes a lot of sense that the winners would be the couple who had the least time to piss everyone else off. Cheers, Christine and Nigel! May your relationship last at least long enough for neither of you to be cast on the next season of Perfect Match.
But wait, it’s not over yet! As the credits roll, Jessica reveals that she’s in L.A. and has given Harry another chance to woo her. In a video they filmed together in a car, Harry predicts they’ll be married when this airs. A giant text immediately informs us that they actually broke up a week later. It’s truly an incredible way for Perfect Match to acknowledge, up until the very end, just how unserious this show is. It’s a perfect ending. No notes.
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(3),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(136),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(408),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"408":408,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]