Skip to main content
Glama
lead_nurturer.cpython-311.pyc22.1 kB
� u�hx:��J�dZddlZddlZddlZddlZddlZddlmZmZddlm Z m Z m Z ddl m Z ddlmZddlZddlmZddlmZdd lmZdd lmZdd lmZe Gd �d ����ZGd�d��Zedkr$ddlZe��Ze���dSdS)zw Advanced Lead Nurturing System for Gmail CSV Sender Handles automated follow-ups, response tracking, and lead scoring �N)�datetime� timedelta)�Dict�List�Optional)� dataclass)� EmailMessage)� Credentials)�build)�InstalledAppFlow)�Request)�Templatec��eZdZUeed<eed<eed<dZeed<dZeeed<dZ e ed <dZ e ed <dZ e ed <d Z eed <dS)�Lead�email� first_name�company�new�statusN� last_contactr�response_count�follow_up_count� lead_score��notes)�__name__� __module__� __qualname__�str�__annotations__rrrrr�intrrr���lead_nurturer.pyrrs�������� �J�J�J��O�O�O� �L�L�L��F�C����'+�L�(�8�$�+�+�+��N�C�����O�S�����J������E�3�O�O�O�O�Or#rc���eZdZddedefd�Zdedefd�Zdeeeffd�Zd �Z deee ffd �Z d �Z d ed ede fd�Zde defd�Zd edefd�Zd�Zd edefd�Zd�Zd�ZdS)� LeadNurturer�credentials.json� token.json�credentials_path� token_pathc��|�||��|_|���|_|���|_dS�N)� _get_service�service� _load_leads�leads�_load_templates� templates)�selfr)r*s r$�__init__zLeadNurturer.__init__%sD���(�(�)9�:�F�F�� ��%�%�'�'�� ��-�-�/�/����r#c��ddg}d}tj�|��rtj||��}|r|js�|r0|jr)|jr"|�t����n+tj ||��}|� d���}t|d��5}|�|�����ddd��n #1swxYwYt!dd|� ��S) zInitialize Gmail servicez.https://www.googleapis.com/auth/gmail.readonlyz*https://www.googleapis.com/auth/gmail.sendNr)�port�w�gmail�v1)� credentials)�os�path�existsr �from_authorized_user_file�valid�expired� refresh_token�refreshr r �from_client_secrets_file�run_local_server�open�write�to_jsonr )r3r)r*�SCOPES�creds�flow�tokens r$r-zLeadNurturer._get_service*sA��B�=�?���� �7�>�>�*� %� %� N��9�*�f�M�M�E�� -�E�K� -�� 6��� 6�5�+>� 6�� � �g�i�i�(�(�(�(�'�@�AQ�SY�Z�Z���-�-�1�-�5�5���j�#�&�&� -�%�� � �E�M�M�O�O�,�,�,� -� -� -� -� -� -� -� -� -� -� -���� -� -� -� -��W�d��6�6�6�6s�1(C%�%C)�,C)�returnc�(�i} tddd���5}tj|��}|D]O}|d������}t ||d|d���||<�P d d d ��n #1swxYwYn#t $rtd ��YnwxYw td d��5}tj |��}|� ��D]�\}}||vr�|� d d ��||_ |� d��rtj|d��nd ||_|� dd��||_|� dd��||_|� dd��||_|� dd��||_�� d d d ��n #1swxYwYn#t $rtd��YnwxYw|S)z%Load leads from CSV and tracking filez contacts.csv�r�utf-8)�encoding�torr)rrrNzcontacts.csv not found�lead_tracking.jsonrrrrrrrrrzNo existing tracking data found)rE�csv� DictReader�strip�lowerr�FileNotFoundError�print�json�load�items�getrr� fromisoformatrrrrr)r3r0�f�reader�rowr� tracking_data�datas r$r/zLeadNurturer._load_leads>s����� ,��n�c�G�<�<�<� �����*�*��!���C���I�O�O�-�-�3�3�5�5�E�#'�#�#&�|�#4� #�I��$�$�$�E�%�L�L�� � � � � � � � � � � ���� � � � ���!� ,� ,� ,� �*� +� +� +� +� +� ,���� 5��*�C�0�0� C�A� $� �!� � � �#0�#6�#6�#8�#8�C�C�K�E�4���~�~�.2�h�h�x��.G�.G��e� �+�dh�dl�dl�m{�d|�d|�5G�H�4J�4�P^�K_�4`�4`�4`�CG��e� �1�6:�h�h�?O�QR�6S�6S��e� �3�7;�x�x�@Q�ST�7U�7U��e� �4�26�(�(�<��2K�2K��e� �/�-1�X�X�g�r�-B�-B��e� �*��C� C� C� C� C� C� C� C� C� C� C� C���� C� C� C� C���!� 5� 5� 5� �3� 4� 4� 4� 4� 4� 5����� sl�B�A'B �> B� B�B�B�B�B2�1B2�6G3�DG'� G3�'G+�+G3�.G+�/G3�3H�Hc�R�i}|j���D]J\}}|j|jr|j���nd|j|j|j|jd�||<�Ktdd��5}tj ||d���ddd��dS#1swxYwYdS)zSave lead tracking dataN)rrrrrrrRr7�)�indent) r0r[rr� isoformatrrrrrErY�dump)r3rar�leadr^s r$� _save_leadszLeadNurturer._save_leadsas��� ��:�+�+�-�-� � �K�E�4��+�AE�AR� \�� 1� ;� ;� =� =� =�X\�"&�"5�#'�#7�"�o��� $�$�M�%� � ��&�� ,� ,� 2�� �I�m�Q�q� 1� 1� 1� 1� 2� 2� 2� 2� 2� 2� 2� 2� 2� 2� 2� 2���� 2� 2� 2� 2� 2� 2s�7B�B �#B c�*�i}td�����|d<td�����|d<td�����|d<td�����|d<|S) z,Load email templates for different scenariosu� Hi {{first_name}}, Did you know many dental practices lose 20–30% of new patient inquiries because follow-ups slip through the cracks? We've built an AI agent that automatically follows up with every lead via SMS/email and books them straight into your calendar. Clients typically see 5–9 extra appointments in the first 30 days. Have time for 10-min demo call this week? Thank you, Brandon Quantra Labs �initiala& Hi {{first_name}}, Following up on my message about our AI lead follow-up system for dental practices. I know you're busy, but this could be a game-changer for {{company}}. Quick question: What's your biggest challenge with patient follow-ups right now? Best, Brandon Quantra Labs � followup_1a� Hi {{first_name}}, I understand you might not be ready to discuss this right now. Just wanted to share that Dr. Sarah Johnson at Smile Care Clinic increased her new patient bookings by 40% in the first month using our system. If you're interested in a quick 5-minute demo, just reply with "demo" and I'll send you a calendar link. No pressure - I'll stop following up after this. Best, Brandon Quantra Labs � followup_2a Hi {{first_name}}, Great to hear from you! I'd love to show you how our AI system works. Here's a quick calendar link to book a 10-minute demo: [Calendar Link] Looking forward to showing you how this can help {{company}} capture more patients. Best, Brandon Quantra Labs � interested)rrU)r3r2s r$r1zLeadNurturer._load_templatesqs���� � (�) � �E�G�G� � � �)��"#+� , � �E�G�G� #� #� �,��#+�, � �E�G�G�#�#� �,��"#+�, � �E�G�G�#�#� �,�� �r#c�t� d}|j�������d|������}|�dg��}|D�]}|j�������d|d������}|d�dg��}d }d }|D]+} | d d kr | d }�| d d kr| d }�,|rst jd|��} | r(| �d��� ��} n|� ��} | |j vr|� | ||���� d S#t$r} td| ����Yd } ~ d Sd } ~ wwxYw)z)Check Gmail for responses to our outreachzin:inbox newer_than:1d�me)�userId�q�messages�id)rqrt�payload�headersN�name�From�value�Subjectz<(.+?)>�zError checking responses: )r.�usersrs�list�executer\�re�search�grouprVr0�_process_response� ExceptionrX) r3�query�resultsrs�message�msgrv�sender�subject�header� sender_email�es r$�check_for_responsesz LeadNurturer.check_for_responses�s��� 4�,�E��l�(�(�*�*�3�3�5�5�:�:�$�%�:�P�P�X�X�Z�Z�G��{�{�:�r�2�2�H�#� K� K���l�(�(�*�*�3�3�5�5�9�9��'�RV�-�9�X�X�`�`�b�b���i�.�,�,�Y��;�;������%�2�2�F��f�~��/�/�!'��������9�4�4�"(��/���� K�#%�9�Z��#@�#@�L�#�6�'3�'9�'9�!�'<�'<�'B�'B�'D�'D� � �'-�|�|�~�~� �$�t�z�1�1��.�.�|�W�c�J�J�J��- K� K��0� 4� 4� 4� �2�q�2�2� 3� 3� 3� 3� 3� 3� 3� 3� 3����� 4���s�F F� F7�F2�2F7rr�r�c���|j|}|xjdz c_tj��|_|�|��}|����t�fd�dD����r.d|_|xj dz c_ |� |d��nCt�fd�dD����rd|_|xj d zc_ n|xj d z c_ |xj d tj��� d ���d |��z c_ td|j�d|j����dS)zProcess a response from a leadr{c3� �K�|]}|�vV�� dSr,r"��.0�word�response_lowers �r$� <genexpr>z1LeadNurturer._process_response.<locals>.<genexpr>�s(�����c�c�$�t�~�%�c�c�c�c�c�cr#)rn�yes�demo�call�meetingrn� c3� �K�|]}|�vV�� dSr,r"r�s �r$r�z1LeadNurturer._process_response.<locals>.<genexpr>�s(�����k�k�D���'�k�k�k�k�k�kr#)znot interestedz no thanks�stop� unsubscribe�not_interested�rd� z%Y-%m-%dz: Response received - zProcessed response from � at N)r0rr�nowr�_get_message_bodyrV�anyrr�_send_automated_responser�strftimerXrr)r3rr�r�rh�bodyr�s @r$r�zLeadNurturer._process_response�s[����z�%� �� ���q� ���$�L�N�N����%�%�g�.�.�������� �c�c�c�c�2b�c�c�c� c� c� !�&�D�K� �O�O�r� !�O�O� � )� )�%�� >� >� >� >� �k�k�k�k�4j�k�k�k� k� k� !�*�D�K� �O�O�q� �O�O�O� �O�O�q� �O�O� � � �_�8�<�>�>�2�2�:�>�>�_�_�V]�_�_�_� � � �L���L�L�d�l�L�L�M�M�M�M�Mr#c�� |d}d|vrO|dD]E}|ddkr7|dd}tj|���d��cS�FnA|ddkr5|dd}tj|���d��Sn)#t$r}t d|����Yd }~nd }~wwxYwd S) z'Extract message body from Gmail messageru�parts�mimeTypez text/plainr�rbrOzError extracting message body: Nr)�base64�urlsafe_b64decode�decoder�rX)r3r�ru�partrbr�s r$r�zLeadNurturer._get_message_body�s �� 9��i�(�G��'�!�!�#�G�,�N�N�D��J�'�<�7�7�#�F�|�F�3��%�7��=�=�D�D�W�M�M�M�M�M�8�N� �:�&�,�6�6�"�6�?�6�2�D�!�3�D�9�9�@�@��I�I�I���� 9� 9� 9� �7�A�7�7� 8� 8� 8� 8� 8� 8� 8� 8����� 9�����rs�AB�AB� C�)C�C� template_typec��|j|}|j|}d}|�|j|j���} t ��}||d<d|d<||d<|�|��tj|� ����� ��}|j � ��� ���dd|i� �����t!d |�d |j����d S#t"$r} t!d | ����Yd } ~ d Sd } ~ wwxYw)z.Send automated response based on template typez1Re: AI Lead Follow-up System for Dental Practices�rr�To�brandon@quantralabs.comrxrzrp�raw�rqr��Sent z response to zError sending response: N�r0r2�renderrrr � set_contentr��urlsafe_b64encode�as_bytesr�r.r|rs�sendr~rXr�� r3rr�rh�templater�r�r��encodedr�s r$r�z%LeadNurturer._send_automated_responsesY���z�%� ���>�-�0��E��������L�� � ��  2��.�.�C��C��I�3�C��K�$�C� �N� �O�O�D� !� !� !��.�s�|�|�~�~�>�>�E�E�G�G�G� �L� � � � � )� )� +� +� 0� 0���W�%� 1� � ��g�i�i�i� �G�-�G�G�d�o�G�G� H� H� H� H� H��� 2� 2� 2� �0�Q�0�0� 1� 1� 1� 1� 1� 1� 1� 1� 1����� 2���s�CD� E�#D;�;Ec��tj��}|j���D]�\}}|jdvr�|jr�||jz j}|dkr0|jdkr%|�|d��d|_||_�Z|dkr6|jdkr+|�|d��d|_||_d |_��d S) z-Run follow-up sequence for leads that need it)r� contacted�rrlr{�rmrdr�N) rr�r0r[rr�daysr�_send_follow_up)r3r�rrh�days_since_contacts r$�run_follow_up_sequencez#LeadNurturer.run_follow_up_sequence$s����l�n�n���:�+�+�-�-� 3� 3�K�E�4��{�2�2�2�t�7H�2�&)�D�,=�&=�%C�"�&��*�*�t�/C�q�/H�/H��(�(�� �=�=�=�+,�D�(�(+�D�%�%�(�1�,�,��1E��1J�1J��(�(�� �=�=�=�+,�D�(�(+�D�%�"2�D�K�� 3� 3r#c��|j|}|j|}d}|�|j|j���} t ��}||d<d|d<||d<|�|��tj|� ����� ��}|j � ��� ���dd|i� �����t!d |�d |j�d |j����dS#t"$r} t!d | ����Yd} ~ dSd} ~ wwxYw)zSend follow-up emailz'Following up - AI Lead Follow-up Systemr�r�r�rxrzrpr�r�r�z to r�zError sending follow-up: Nr�r�s r$r�zLeadNurturer._send_follow_up9sc���z�%� ���>�-�0��;��������L�� � ��  3��.�.�C��C��I�3�C��K�$�C� �N� �O�O�D� !� !� !��.�s�|�|�~�~�>�>�E�E�G�G�G� �L� � � � � )� )� +� +� 0� 0���W�%� 1� � ��g�i�i�i� �P�-�P�P�T�_�P�P�$�,�P�P� Q� Q� Q� Q� Q��� 3� 3� 3� �1�a�1�1� 2� 2� 2� 2� 2� 2� 2� 2� 2����� 3���s�C D!�! E�+E�Ec �^�t|j��}td�|j���D����}td�|j���D����}td�|j���D����}t d��t d|����t d|����t d|����t d|����t |d kr d ||z d zd �d �nd��t |d kr d||z d zd �d �nd��t |j���d�d���dd�}t d��|D])}t d|j�d|j�d|j�����*dS)z Generate a lead nurturing reportc3�0K�|]}|jdk� dV��dS)rr{N�r�r�rhs r$r�z4LeadNurturer.generate_lead_report.<locals>.<genexpr>Xs.����R�R�d�T�[�E�=Q�=Q��=Q�=Q�=Q�=Q�R�Rr#c3�0K�|]}|jdk� dV��dS)rr{N)rr�s r$r�z4LeadNurturer.generate_lead_report.<locals>.<genexpr>Ys0����U�U�d�T�=P�ST�=T�=T��=T�=T�=T�=T�U�Ur#c3�0K�|]}|jdk� dV��dS)rnr{Nr�r�s r$r�z4LeadNurturer.generate_lead_report.<locals>.<genexpr>Zs.����Z�Z�t�d�k�\�>Y�>Y��>Y�>Y�>Y�>Y�Z�Zr#u 📊 LEAD NURTURING REPORTz Total Leads: z Contacted: z Responded: z Interested: rzResponse Rate: �dz.1f�%zResponse Rate: 0%zInterest Rate: zInterest Rate: 0%c��|jSr,)r)�xs r$�<lambda>z3LeadNurturer.generate_lead_report.<locals>.<lambda>es��a�l�r#T)�key�reverseNr�u 🏆 TOP LEADS BY SCORE:z r�z - Score: ) �lenr0�sum�valuesrX�sortedrrr)r3� total_leadsr�� respondedrn� top_leadsrhs r$�generate_lead_reportz!LeadNurturer.generate_lead_reportUs����$�*�o�o� ��R�R�d�j�&7�&7�&9�&9�R�R�R�R�R� ��U�U�d�j�&7�&7�&9�&9�U�U�U�U�U� ��Z�Z�t�z�'8�'8�':�':�Z�Z�Z�Z�Z� � �-�.�.�.� �+�k�+�+�,�,�,� �'�I�'�'�(�(�(� �'�I�'�'�(�(�(� �)�Z�)�)�*�*�*� �I�PQ�M�M�@��9�!4�S�!8�@�@�@�@�@�Wj�k�k�k� �Y�QR�]�]�A��I�!5�c�!9�A�A�A�A�A�Xk�l�l�l��4�:�,�,�.�.�4J�4J�TX�Y�Y�Y�Z\�[\�Z\�]� � �+�,�,�,�� W� W�D� �U�t��U�U�D�L�U�U�D�O�U�U� V� V� V� V� W� Wr#c��td��td��|���td��|���|���|���td��dS)z Run the complete nurturing cycleu%🔄 Starting lead nurturing cycle...u📧 Checking for responses...u"📤 Running follow-up sequence...u✅ Nurturing cycle complete!N)rXr�r�rir�)r3s r$�run_nurturing_cyclez LeadNurturer.run_nurturing_cyclejs��� �5�6�6�6� �.�/�/�/� � � �"�"�"� �2�3�3�3� �#�#�%�%�%� ������ �!�!�#�#�#� �-�.�.�.�.�.r#N)r'r()rrrrr4r-rrr/rirr1r��dictr�r�r�r�r�r�r�r"r#r$r&r&$s�������0�0��0�s�0�0�0�0� 7�S�7�c�7�7�7�7�(!�T�#�t�)�_�!�!�!�!�F2�2�2� F��c�8�m�!4�F�F�F�F�P!4�!4�!4�FN�s�N�S�N�4�N�N�N�N�4���#�����"2�c�2�#�2�2�2�2�:3�3�3�*3�S�3��3�3�3�3�8W�W�W�*/�/�/�/�/r#r&�__main__) �__doc__rSrYr;�timerrr�typingrrr� dataclassesr� email.messager r��google.oauth2.credentialsr �googleapiclient.discoveryr �google_auth_oauthlib.flowr �google.auth.transport.requestsr �jinja2rrr&r�nurturerr�r"r#r$�<module>r�s�����  � � � � � � � � � � � � � � � � � � � �(�(�(�(�(�(�(�(�'�'�'�'�'�'�'�'�'�'�!�!�!�!�!�!�&�&�&�&�&�&� � � � �1�1�1�1�1�1�+�+�+�+�+�+�6�6�6�6�6�6�2�2�2�2�2�2������� � � � � � � � � �� �X/�X/�X/�X/�X/�X/�X/�X/�t  �z��� �I�I�I��|�~�~�H� � � �"�"�"�"�"� �r#

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/brandononchain/GMAIL-MCP-Agent'

If you have feedback or need assistance with the MCP directory API, please join our Discord server