Faits : A. A.a. A._ a effectué un apprentissage d'employée de commerce et travaillé au service de B._ entre 1979 et 1984. Après avoir réintégré cette entreprise en septembre 1989, elle a occupé dès juillet 2001 le poste de secrétaire du directeur général de la division "gestion privée et institutionnelle"; elle a été nommée mandataire commerciale. Plusieurs certificats de travail intermédiaires attestent de son professionnalisme et de ses excellentes compétences linguistiques et rédactionnelles en français et en espagnol. A.b. Un nouveau directeur général dénommé C._ est arrivé à la tête de la division précitée. Celui-ci et l'employée ont rapidement connu des problèmes relationnels. Le directeur était très difficile à cerner et imprévisible; il pouvait se montrer très agressif. Il éprouvait une antipathie naturelle à l'égard de l'employée. Le directeur sollicitait sa secrétaire pour des tâches concernant sa vie privée, ses vacances, voire les affaires de son épouse. Il a en particulier demandé à l'employée de lui procurer les coordonnées de certains clients pour son épouse. Une directive interne proscrivait la transmission d'informations à des tiers. Après avoir consulté le service de compliance, l'employée a transmis ces données au directeur le 13 février 2006, en attirant son attention sur leur caractère hautement confidentiel et en lui suggérant d'en parler avec le service concerné avant toute utilisation par son épouse. Le directeur l'a remerciée en précisant que son initiative était bien appréciée. Il n'est pas prouvé que la situation se soit largement détériorée après cet épisode; les relations étaient déjà tendues avant (cf. au surplus infra, consid. 2.3.2). A.c. Le 19 juillet 2006, le directeur général a informé l'employée qu'il n'était plus possible de collaborer pour des raisons d'incompatibilité personnelle. Il l'a invitée à chercher toute opportunité de replacement interne ou externe jusqu'au 30 septembre 2006, date à laquelle il résilierait son contrat de travail si aucune solution n'avait pu être trouvée. Le comportement général du directeur a eu des incidences sur la santé de l'employée. Le 31 août 2006, le Dr E._, spécialiste en médecine interne FMH, a établi le certificat médical suivant: (...) Mme A._ (...) est en traitement sur consultation depuis janvier 2006. Mme A._ m'a consulté en raison de maux de tête quotidiens. Les investigations ont mis en évidence une hypertension artérielle, des dorsalgies récidivantes et un état anxieux à composante dépressive. Sous le traitement médicamenteux, la tension artérielle se normalise progressivement. Les maux de tête et les douleurs de dos ont nécessité un traitement anti-inflammatoire et un traitement physiothérapeutique. Mes entretiens avec Mme A._ et mes investigations m'ont convaincu que les affections évoquées sont en rapport direct avec les conditions sur le lieu de travail." Lors d'une sortie organisée par l'entreprise au printemps 2006, l'employée avait craqué devant son amie; en pleurs, elle lui avait expliqué qu'elle n'en pouvait plus. Entendue comme témoin, l'amie a résumé l'épisode en disant que l'employée avait "pété les plombs", bien qu'étant plutôt une personne forte. A.d. A compter du 1 er novembre 2006, l'employée a travaillé comme conseillère en promotion dans un autre service de l'entreprise dirigé par D._. Elle bénéficiait du même salaire et des mêmes conditions de travail qu'auparavant. Les relations entre l'employée et son nouveau supérieur hiérarchique se sont rapidement détériorées. Il pouvait se montrer un peu froid et assez cassant avec elle, lui adressant la parole avec parcimonie. Toutefois, il se montrait aussi désagréable avec d'autres personnes et n'était pas plus froid avec l'employée qu'avec d'autres collègues. Il était lunatique envers toute l'équipe. D._ parlait en suisse-allemand avec des collègues sur des sujets professionnels en présence de l'employée, bien qu'elle ne comprenne pas cette langue (cf. au surplus infra, consid. 2.4.2). A une occasion, alors qu'il discutait de l'employée avec le collaborateur F._, D._ a mimé deux gifles successives en disant: "elle a eu ça et maintenant elle aura le retour". Cette attitude a choqué le collaborateur, qui a pensé qu'il s'agissait d'un couperet; il sentait l'employée très déstabilisée depuis un certain temps. Il a expliqué le problème relationnel entre ces deux personnes par une divergence de personnalités; selon lui, il y avait d'un côté la froideur anglo-saxonne et de l'autre, le feu du sud. A l'occasion d'une enquête interne anonyme, D._ a été très mal noté par ses collaborateurs. A.e. A la fin de l'année 2009, l'entreprise a décidé de promouvoir ses activités de vente hors du canton. Un office de représentation a été ouvert à Zurich et une unité de support créée à Lausanne. Cette nouvelle organisation a nécessité une adaptation de la fonction de conseiller en promotion, avec des exigences nettement supérieures. Etaient notamment requis un titre universitaire ou équivalent, une maîtrise avancée de l'anglais et/ou de l'allemand ainsi que d'excellentes connaissances économiques et financières. L'employée ne répondait pas à ces exigences. Le 16 février 2010, D._ a confirmé par écrit à l'employée que la fonction qu'elle occupait serait supprimée le 30 octobre 2010. Il lui "proposait" un délai de 4 mois pour explorer toutes les possibilités de repositionnement dans l'entreprise. Le 16 mars 2010, l'employée a saisi la cellule de médiation de l'entreprise destinée aux personnes s'estimant victimes de harcèlement psychologique (mobbing). Elle a eu une entrevue le lendemain. Une séance de confrontation a eu lieu le 25 mars 2010. L'employée a renoncé à deux postes d'assistante. Après avoir passé une journée dans un groupe s'occupant de prévoyance professionnelle, elle a manifesté son intérêt pour cette activité, mais sa candidature n'a pas été retenue au motif notamment qu'elle manquait de connaissances dans le domaine; de surcroît, elle s'était présentée en retard à un entretien, en ayant prévenu de son arrivée tardive, mais sans spécialement présenter d'excuses. En juin 2010, l'employée a informé l'entreprise de sa prochaine hospitalisation en vue d'une opération. Elle a ensuite été en incapacité de travail à 100 % jusqu'au 1 er décembre 2010, sans qu'il soit possible de déterminer le début de cette incapacité (25 août 2010 selon l'employée, 5 octobre 2010 selon l'employeuse). Le 9 décembre 2010, l'employeuse a résilié le contrat de travail pour le 30 juin 2011. L'employée a fait opposition par courrier du 17 décembre 2010. Le Dr E._ a attesté que l'employée était en incapacité de travail à 100 % pour cause de maladie entre le 10 février et le 31 août 2011. En conséquence, le congé a été reporté au 31 décembre 2011. Le 15 février 2011, l'employée a été libérée de son obligation de travailler avec effet immédiat, afin qu'elle puisse se consacrer à ses recherches d'emploi. B. B.a. L'employée a saisi l'autorité de conciliation le 10 août 2011, puis a porté l'action devant le Tribunal civil de l'arrondissement de Lausanne; elle concluait au paiement de 67'027 fr. 50, comprenant une indemnité de six mois de salaire pour licenciement abusif (47'027 fr. 50) et un complément de 20'000 fr. pour tort moral. Elle exigeait en outre la délivrance d'un certificat de travail. Par jugement du 14 août 2013, le Tribunal civil a admis l'action à concurrence de 20'000 fr. et astreint l'employeuse à délivrer un certificat de travail dont le contenu était défini au chiffre II du dispositif. En substance, le tribunal a constaté que l'employeuse avait licencié la demanderesse parce que son poste était supprimé, non sans lui avoir proposé de la replacer dans d'autres secteurs de l'entreprise; la preuve du caractère abusif du licenciement n'était pas rapportée. Une indemnité à ce titre était exclue (art. 336a CO). En revanche, l'employée avait subi un harcèlement moral pendant plus de quatre ans. En conséquence, elle avait droit à une indemnité de 20'000 fr. (art. 328 CO en liaison avec l'art. 49 CO). B.b. Les deux parties ont saisi la Cour d'appel civile du Tribunal cantonal vaudois. L'employeuse a conclu à ce qu'elle soit libérée de tout paiement. Dans son appel joint, l'employée a requis le paiement de 67'027 fr. 50. Les parties n'ont pas remis en cause le chiffre II du dispositif ayant trait à la délivrance et au contenu du certificat de travail. Le 4 septembre 2014, le Tribunal cantonal a réformé la décision attaquée en rejetant entièrement les prétentions en paiement formées par l'employée. C. L'employée saisit le Tribunal fédéral d'un recours en matière civile dans lequel elle conclut derechef au paiement de 67'027 fr. 50. L'employeuse conclut au rejet du recours. L'autorité précédente se réfère à son arrêt.