Faits :
A.
A.a. Z._ détenait une parcelle dans la commune de... (VD) sur laquelle elle souhaitait ériger un centre commercial. En automne 2012, elle a demandé à A._ de la conseiller. Ce professionnel de l'immobilier et homme d'affaires très expérimenté est l'administrateur unique de la société A._ SA.
Le 9 novembre 2012, la propriétaire du bien-fonds et l'entité précitée (ci-après: l'entrepreneuse) ont signé un contrat d'entreprise générale portant sur la construction d'un centre commercial et administratif doté d'un parking souterrain. Ce contrat fixait un "prix plafond de l'ouvrage" adaptable en fonction des plus-values ou moins-values décidées par les deux parties. Dans l'hypothèse où le coût final se révélerait inférieur au prix plafond adapté, la "moins-value" serait répartie à parts égales entre la propriétaire et l'entrepreneuse.
Ultérieurement, Z._ a fondé une société anonyme dénommée Z._ SA dont elle est l'administratrice unique. Elle lui a vendu sa parcelle en avril 2013 et la société lui a succédé dans le contrat précité.
A.b. Le 10 juin 2010, soit avant qu'elle ait rencontré A._ (ci-après: le promoteur immobilier), Z._ avait déjà signé une convention avec l'entreprise E._ par laquelle celle-ci s'engageait à louer une importante surface dans le futur complexe immobilier pour une durée de 20 ans.
Dans une missive du 16 juillet 2012, la propriétaire a indiqué à l'entreprise E._ qu'afin de pouvoir "commencer les travaux, il [lui] fa[llai]t le permis définitif ainsi que le bail [...] pour obtenir le financement." Précisant qu'elle ne pouvait attendre au-delà de la mi-septembre pour concrétiser le bail, elle confirmait sa position concernant les loyers, soit 250 fr. par m2 pour le centre commercial E._ (d'une surface de 7'895 m2), 280 fr. par m2 pour... (d'une surface de 541 m2) et 200'000 fr. pour 109 places de parc.
Le 20 juillet 2012, l'entreprise E._ a réexprimé son vif intérêt pour le projet en notant que la propriétaire restait disposée à négocier. Elle a sollicité "un projet de bail ainsi que le descriptif technique".
Le 26 septembre 2012 s'est tenue une séance réunissant la propriétaire, le promoteur immobilier, l'architecte M._ (employé de l'entrepreneuse) et deux représentants de E._. Ceux-ci ont obtenu que soit prise en compte la surface nette de plancher plutôt que la surface brute. Le promoteur immobilier leur a demandé de chiffrer clairement le loyer qu'ils étaient disposés à payer, ce qui fut fait.
Le 27 septembre 2012, E._ a indiqué à Z._ qu'elle voulait en rester au loyer maximal de 2'130'000 fr. par an pour la partie commerciale, places de parc comprises.
La prénommée a transmis cette missive au promoteur immobilier, qui a fait les commentaires suivants dans un courriel du 28 septembre 2012 portant l'en-tête de l'entrepreneuse:
---..]
- le loyer annuel de FS 2'130'000.00 ne semble pas négociable
- la durée du bail semble par contre négociable, au lieu de partir sur 20 ans, prévoir 25 ans, ce prolongement de 5 ans faciliterait le financement
- l'indexation prendrait effet depuis le début et le loyer serait ainsi atteint après 3, 4 ans
- de la sort[e], une meilleure opportunité s'offrirait à l'investisseur. [...]"
Le 9 novembre 2012, Z._ et E._ ont signé un "contrat de bail" par lequel l'entreprise s'engageait à louer une surface de 7'500 m2 et 109 places de parc pour un loyer annuel total de 1'980'000 fr. (charges non comprises). Cette convention était conclue pour une durée initiale de 25 ans, renouvelable par deux options unilatérales de 5 ans chacune en faveur de la locataire.
A.c. En 2010 ou 2011 déjà, Z._ était entrée en contact avec F._ pour discuter d'une éventuelle location de bureaux dans le centre projeté.
Aux alentours de l'année 2013, il avait été question d'une vente de locaux administratifs à F._ sans qu'un prix ne fût articulé.
Le 4 décembre 2013, Z._ a demandé au promoteur immobilier de lui confirmer le coût d'aménagement des bureaux, devisé à 13 millions de francs. Dans le même temps, elle a sollicité son avis sur l'offre qu'elle avait préparée.
Le 5 décembre 2013, Z._ SA a transmis à F._ une offre de vente pour 57'240'000 fr., toutes taxes comprises (TTC).
Le 1er septembre 2014, le promoteur immobilier, l'architecte M._ et des représentants de F._ se sont réunis. Z._ n'était pas présente.
Les discussions ont notamment porté sur la manière dont le promoteur gérait ses immeubles et les rumeurs y relatives. Celui-ci a fait part des rabais qu'il parvenait généralement à obtenir des maîtres d'état. Il a aussi abordé la question de la vente des locaux en articulant un prix de vente. F._ a fait une contre-proposition.
Dans un courriel du 3 septembre 2014 signé au nom de l'entrepreneuse, le promoteur a informé F._ que Z._ confirmait son accord pour le montant de 55 millions de francs (TTC).
Le 11 septembre 2014, F._ a signifié à l'entrepreneuse qu'elle acceptait cette offre, selon le descriptif des travaux d'aménagement. Z._ SA lui a demandé de confirmer son accord.
Le 28 octobre 2014, Z._ SA et l'entrepreneuse ont signé un "contrat d'entreprise générale" portant sur l'aménagement des bureaux destinés à F._, pour un prix forfaitaire de 13,5 millions de francs hors taxes (HT).
Le 18 décembre 2015, Z._ SA et F._ ont conclu un acte de vente de locaux commerciaux au prix de 55 millions de francs (TVA incluse), comprenant l'aménagement de bureaux confiés à l'entrepreneuse.
A.d. L'entrepreneuse a établi des décomptes provisoires les 31 décembre 2014, 30 juin 2015 et 29 février 2016 en précisant que le coût final de l'ouvrage serait probablement inférieur au prix plafond convenu. Ceux-ci ne mentionnaient aucune commission de courtage pour la conclusion des contrats avec E._ et F._.
A.e. Le 29 septembre 2016, l'entrepreneuse a adressé à Z._ SA une facture finale indiquant que celle-ci lui devait une "commission de vente F._" de 1'650'000 fr. (soit 3% de 55 millions de francs), respectivement une commission de 1'300'000 fr. pour l'"amélioration du bail à loyer E._" dont la durée avait été étendue à 25 ans après l'intervention de A._. L'intéressée a rétorqué le jour suivant que les parties n'étaient liées par aucun contrat de courtage, de sorte que cette facture était nulle.
Le coût final de l'ouvrage s'est révélé inférieur au prix plafond "adapté" selon le contrat du 9 novembre 2012.
Les parties se sont alors disputées, notamment au sujet des commissions de courtage.
B.
B.a. Le 9 février 2017, Z._ SA a ouvert action contre l'entrepreneuse devant la Chambre patrimoniale du canton de Vaud. Elle exigeait le remboursement de 2'462'829 fr. 30, soit la part censée lui revenir du fait que le coût définitif de l'ouvrage était inférieur au prix plafond convenu.
L'entrepreneuse a conclu au rejet. Tout en concédant devoir 2'462'832 fr. à la demanderesse, elle a opposé en compensation une créance de 2'665'200 fr. soi-disant due au titre de commissions de courtage. Après compensation, elle prétendait formellement au paiement de 202'368 fr. (2'665'200 fr. - 2'462'832 fr.).
Par jugement du 1er avril 2020, la Chambre patrimoniale a admis l'action principale et condamné l'entrepreneuse à payer 2'462'829 fr. 30 à la propriétaire. Elle a en revanche rejeté l'action reconventionnelle après avoir relevé que l'entrepreneuse - pour laquelle avait oeuvré le promoteur immobilier en qualité d'administrateur - était légitimée à prendre des conclusions condamnatoires.
B.b. Statuant le 17 décembre 2020, le Tribunal cantonal vaudois a rejeté l'appel formé par l'entrepreneuse (cf. au surplus consid. 4).
C.
Agissant par la voie du recours en matière civile, l'entrepreneuse requiert du Tribunal fédéral qu'il réforme l'arrêt entrepris et condamne Z._ SA à lui payer 2'665'200 fr., sous déduction de 2'462'832 fr., plus intérêts à 5% dès le 29 septembre 2016.
L'intimée a déposé une réponse sollicitant le rejet du recours, qui n' a inspiré aucun commentaire à la recourante.
L'autorité précédente s'est référée à son arrêt.

Considérant en droit :
1.
Les conditions de recevabilité du recours en matière civile sont réalisées sur le principe, notamment celles afférentes au délai de recours (art. 46 al. 1 let. c et <ref-law>) et à la valeur litigieuse minimale de 30'000 fr. (art. 53 al. 1 et art. 74 al. 1 let. b LTF; cf. arrêts 4A_94/2013 du 29 août 2013 consid. 1 et les références; 8C_796/2015 du 20 juin 2016 consid. 1.2).
2.
L'entrepreneuse ne nie pas que Z._ SA détient contre elle une créance de 2'462'829 fr. 30 fondée sur le contrat d'entreprise du 9 novembre 2012; elle oppose toutefois en compensation des créances contestées (commissions de courtage), qui font l'objet de conclusions reconventionnelles. A ce stade, le litige se résume à déterminer si la recourante et l'intimée (via leurs représentants respectifs A._ et Z._) ont passé des contrats de courtage par actes concluants concernant la négociation d'un bail avec E._ d'une part, et la négociation d'une vente immobilière avec F._ d'autre part.
3.
L'<ref-law> définit le courtage comme " un contrat par lequel le courtier est chargé, moyennant un salaire, soit d'indiquer à l'autre partie l'occasion de conclure une convention, soit de lui servir d'intermédiaire pour la négociation d'un contrat".
Les parties doivent s'accorder sur deux éléments objectivement essentiels ( essentialia negotii) : d'une part, la définition de l'activité que le courtier devra déployer en vue d'un contrat déterminé (courtage d'indication, de négociation, de présentation); d'autre part, le principe d'une rémunération (<ref-ruling> consid. 2.3 p. 223; <ref-ruling> consid. 5.1.2 p. 275; <ref-ruling> consid. 6; FRANÇOIS RAYROUX, in Commentaire romand, Code des obligations I, 3e éd. 2021, n° s 4-6 et 11-12 ad <ref-law>; CATERINA AMMANN, in Basler Kommentar, Obligationenrecht I, 7e éd. 2020, nos 1-2 ad <ref-law>; TERCIER ET ALII, Les contrats spéciaux, 5e éd. 2016, nos 4936-4937 et 4944 ss; NICOLAS BRACHER, in Handkommentar zum Schweizer Privatrecht, 3e éd. 2016, nos 1, 4-5 ad <ref-law>). Il n'est en revanche pas nécessaire de prévoir le montant du salaire (cf. <ref-law>; arrêt 4C.70/2003 du 6 juin 2003 consid. 3.1 i.f.; RAYROUX, op. cit., n° 7 ad <ref-law>; TERCIER ET ALII, op. cit., n° 4948).
La passation du contrat de courtage n'est soumise à aucune exigence de forme. En l'absence de déclarations expresses, elle peut résulter d'actes concluants (ATF <ref-ruling> consid. 5.1.2 p. 275). En ce dernier cas, on doit pouvoir déduire des circonstances que les parties se sont accordées sur les essentialia d'un contrat de courtage, en particulier que le mandant s'est engagé envers le courtier à lui verser un salaire (arrêt 4C.54/2001 du 9 avril 2002 consid. 2a; arrêt précité 4C.70/2003 consid. 3.1). La retenue est de mise lorsqu'il s'agit d'admettre la conclusion d'un tel contrat par actes concluants (cf. arrêts 4A_67/2011 du 7 juin 2011 consid. 1.2; 4C.328/2006 du 16 octobre 2007 consid. 3.1; arrêt précité 4C.54/2001 consid. 2a; ATF 72 II 84 consid. 1b p. 87; RAYROUX, op. cit., n° 17 ad <ref-law>; AMMANN, op. cit., n° 5 ad <ref-law>; MICHAEL VLCEK, in Kurzkommentar, Obligationenrecht, 2014, n° 6 ad <ref-law>). Les circonstances d'espèce sont déterminantes. Le juge s'attachera d'abord à dégager la commune et réelle intention des parties (interprétation subjective); s'il ne parvient pas à l'établir - parce que les preuves font défaut ou ne sont pas concluantes - ou s'il constate qu'une partie n'a pas compris la volonté exprimée par l'autre à l'époque de la conclusion du contrat (désaccord latent), il doit alors recourir à l'interprétation selon le principe de la confiance (ou interprétation objective), en recherchant comment une déclaration ou attitude devait être comprise de bonne foi (ATF <ref-ruling> consid. 5.1.3 p. 276; arrêt précité 4C.54/2001 consid. 2b; TERCIER ET ALII, op. cit., n° 4952; plus généralement, cf. <ref-ruling> consid. 5.2.2 et 5.2.3).
L'interprétation subjective repose sur l'appréciation des preuves. Si elle s'avère concluante, le résultat qui en est tiré, c'est-à-dire la constatation d'une commune et réelle intention des parties, relève du domaine des faits et lie en principe le Tribunal fédéral (<ref-ruling> consid. 5.2.1; arrêt 4A_643/2020 du 22 octobre 2021 consid. 4.2.3 [1°]). Ce mode d'interprétation prime l'interprétation objective, laquelle relève du droit (<ref-ruling> consid. 1.1; arrêt précité 4A_643/2020 consid. 4.1 et 4.2.3 [1°-3°]).
Le courtier qui réclame un salaire doit établir les circonstances permettant d'inférer un accord des parties (arrêts précités 4C.70/2003 consid. 3.1; 4C.54/2001 consid. 2a; RAYROUX, op. cit., no 17 i.f. ad <ref-law>). Il doit en outre prouver qu'il a agi, et que son intervention a été couronnée de succès (cf. <ref-law>; ATF <ref-ruling> consid. 5.1.2 p. 275).
4.
La recourante soutient que la partie adverse lui aurait confié, contre rémunération, la tâche de négocier un bail avec E._ d'une part, et une vente immobilière avec F._ d'autre part.
La Chambre patrimoniale a exclu que les parties aient eu la réelle et commune intention de confier à l'entrepreneuse la conduite des négociations du bail avec E._ et de la vente avec F._ (1 er élément essentiel du courtage); elle a également écarté la thèse d'accords de droit découlant du principe de la confiance. Par surabondance, elle a nié une volonté réelle et commune de faire intervenir l'entrepreneuse à titre onéreux (2 e élément essentiel), en précisant que l'interprétation objective menait à la même conclusion.
La Cour d'appel a quant à elle rejeté les griefs de l'entrepreneuse, tout en jugeant "convaincante (s) ", d'une part, la constatation selon laquelle il n'y avait pas d'accord de fait sur les activités censées devoir être déployées par la prétendue courtière, d'autre part, l'interprétation fondée sur le principe de la confiance. Elle a aussi renvoyé à "l'argumentation convaincante" des premiers juges concernant l'absence d'accord de fait ou de droit sur la rémunération de la soi-disant courtière.
5.
5.1. La Chambre patrimoniale (à laquelle s'est ralliée la Cour d'appel) a déployé une argumentation à plusieurs pans. A bien lire son jugement, elle a notamment considéré que ni l'une ni l'autre partie ne voulait en fait que l'entrepreneuse intervienne dans les négociations à titre onéreux. Pareil constat la dispensait en soi de procéder à une interprétation objective, laquelle ne s'impose que si les preuves font défaut ou ne sont pas concluantes, ou si le juge constate un désaccord latent (<ref-ruling> consid. 5.2.1 et 5.2.3; arrêt précité 4A_643/2020 consid. 4.2.2 et 4.2.3 [2°-3°]). La Chambre patrimoniale (et à sa suite l'autorité d'appel) a donc ici décoché un moyen superfétatoire.
Dans le cadre de l'interprétation subjective, les juges vaudois ont noté qu'à aucun moment, les représentants des parties ( i.e Z._ et A._) n'avaient évoqué une quelconque rémunération. Il n'était pas non plus avéré que les décomptes provisoires établis par la recourante les 31 décembre 2014, 30 juin 2015 et 29 février 2016 auraient fait état de commissions. La recourante avait attendu les 22 et 29 septembre 2016 pour revendiquer ces commissions (soit près de quatre ans après la conclusion du bail), ce qui avait suscité l'immédiate opposition de la partie adverse.
5.2. La recourante méconnaît apparemment les circonstances imposant d'appliquer l'interprétation objective. Elle semble adopter la prémisse que cette méthode prédominerait lorsqu'il faut rechercher si un contrat a été passé par actes concluants. Un tel postulat se révèle erroné (cf. supra consid. 3 et au surplus les arrêts 5A_881/2018 du 19 juin 2019 consid. 3.1.2.1 et 4A_421/2020 du 26 février 2021 consid. 3.1 i.f.). Le recours à l'interprétation objective présuppose que la volonté réelle des parties ne puisse pas être établie, ou qu'il existe un désaccord latent (consid. 3 et 5.1 supra); en ce cas, le justiciable qui s'accommode du constat selon lequel la volonté subjective n'est pas discernable peut se contenter d'attaquer l'interprétation objective (cf. par ex. arrêt 4A_307/2018 du 10 octobre 2018 consid. 5.1.4, 1ère phrase, cité par la recourante). On se trouve ici sous une autre constellation: la théorie de la confiance a été appliquée à titre superfétatoire, en sus de la constatation factuelle que les parties ne voulaient pas prévoir une rémunération. Aussi la recourante devait-elle attaquer ce constat en s'attelant à en démontrer l'arbitraire - ce qu'elle a omis de faire. Au demeurant, elle ne conteste pas s'être occupée de l'entier de la construction du projet immobilier et s'être particulièrement impliquée dans celui-ci - circonstance dont on pouvait inférer sans violer le droit fédéral que la sollicitation de certains conseils par Z._ SA pouvait ne pas découler d'un contrat de courtage (arrêt p. 25 § 1). La recourante ne discute pas davantage le constat selon lequel la vente de locaux à F._ lui a permis de décrocher une affaire rentable, ce qui peut aussi contribuer à infléchir sans arbitraire la thèse d'une intervention à titre onéreux.
Faute de grief, il n'y a pas à rediscuter l'appréciation portée par les instances vaudoises, qui n'a au demeurant rien d'insoutenable. Il faut concéder qu'avant la facture finale du 29 septembre 2016, l'entrepreneuse avait déjà articulé des prétentions en paiement de commissions dans deux missives des 22 août et 22 septembre 2016. Par ailleurs, entre le 4 juin 2015 et le 2 septembre 2016, elle avait versé trois acomptes (totalisant 1'870'370 fr.) en prévision d'un coût final inférieur au prix plafond adapté. Il s'est toutefois avéré qu'il lui restait encore à payer 2'462'832 fr. Qu'elle ait subitement prétendu dans ce contexte avoir droit à des commissions ne peut être le fruit du hasard.
A défaut d'avoir prouvé un accord de fait quant au caractère onéreux de ses interventions dans les négociations, la recourante ne saurait prétendre à des commissions.
5.3. La Chambre patrimoniale, toujours suivie par la Cour d'appel, a aussi nié une volonté réelle et commune de confier à l'entrepreneuse la conduite des négociations du bail et de la vente immobilière. Sous l'empire de la même méprise, l'intéressée omet d'attaquer cette constatation factuelle et ne soulève pas un grief d'arbitraire. Tout au plus remet-elle en cause certains faits ayant contribué à constater l'inexistence d'un accord de fait, subsidiairement d'un accord de droit: elle conteste d'une part que la présence de son représentant (A._) à la séance du 26 septembre 2012 avec E._ était justifiée par la nécessité de discuter certains aspects techniques; elle nie d'autre part que le prix de vente concernant la transaction avec F._ ait été discuté rapidement et sans âpres négociations lors de la séance du 1er septembre 2014, en pointant le fait que le prix n'aurait été négocié et discuté qu'à ce moment-là, hors la présence de Z._.
Concernant ces points précis, la recourante tente tout au plus d'imposer une appréciation divergente des déclarations et attitudes adoptées (qui ont été dûment prises en compte par la cour de céans, quand bien même elles ont été ici présentées en un succinct résumé), sans parvenir à insuffler un sentiment d'arbitraire. Elle échoue notamment à convaincre que les juges d'appel auraient négligé des éléments de preuves importants ou en auraient tiré des conclusions insoutenables (sur la notion d'arbitraire dans l'appréciation des preuves, cf. par ex. <ref-ruling> consid. 4.2 p. 234; <ref-ruling> consid. 4.2). Qui plus est, ses critiques sont insuffisantes puisqu'elles ne ciblent pas le constat central selon lequel ni l'une ni l'autre partie n'avait l'intention de confier à l'entrepreneuse la conduite des négociations avec E._ et F._.
Il peut être renvoyé au surplus à l'analyse effectuée dans les deux jugements vaudois, qui se révèle circonstanciée et convaincante.
6.
En définitive, le recours est manifestement mal fondé (<ref-law>) et doit être rejeté aux frais de son auteur (<ref-law>), qui versera des dépens à son adverse partie pour ses frais d'avocat (art. 68 al. 1 et 2 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 19'000 fr., sont mis à la charge de la recourante.
3.
La recourante versera à l'intimée une indemnité de 21'000 fr. à titre de dépens.
4.
Le présent arrêt est communiqué aux parties ainsi qu'au Tribunal cantonal du canton de Vaud.
Lausanne, le 9 novembre 2021
Au nom de la I re Cour de droit civil
du Tribunal fédéral suisse
La Présidente : Hohl
La Greffière : Monti