From 528a9c9c6b33404a5525534d92cae2cc5d67e473 Mon Sep 17 00:00:00 2001 From: Sean Colsen Date: Fri, 16 Feb 2024 12:08:10 -0500 Subject: [PATCH] Add mock CRM data --- .gitignore | 1 + crm/README.md | 28 + crm/generate.py | 126 ++++ crm/generated_data.sql | 279 ++++++++ crm/source_data/contacts.json | 1006 +++++++++++++++++++++++++++++ crm/source_data/interactions/1.md | 67 ++ crm/source_data/interactions/2.md | 37 ++ crm/source_data/interactions/3.md | 47 ++ crm/source_data/interactions/4.md | 72 +++ crm/source_data/interactions/5.md | 35 + crm/source_data/interactions/6.md | 107 +++ crm/source_data/template.sql | 95 +++ 12 files changed, 1900 insertions(+) create mode 100644 crm/README.md create mode 100755 crm/generate.py create mode 100644 crm/generated_data.sql create mode 100644 crm/source_data/contacts.json create mode 100644 crm/source_data/interactions/1.md create mode 100644 crm/source_data/interactions/2.md create mode 100644 crm/source_data/interactions/3.md create mode 100644 crm/source_data/interactions/4.md create mode 100644 crm/source_data/interactions/5.md create mode 100644 crm/source_data/interactions/6.md create mode 100644 crm/source_data/template.sql diff --git a/.gitignore b/.gitignore index 2fc2757..9ac1a69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *venv* *.ipynb_checkpoints* +.vscode \ No newline at end of file diff --git a/crm/README.md b/crm/README.md new file mode 100644 index 0000000..ad55d70 --- /dev/null +++ b/crm/README.md @@ -0,0 +1,28 @@ +# CRM sample data + +This sample data is designed to work like Mathesar's internal CRM + +## Usage + +## Loading data + +The CRM sample data is in `generated_data.sql`. + +Load it into your local Mathesar development environment like so: + +``` +docker exec -i mathesar_dev_db bash -c 'psql -U mathesar' < generated_data.sql +``` + +## Modifying and re-generating the data + +1. Make adjustments as necessary in `source_Data`. Data in here is generated with a mix if manual grunt work, LLM wizardry, and text-based massaging. + +1. Run the script: + + ``` + ./generate.py + ``` + + This regenerates the `generated_data.sql` file from the source data. + diff --git a/crm/generate.py b/crm/generate.py new file mode 100755 index 0000000..0cf21dc --- /dev/null +++ b/crm/generate.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 + +import json +import yaml +import os +import csv +import io + +SOURCE_DATA_PATH = "source_data" +CONTACTS_PATH = os.path.join(SOURCE_DATA_PATH, "contacts.json") +INTERACTIONS_PATH = os.path.join(SOURCE_DATA_PATH, "interactions") +TEMPLATE_PATH = os.path.join(SOURCE_DATA_PATH, "template.sql") +OUTPUT_PATH = "generated_data.sql" + + +def read_file(file): + with open(file, "r") as f: + return f.read() + + +def parse_markdown(content): + if not content.startswith("---"): + return {"frontmatter": {}, "content": content} + _, frontmatter, content = content.split("---", 2) + return {"frontmatter": yaml.safe_load(frontmatter), "content": content.strip()} + + +def clean_cell(cell): + if cell is None: + return r"\N" + if isinstance(cell, str): + return cell.replace("\n", r"\n") + return cell + + +def tsv(rows): + csv_data = io.StringIO() + writer = csv.writer(csv_data, delimiter="\t", lineterminator="\n") + cleaned_rows = [[clean_cell(cell) for cell in row] for row in rows] + writer.writerows(cleaned_rows) + return csv_data.getvalue().strip() + + +contacts = json.loads(read_file(CONTACTS_PATH)) +website_types = {w["type"] for c in contacts for w in c["websites"]} +website_ids = {type: id for id, type in enumerate(website_types, start=1)} +tags = {t for c in contacts for t in c["tags"]} +tag_ids = {tag: id for id, tag in enumerate(tags, start=1)} + + +def get_contact_rows(): + for contact in contacts: + yield [ + contact["id"], + contact["full_name"], + contact["informal_name"], + contact["notes"], + ] + + +def get_email_rows(): + id = 0 + for contact in contacts: + is_primary = True + for email in contact["emails"]: + id += 1 + yield [id, contact["id"], email["address"], is_primary, email["source"]] + is_primary = False + + +def get_website_type_rows(): + for type, id in website_ids.items(): + yield [id, type] + + +def get_website_rows(): + id = 0 + for contact in contacts: + for website in contact["websites"]: + id += 1 + type_id = website_ids[website["type"]] + yield [id, contact["id"], website["url"], type_id] + + +def get_interaction_rows(): + for id, filename in enumerate(os.listdir(INTERACTIONS_PATH), start=1): + if not filename.endswith(".md"): + continue + path = os.path.join(INTERACTIONS_PATH, filename) + interaction = parse_markdown(read_file(path)) + yield [ + id, + interaction["frontmatter"]["contact"], + interaction["frontmatter"]["date"], + interaction["frontmatter"]["subject"], + interaction["content"], + ] + + +def get_tag_rows(): + for tag, id in tag_ids.items(): + yield [id, tag] + + +def get_contact_tag_rows(): + id = 0 + for contact in contacts: + for tag in contact["tags"]: + id += 1 + yield [id, contact["id"], tag_ids[tag]] + + +sql = ( + read_file(TEMPLATE_PATH) + .replace("__CONTACT_TSV_DATA__", tsv(get_contact_rows())) + .replace("__EMAIL_TSV_DATA__", tsv(get_email_rows())) + .replace("__WEBSITE_TYPE_TSV_DATA__", tsv(get_website_type_rows())) + .replace("__WEBSITE_TSV_DATA__", tsv(get_website_rows())) + .replace("__INTERACTION_TSV_DATA__", tsv(get_interaction_rows())) + .replace("__TAG_TSV_DATA__", tsv(get_tag_rows())) + .replace("__CONTACT_TAG_TSV_DATA__", tsv(get_contact_tag_rows())) +) + + +with open(OUTPUT_PATH, "w") as f: + f.write(sql) diff --git a/crm/generated_data.sql b/crm/generated_data.sql new file mode 100644 index 0000000..409463c --- /dev/null +++ b/crm/generated_data.sql @@ -0,0 +1,279 @@ +drop schema if exists "CRM" cascade; +create schema "CRM"; +set search_path="CRM"; + +create table contact ( + id serial primary key, + full_name text, + informal_name text, + notes text +); +comment on column contact.informal_name is 'How we refer to the person in conversation, e.g. the person''s first name or nickname'; + +create table tag ( + id serial primary key, + label text not null unique +); + +create table contact_tag ( + id serial primary key, + contact integer not null, + tag integer not null, + unique (contact, tag), + foreign key (contact) references contact (id), + foreign key (tag) references tag (id) +); + +create table email ( + id serial primary key, + contact integer not null, + address text not null, + is_primary boolean not null default true, + source text, + foreign key (contact) references contact (id) +); +comment on column email.source is 'Where we obtained the email address from'; + +create table website_type ( + id serial primary key, + label text not null unique +); + +create table website ( + id serial primary key, + contact integer not null, + url text, + type integer not null, + foreign key (contact) references contact (id), + foreign key (type) references website_type (id) +); + +create table interaction ( + id serial primary key, + contact integer not null, + datetime timestamp not null default now(), + subject text, + body text, + foreign key (contact) references contact (id) +); + +copy contact from stdin; +1 Thomas Müller Tom \N +2 \N \N \N +3 Stefan Stefan \N +4 Isabel García Isa \N +5 \N \N \N +6 Carlo Bianchi Carlo \N +7 Juan Pérez \N \N +8 John Bianchi John \N +9 Kimiko Suzuki Kimi \N +10 Tatiana \N \N +11 Pablo Ramírez-Cortez \N \N +12 Ömer Demir Ömer \N +13 Sarah Sarah - Generally has been very active on our Matrix channel helping users troubleshoot problems. +14 François Dubois Francis \N +15 \N \N \N +16 Ricardo Sánchez Ricky \N +17 David Müller Dave \N +18 Yelena Ivanova Yelena Has published several popular data-related python packages +19 Marta Sánchez \N \N +20 Takeshi Tanaka Takeshi \N +21 Vanessa Fernández Vane \N +22 Hiroshi Tanaka \N \N +23 \N \N \N +24 Kazuo Tanaka \N \N +25 Victor Ivanov \N \N +26 Aylin Yılmaz Aylin \N +27 Laura Amanda García \N \N +28 Zaira Martínez Zai \N +29 Rafael García Rafa \N +30 Qiang Li Qiang \N +31 Carmen Ruiz \N \N +32 Boris Volkov Borya \N +33 Oscar Fernández \N \N +34 Amara Singh \N \N +35 Laila Khan \N \N +36 André Dubois Andy \N +37 Olivia Williams Olivia \N +38 Aiko Yamada \N \N +39 Susana Martínez Susy \N +40 Satoko Suzuki \N \N +41 Ayşe Yılmaz \N \N +42 Zofia Nowak Zosia \N +43 Ludwig Fischer Ludwig \N +44 \N \N \N +45 Ivanov Borislav \N \N +46 Verónica Sánchez Vero \N +47 Xiao Li Xiaoxiao \N +48 \N \N \N +49 Halima Ahmed Lima \N +50 Natalia Ivanova Natasha \N +\. + +copy email from stdin; +1 2 gkm@abzm.co.biz True GitHub +2 4 isabel.garcia83@cryptomail.biz True Personal website +3 5 wheat.bear@aol.com True \N +4 6 carlo.bianchi88@ghostinbox.org True Personal website +5 7 juan.perez96@tempinbox.net True Survey +6 8 j.bianchi89@tmp.biz True Email newsletter signup +7 9 kimiko.suzuki85@gmail.com True Personal website +8 10 tatiana78@tempinbox.biz True GitHub Profile +9 11 pablo.ramirez-cortez83@tempinbox.net True website +10 14 francois.dubois95@tmp.org True unknown +11 16 ricardo.sanchez93@disposableinbox.net True survey +12 17 david.muller91@gmail.com True Help ticket +13 18 yelena.ivanova90@pseudomail.org True Git commit history +14 19 marta.sanchez84@yahoo.com True unknown +15 20 takeshi.tanaka80@tempmail.co True Personal website +16 21 vanessa.fernandez82@dummyinbox.biz True Personal website +17 22 hiroshi.tanaka89@fakebox.io True Git commit history +18 24 kazuo.tanaka87@gmail.com True \N +19 25 victor.ivanov85@gmail.com True \N +20 26 aylin.yilmaz82@discardmail.co True \N +21 27 laura.garcia91@fakebox.io True \N +22 27 lag@foocorp.com False \N +23 28 zaira.martinez90@gmail.com True \N +24 29 rafael.garcia87@fakemail.com True \N +25 30 qiang.li87@disposableinbox.co True \N +26 31 carmen.ruiz87@fake-mail.net True \N +27 32 boris.volkov94@example.org True \N +28 34 amara.singh79@hotmail.com True \N +29 34 asingh@mdph.net False \N +30 35 laila.khan75@dummyemail.org True \N +31 36 andre.dubois79@disposableinbox.co True \N +32 37 olivia.williams92@fakeemail.net True \N +33 38 aiko.yamada86@disposablemail.io True \N +34 39 susana.martinez81@fake-domain.com True \N +35 39 susan@susanamartinez.com False \N +36 40 satoko.suzuki88@cryptomail.biz True \N +37 42 zofia.nowak92@tmp.biz True \N +38 43 ludwig.fischer80@gmail.com True \N +39 46 veronica.sanchez80@protonmail.com True \N +40 47 xiao.li88@github.com True \N +\. + +copy website_type from stdin; +1 GitHub profile +2 Reddit profile +3 Personal website +4 Reddit Profile +\. + +copy website from stdin; +1 4 https://isabelgarcia.com 3 +2 6 https://www.carlobianchi.com 3 +3 7 https://juanperez.com 3 +4 8 https://github.com/bianchi 1 +5 9 https://www.kimikosuzuki.com 3 +6 10 https://www.tatiana.com 3 +7 11 https://reddit.com/u/pabloramirezcortez 4 +8 11 https://pabloramirezcortez.com/ 3 +9 14 https://francoisdubois.com 3 +10 15 https://github.com/onefooboo 1 +11 16 https://ricardosanchez.com 3 +12 17 https://davidmuller.com 3 +13 18 https://github.com/yelenaivanova 1 +14 18 https://yelenaivanova.net/ 3 +15 19 https://www.martasanchez.com 3 +16 20 https://www.takeshitanaka.com 3 +17 21 https://vanessafernandez.com 3 +18 22 https://www.hiroshitanaka.com 3 +19 23 https://github.com/graysky 1 +20 24 https://github.com/kazuotanaka 1 +21 25 https://www.victorivanov.com 3 +22 26 https://aylinyilmaz.com 3 +23 28 https://zairamartinez.com 3 +24 29 https://www.rafaelgarcia.com 3 +25 30 https://reddit.com/u/qiangli 4 +26 31 https://github.com/carmenruiz 1 +27 32 https://reddit.com/u/borisvolkov 4 +28 34 https://github.com/amarasingh 1 +29 35 https://github.com/lailakhan 1 +30 36 https://reddit.com/u/andredubois 4 +31 37 https://www.oliviawilliams.com 3 +32 38 https://github.com/aikoyamada 1 +33 39 https://www.susanamartinez.com 3 +34 40 https://satokosuzuki.com 3 +35 42 https://zofianowak.com 3 +36 43 https://ludwigfischer.com 3 +37 44 https://github.com/catmonkey91 1 +38 46 https://github.com/veronicasanchez 1 +39 47 https://github.com/xiaoli 1 +40 48 https://reddit.com/u/nobodyherebutmeee 2 +\. + +copy interaction from stdin; +1 7 2024-01-22 Intro call - Started the call with a brief introduction, exchanged pleasantries. Mark seemed friendly and enthusiastic about discussing the app concept.\n \n- Mark began by describing his role as a software developer in a small startup specializing in e-commerce solutions. He emphasized the fast-paced nature of his work and the need for efficient project management tools.\n \n- Asked Mark about his current workflow and pain points. He mentioned struggling with task prioritization, team collaboration, and keeping track of deadlines amidst constant project iterations.\n \n- Mark expressed frustration with existing project management tools, citing their complexity and lack of customization options. He prefers simple, flexible solutions that adapt to his team's evolving needs.\n \n- Discussed potential features of the app. Mark showed particular interest in:\n \n - Kanban-style task boards for visual project tracking.\n - Customizable task labels and tags for organizing tasks based on priority and project phase.\n - Integration with version control systems like Git for seamless code collaboration.\n - Automated progress reports and notifications to keep the team informed about project updates.\n- Asked Mark about his experience with similar apps. He mentioned using Trello and Jira but found them overly complex for his team's needs. He's open to exploring new alternatives that offer a better balance between simplicity and functionality.\n \n- Shared a brief overview of our app concept and how it aims to address the pain points Mark described. He seemed intrigued and requested more information about the app's development timeline and potential pricing model.\n \n- Mark expressed interest in participating in beta testing to provide feedback and suggested reaching out to other developers in his network who might benefit from the app.\n \n- Ended the call with a summary of action items:\n \n - Follow up via email with more details about the app's development roadmap and beta testing opportunities.\n - Schedule a follow-up call with Mark to discuss any further questions or feedback he may have.\n\n**Key Takeaways:**\n\n- Mark's feedback highlights the importance of simplicity and flexibility in designing the app's user interface and feature set.\n- Integrating with popular developer tools like Git is crucial for meeting the needs of tech-savvy users like Mark.\n- Engaging with potential users like Mark early in the development process is essential for shaping the app's functionality and ensuring market fit. +2 8 2024-01-17 User Call "**User:** John D., 43, software engineer, Chicago townhouse\n\n**Call started:** 10:02 AM EST\n\n**John:** ""Hey, thanks for taking my call! So, this EcoGro app... sounds pretty cool.""\n\n**Me:** ""Thanks for joining, John! Absolutely, tell me what you think.""\n\n**John:** ""I'm a total plant newbie, but my wife LOVES herbs. Problem is, our townhouse gets like, zero sunlight.""\n\n**Me:** (makes mental note: sunlight pain point) ""Hmm, I understand. Does EcoGro help with limited light situations?""\n\n**John:** ""Not sure yet, but the app itself looks slick. I like the plant pics and badges for growing stuff.""\n\n**Me:** ""Glad you think so! We wanted it to be fun and engaging.""\n\n**John:** ""Okay, so back to my no-sun problem. Can it still suggest stuff I can grow?""\n\n**Me:** ""We offer personalized recommendations, but sunlight is definitely a factor. I can check with the team...""\n\n**John:** ""Awesome! Listen, my wife would probably flip for a pre-made herb kit. Like, starter stuff that's already picked out.""\n\n**Me:** (eyes widen) ""Interesting! We haven't explored that yet, but it's a great idea. We could partner with plant suppliers...""\n\n**John:** ""Exactly! Imagine, pre-potted, ready-to-grow herbs, customized for our sad, dark townhouse... she'd be ecstatic.""\n\n**Me:** ""John, you might be onto something revolutionary here. Let me run this by the product team, see if it's feasible.""\n\n**John:** (laughs) ""Revolutionize my wife's herb garden? Sounds good to me. But seriously, keep me updated, I'm genuinely interested.""\n\n**Me:** ""Absolutely! Speaking of updates, any other feedback on the app itself?""\n\n**John:** ""Honestly, just more plant variety would be great. And maybe some tips for brown thumbs like me... like, what NOT to do?""\n\n**Me:** ""Noted! We're constantly adding new plants, and beginner guides are definitely on the roadmap.""\n\n**John:** ""Sounds good. Hey, one last thing: my wife loves sharing stuff on social media. Could EcoGro integrate with that somehow?""\n\n**Me:** (scribbles furiously) ""Another fantastic suggestion! Sharing successes and connecting with other plant lovers... that could be huge.""\n\n**John:** ""Right? Okay, gotta run, but keep me in the loop, Plant Whisperer!""\n\n**Me:** (chuckles) ""Will do, John! Thanks for the invaluable feedback. Talk soon.""\n\n**Call ended:** 10:32 AM EST\n\n**Takeaways:**\n\n- John represents a key user segment (beginners, limited light).\n- Pre-made herb kit idea has major potential, needs exploration.\n- More plant variety and beginner guides are in high demand.\n- Social media integration could boost engagement and virality.\n\n**Next steps:**\n\n- Discuss pre-made kit concept with product & supply chain teams.\n- Prioritize adding more plant varieties and beginner content.\n- Explore potential social media integration options.\n- Schedule follow-up call with John to test new features and get further feedback.\n\n**Overall, this call was incredibly fruitful. John's enthusiasm and specific suggestions provided valuable insights that will shape the future of EcoGro. Keeping him engaged and involved will be key to our success.**" +3 10 2023-10-09 User interview **Key Points Discussed:**\n\n1. **User Profile:** Tatiana is a 28-year-old graphic designer freelancing from home. She is highly organized and prefers tools that streamline her workflow.\n \n2. **Pain Points:**\n \n - Current apps lack integration with her existing productivity tools (Adobe Creative Suite, Trello, Google Calendar).\n - Difficulty in managing client communication and project deadlines simultaneously.\n - Desire for a centralized platform to track project progress and collaborate with clients.\n3. **Feature Wishlist:**\n \n - Integration with popular productivity tools for seamless workflow management.\n - Visual timeline for project milestones and deadlines.\n - In-app communication functionality to streamline client interactions.\n - Ability to share project progress with clients in real-time.\n - Customizable templates for different project types (logos, website designs, branding).\n4. **Competitor Analysis:**\n \n - Tatiana currently uses Asana and Slack but finds the workflow disjointed.\n - She's open to exploring new apps that offer a more cohesive experience tailored to her needs.\n5. **Feedback on App Concept:**\n \n - Tatiana expresses enthusiasm for the proposed app concept, highlighting its potential to address her pain points effectively.\n - Emphasizes the importance of a user-friendly interface and intuitive navigation.\n - Eager to participate in beta testing and provide further feedback during development.\n\n**Next Steps:**\n\n1. **Internal Meeting:** Discuss Tatiana's feedback with the development team to refine feature prioritization and roadmap planning.\n \n2. **Prototype Development:** Start prototyping core features based on user requirements, focusing on seamless integration with existing productivity tools and intuitive UX/UI design.\n \n3. **Beta Testing:** Reach out to Tatiana and other potential users for beta testing once the prototype is ready, gathering additional insights for iteration and improvement.\n \n4. **Regular Updates:** Maintain open communication with Tatiana throughout the development process, keeping her informed about milestones and seeking feedback at key stages.\n \n\n**Additional Notes:**\n\n- Tatiana's feedback reaffirms the market demand for a comprehensive project management solution tailored to the needs of creative professionals.\n- Integration with third-party APIs will be crucial for enhancing the app's functionality and interoperability with existing tools in Tatiana's workflow. +4 6 2024-01-17 User interview session During our call with Carlo, we aimed to gain a comprehensive understanding of his needs and requirements for our data-oriented product. Carlo was enthusiastic and engaged throughout the discussion, providing valuable insights into his workflow and pain points.\n\n**Background:**\n\nCarlo is currently working as a data analyst for a medium-sized marketing agency specializing in digital advertising campaigns. He emphasized the increasing complexity and volume of data they handle on a daily basis, highlighting the need for efficient tools to streamline their analytical processes.\n\n**Key Points Discussed:**\n\n1. **Data Integration Challenges:**\n \n Carlo expressed frustration with the disparate sources of data they deal with, including website analytics, social media metrics, and ad campaign performance data. Integrating these sources manually is time-consuming and error-prone, leading to inefficiencies in their workflow.\n \n2. **Data Cleaning and Preparation:**\n \n A significant portion of Carlo's time is spent cleaning and preparing data for analysis. He highlighted the importance of tools that can automate this process to ensure data accuracy and consistency.\n \n3. **Visualization and Reporting:**\n \n Carlo emphasized the need for intuitive visualization tools that can translate complex datasets into easily understandable insights. He mentioned that current reporting solutions lack flexibility and often fail to meet the specific requirements of their clients.\n \n4. **Scalability and Performance:**\n \n With the growing volume of data they handle, scalability and performance are critical factors for Carlo's team. He emphasized the need for a robust solution that can handle large datasets without compromising on speed or reliability.\n \n5. **Collaboration and Sharing:**\n \n Collaboration is essential within Carlo's team, as well as with clients and stakeholders. He highlighted the importance of features that facilitate collaboration, such as real-time sharing of reports and dashboards, as well as commenting and annotation capabilities.\n \n6. **Security and Compliance:**\n \n Given the sensitive nature of the data they work with, security and compliance are paramount for Carlo's organization. He expressed the need for features that ensure data privacy and compliance with industry regulations, such as GDPR and CCPA.\n \n7. **Customization and Flexibility:**\n \n One-size-fits-all solutions often fall short of meeting Carlo's team's specific requirements. He emphasized the importance of customization and flexibility, allowing users to tailor the platform to their unique needs and workflows.\n \n\n**Action Items:**\n\n1. **Product Demonstration:**\n \n We agreed to schedule a follow-up meeting to provide Carlo with a demonstration of our product, showcasing how it addresses his pain points and fulfills his requirements.\n \n2. **Feature Prioritization:**\n \n Based on Carlo's feedback, we will prioritize features related to data integration, cleaning, and visualization, ensuring that our product meets the immediate needs of his team.\n \n3. **Security and Compliance Assurance:**\n \n We will provide Carlo with detailed information regarding our platform's security measures and compliance certifications to address his concerns in these areas.\n \n4. **Customization Options:**\n \n Carlo expressed interest in exploring customization options for our product. We will discuss the feasibility of implementing customizable features that align with his team's specific requirements.\n \n\n**Conclusion:**\n\nOur conversation with Carlo provided valuable insights into the challenges faced by data analysts in marketing agencies. By addressing his needs and requirements, we aim to develop a data-oriented product that not only streamlines analytical processes but also enhances collaboration, scalability, and security. Moving forward, we are committed to working closely with Carlo and his team to ensure that our product meets their expectations and delivers tangible value to their organization.\n\n**Next Steps:**\n\n1. Schedule a follow-up meeting for product demonstration.\n2. Prioritize features based on Carlo's feedback.\n3. Provide detailed information on security and compliance measures.\n4. Explore customization options to align with Carlo's team's requirements. +5 7 2023-11-03 Signup troubleshooting email thread "Email subject: Issue with account setup\n\n**Juan**:\n\nHello,\n\nI recently signed up for your new web app and I'm excited to start using it. However, I'm encountering some issues with setting up my account. Whenever I try to log in, it says my credentials are incorrect, even though I'm certain I'm entering the correct information. Can you please assist me with this?\n\nThanks, Juan\n\n---\n\n**Kelly**:\n\nHi Juan,\n\nThank you for reaching out and for your interest in our web app. I'm sorry to hear that you're having trouble setting up your account. Let's get this sorted out for you.\n\nCould you please provide me with the email address you used to sign up for the account? This will help me locate your account in our system and investigate further.\n\nLooking forward to your response.\n\nBest regards, Sarah\n\n---\n\n**Juan**:\n\nHi Sarah,\n\nThanks for your quick response. The email address I used to sign up is juan.perez96@tempinbox.net. I appreciate your help in resolving this issue.\n\nBest regards, Juan\n\n---\n\n**Kelly**:\n\nHi Juan,\n\nThank you for providing your email address. I've located your account in our system. It seems like there might be a technical glitch causing the login issue.\n\nTo assist you better, could you please let me know if you are trying to log in via the web app or the mobile app? Additionally, are you receiving any error messages or codes when attempting to log in?\n\nYour cooperation will help us pinpoint the issue and provide you with a solution promptly.\n\nBest regards, Sarah\n\n---\n\n**Juan**:\n\nHi Sarah,\n\nI appreciate your assistance. I've been trying to log in via the web app using my laptop. When I attempt to log in, it just says ""Invalid username or password"" without any error codes. I've tried resetting my password multiple times, but the issue persists.\n\nLooking forward to your guidance on resolving this.\n\nBest regards, Juan\n\n---\n\n**Kelly**:\n\nHi Juan,\n\nThank you for the additional information. It's helpful to know that you're using the web app on your laptop.\n\nSince you've already tried resetting your password without success, let's try a different approach. Could you please try logging in using a different web browser or an incognito/private browsing window? Sometimes browser cache or cookies can cause login issues, and this step might help us narrow down the problem.\n\nPlease give this a try and let me know if you're still encountering the same issue. We'll proceed from there based on your response.\n\nBest regards, Sarah\n\n---\n\n**Juan**:\n\nHi Sarah,\n\nThanks for the suggestion. I just tried logging in using a different browser, and I'm still getting the same ""Invalid username or password"" message. It seems like the issue persists despite changing browsers.\n\nDo you have any other recommendations for troubleshooting? I'm eager to get started with using the app.\n\nBest regards, Juan\n\n---\n\n**Kelly**:\n\nHi Juan,\n\nThank you for trying that step. Since changing browsers didn't resolve the issue, let's delve deeper into troubleshooting.\n\nCould you please confirm if you're able to successfully log in to your account using the mobile app? This will help us determine if the problem is isolated to the web app or if it's account-related.\n\nAdditionally, if you're comfortable with it, I could initiate a manual password reset for your account on my end. This might help bypass any potential technical glitches with the automated password reset process.\n\nLooking forward to your response so we can move forward with resolving this issue for you.\n\nBest regards, Sarah" +6 13 2024-02-13 User Interview Notes **App:** EcoGro - Personalized urban gardening app\n\n**User:** Sarah - 32, environmental consultant, Brooklyn apartment dweller\n\n## Key Takeaways:\n\n- **Loves the concept:** Sarah was immediately excited about the personalized gardening features and the potential to grow fresh food at home despite minimal space.\n- **Pain points:** Struggles with limited balcony sunlight and identifying suitable plants. Misses having access to a fresh herb garden like she had growing up.\n- **Feature suggestions:**\n \n - **Light level indicator:** Integrates with weather data and user location to suggest plants based on available sunlight.\n - **Container recommendations:** Suggests appropriate container sizes and types based on chosen plants and balcony dimensions.\n - **Herb garden starter kit:** Pre-selected, low-maintenance herb collection tailored to user preferences and balcony conditions.\n \n- **Technical considerations:** Light level indicator might require additional research and API integration. Container recommendations could be integrated with existing plant data. Starter kit development might require partnerships with plant suppliers.\n- **App design feedback:** Prefers simple, clean interface with high-quality plant photos. Enjoys the gamification elements like earning badges for successful harvests.\n- **Overall impression:** Sarah is an ideal target user with genuine enthusiasm for the app. Addressing her pain points and incorporating suggested features could significantly enhance her experience and encourage adoption.\n\n## Next steps:\n\n- Discuss feasibility of light level indicator with data science team.\n- Design mockups for container recommendations and starter kit feature.\n- Research potential plant supply partnerships.\n- Schedule follow-up call with Sarah to test updated prototype and gather further feedback.\n\n## Additional notes:\n\n- Sarah mentioned potential interest in sharing her gardening journey on social media. Explore integration with social media platforms.\n- She expressed concerns about the environmental impact of using plastic pots. Consider researching sustainable container options.\n\n**Overall, this user interview provided valuable insights into the needs and desires of our target audience. Implementing the suggested features and addressing pain points will be crucial for the success of the EcoGro app.** +\. + +copy tag from stdin; +1 User +2 Contractor +3 Contributor +4 Staff +\. + +copy contact_tag from stdin; +1 1 1 +2 1 3 +3 2 1 +4 3 1 +5 4 1 +6 5 1 +7 6 1 +8 7 1 +9 8 1 +10 9 1 +11 10 1 +12 11 1 +13 12 1 +14 13 1 +15 14 1 +16 15 1 +17 16 1 +18 17 1 +19 18 1 +20 19 1 +21 20 1 +22 21 3 +23 22 1 +24 24 1 +25 26 1 +26 27 1 +27 28 1 +28 29 1 +29 30 1 +30 31 1 +31 32 1 +32 33 4 +33 34 1 +34 35 2 +35 36 1 +36 37 1 +37 39 1 +38 40 1 +39 42 1 +40 42 3 +41 43 1 +42 43 3 +43 44 1 +44 45 1 +45 47 1 +46 48 1 +47 50 1 +\. + +SELECT setval( pg_get_serial_sequence('contact', 'id'), (select max(id) + 1 from contact), false ); +SELECT setval( pg_get_serial_sequence('email', 'id'), (select max(id) + 1 from email), false ); +SELECT setval( pg_get_serial_sequence('website_type', 'id'), (select max(id) + 1 from website_type), false ); +SELECT setval( pg_get_serial_sequence('website', 'id'), (select max(id) + 1 from website), false ); +SELECT setval( pg_get_serial_sequence('interaction', 'id'), (select max(id) + 1 from interaction), false ); +SELECT setval( pg_get_serial_sequence('tag', 'id'), (select max(id) + 1 from tag), false ); +SELECT setval( pg_get_serial_sequence('contact_tag', 'id'), (select max(id) + 1 from contact_tag), false ); + diff --git a/crm/source_data/contacts.json b/crm/source_data/contacts.json new file mode 100644 index 0000000..de1b5b9 --- /dev/null +++ b/crm/source_data/contacts.json @@ -0,0 +1,1006 @@ +[ + { + "id": 1, + "full_name": "Thomas Müller", + "informal_name": "Tom", + "tags": [ + "User", + "Contributor" + ], + "emails": [], + "matrix": [], + "notes": null, + "websites": [] + }, + { + "id": 2, + "full_name": null, + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "gkm@abzm.co.biz", + "source": "GitHub" + } + ], + "matrix": [ + "@feedonbanana:manytomany.io" + ], + "notes": null, + "websites": [] + }, + { + "id": 3, + "full_name": "Stefan", + "informal_name": "Stefan", + "tags": [ + "User" + ], + "emails": [], + "matrix": [], + "notes": null, + "websites": [] + }, + { + "id": 4, + "full_name": "Isabel García", + "informal_name": "Isa", + "tags": [ + "User" + ], + "emails": [ + { + "address": "isabel.garcia83@cryptomail.biz", + "source": "Personal website" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://isabelgarcia.com", + "type": "Personal website" + } + ] + }, + { + "id": 5, + "full_name": null, + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "wheat.bear@aol.com", + "source": null + } + ], + "matrix": [ + "@navigatoraid:matrix.org" + ], + "notes": null, + "websites": [] + }, + { + "id": 6, + "full_name": "Carlo Bianchi", + "informal_name": "Carlo", + "tags": [ + "User" + ], + "emails": [ + { + "address": "carlo.bianchi88@ghostinbox.org", + "source": "Personal website" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.carlobianchi.com", + "type": "Personal website" + } + ] + }, + { + "id": 7, + "full_name": "Juan Pérez", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "juan.perez96@tempinbox.net", + "source": "Survey" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://juanperez.com", + "type": "Personal website" + } + ] + }, + { + "id": 8, + "full_name": "John Bianchi", + "informal_name": "John", + "tags": [ + "User" + ], + "emails": [ + { + "address": "j.bianchi89@tmp.biz", + "source": "Email newsletter signup" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/bianchi", + "type": "GitHub profile" + } + ] + }, + { + "id": 9, + "full_name": "Kimiko Suzuki", + "informal_name": "Kimi", + "tags": [ + "User" + ], + "emails": [ + { + "address": "kimiko.suzuki85@gmail.com", + "source": "Personal website" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.kimikosuzuki.com", + "type": "Personal website" + } + ] + }, + { + "id": 10, + "full_name": "Tatiana", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "tatiana78@tempinbox.biz", + "source": "GitHub Profile" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.tatiana.com", + "type": "Personal website" + } + ] + }, + { + "id": 11, + "full_name": "Pablo Ramírez-Cortez", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "pablo.ramirez-cortez83@tempinbox.net", + "source": "website" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://reddit.com/u/pabloramirezcortez", + "type": "Reddit Profile" + }, + { + "url": "https://pabloramirezcortez.com/", + "type": "Personal website" + } + ] + }, + { + "id": 12, + "full_name": "Ömer Demir", + "informal_name": "Ömer", + "tags": [ + "User" + ], + "emails": [], + "matrix": [], + "notes": null, + "websites": [] + }, + { + "id": 13, + "full_name": "Sarah", + "informal_name": "Sarah", + "tags": [ + "User" + ], + "emails": [], + "matrix": [ + "@sarah:freegmx.net" + ], + "notes": "- Generally has been very active on our Matrix channel helping users troubleshoot problems.", + "websites": [] + }, + { + "id": 14, + "full_name": "François Dubois", + "informal_name": "Francis", + "tags": [ + "User" + ], + "emails": [ + { + "address": "francois.dubois95@tmp.org", + "source": "unknown" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://francoisdubois.com", + "type": "Personal website" + } + ] + }, + { + "id": 15, + "full_name": null, + "informal_name": null, + "tags": [ + "User" + ], + "emails": [], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/onefooboo", + "type": "GitHub profile" + } + ] + }, + { + "id": 16, + "full_name": "Ricardo Sánchez", + "informal_name": "Ricky", + "tags": [ + "User" + ], + "emails": [ + { + "address": "ricardo.sanchez93@disposableinbox.net", + "source": "survey" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://ricardosanchez.com", + "type": "Personal website" + } + ] + }, + { + "id": 17, + "full_name": "David Müller", + "informal_name": "Dave", + "tags": [ + "User" + ], + "emails": [ + { + "address": "david.muller91@gmail.com", + "source": "Help ticket" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://davidmuller.com", + "type": "Personal website" + } + ] + }, + { + "id": 18, + "full_name": "Yelena Ivanova", + "informal_name": "Yelena", + "tags": [ + "User" + ], + "emails": [ + { + "address": "yelena.ivanova90@pseudomail.org", + "source": "Git commit history" + } + ], + "matrix": [], + "notes": "Has published several popular data-related python packages", + "websites": [ + { + "url": "https://github.com/yelenaivanova", + "type": "GitHub profile" + }, + { + "url": "https://yelenaivanova.net/", + "type": "Personal website" + } + ] + }, + { + "id": 19, + "full_name": "Marta Sánchez", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "marta.sanchez84@yahoo.com", + "source": "unknown" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.martasanchez.com", + "type": "Personal website" + } + ] + }, + { + "id": 20, + "full_name": "Takeshi Tanaka", + "informal_name": "Takeshi", + "tags": [ + "User" + ], + "emails": [ + { + "address": "takeshi.tanaka80@tempmail.co", + "source": "Personal website" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.takeshitanaka.com", + "type": "Personal website" + } + ] + }, + { + "id": 21, + "full_name": "Vanessa Fernández", + "informal_name": "Vane", + "tags": [ + "Contributor" + ], + "emails": [ + { + "address": "vanessa.fernandez82@dummyinbox.biz", + "source": "Personal website" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://vanessafernandez.com", + "type": "Personal website" + } + ] + }, + { + "id": 22, + "full_name": "Hiroshi Tanaka", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "hiroshi.tanaka89@fakebox.io", + "source": "Git commit history" + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.hiroshitanaka.com", + "type": "Personal website" + } + ] + }, + { + "id": 23, + "full_name": null, + "informal_name": null, + "tags": [], + "emails": [], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/graysky", + "type": "GitHub profile" + } + ] + }, + { + "id": 24, + "full_name": "Kazuo Tanaka", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "kazuo.tanaka87@gmail.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/kazuotanaka", + "type": "GitHub profile" + } + ] + }, + { + "id": 25, + "full_name": "Victor Ivanov", + "informal_name": null, + "tags": [], + "emails": [ + { + "address": "victor.ivanov85@gmail.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.victorivanov.com", + "type": "Personal website" + } + ] + }, + { + "id": 26, + "full_name": "Aylin Yılmaz", + "informal_name": "Aylin", + "tags": [ + "User" + ], + "emails": [ + { + "address": "aylin.yilmaz82@discardmail.co", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://aylinyilmaz.com", + "type": "Personal website" + } + ] + }, + { + "id": 27, + "full_name": "Laura Amanda García", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "laura.garcia91@fakebox.io", + "source": null + }, + { + "address": "lag@foocorp.com", + "source": null + } + ], + "matrix": [ + "@mylittlepony:matrix.org" + ], + "notes": null, + "websites": [] + }, + { + "id": 28, + "full_name": "Zaira Martínez", + "informal_name": "Zai", + "tags": [ + "User" + ], + "emails": [ + { + "address": "zaira.martinez90@gmail.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://zairamartinez.com", + "type": "Personal website" + } + ] + }, + { + "id": 29, + "full_name": "Rafael García", + "informal_name": "Rafa", + "tags": [ + "User" + ], + "emails": [ + { + "address": "rafael.garcia87@fakemail.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.rafaelgarcia.com", + "type": "Personal website" + } + ] + }, + { + "id": 30, + "full_name": "Qiang Li", + "informal_name": "Qiang", + "tags": [ + "User" + ], + "emails": [ + { + "address": "qiang.li87@disposableinbox.co", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://reddit.com/u/qiangli", + "type": "Reddit Profile" + } + ] + }, + { + "id": 31, + "full_name": "Carmen Ruiz", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "carmen.ruiz87@fake-mail.net", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/carmenruiz", + "type": "GitHub profile" + } + ] + }, + { + "id": 32, + "full_name": "Boris Volkov", + "informal_name": "Borya", + "tags": [ + "User" + ], + "emails": [ + { + "address": "boris.volkov94@example.org", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://reddit.com/u/borisvolkov", + "type": "Reddit Profile" + } + ] + }, + { + "id": 33, + "full_name": "Oscar Fernández", + "informal_name": null, + "tags": [ + "Staff" + ], + "emails": [], + "matrix": [ + "@oscar_f:matrix.org" + ], + "notes": null, + "websites": [] + }, + { + "id": 34, + "full_name": "Amara Singh", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "amara.singh79@hotmail.com", + "source": null + }, + { + "address": "asingh@mdph.net", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/amarasingh", + "type": "GitHub profile" + } + ] + }, + { + "id": 35, + "full_name": "Laila Khan", + "informal_name": null, + "tags": [ + "Contractor" + ], + "emails": [ + { + "address": "laila.khan75@dummyemail.org", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/lailakhan", + "type": "GitHub profile" + } + ] + }, + { + "id": 36, + "full_name": "André Dubois", + "informal_name": "Andy", + "tags": [ + "User" + ], + "emails": [ + { + "address": "andre.dubois79@disposableinbox.co", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://reddit.com/u/andredubois", + "type": "Reddit Profile" + } + ] + }, + { + "id": 37, + "full_name": "Olivia Williams", + "informal_name": "Olivia", + "tags": [ + "User" + ], + "emails": [ + { + "address": "olivia.williams92@fakeemail.net", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.oliviawilliams.com", + "type": "Personal website" + } + ] + }, + { + "id": 38, + "full_name": "Aiko Yamada", + "informal_name": null, + "tags": [], + "emails": [ + { + "address": "aiko.yamada86@disposablemail.io", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/aikoyamada", + "type": "GitHub profile" + } + ] + }, + { + "id": 39, + "full_name": "Susana Martínez", + "informal_name": "Susy", + "tags": [ + "User" + ], + "emails": [ + { + "address": "susana.martinez81@fake-domain.com", + "source": null + }, + { + "address": "susan@susanamartinez.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://www.susanamartinez.com", + "type": "Personal website" + } + ] + }, + { + "id": 40, + "full_name": "Satoko Suzuki", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [ + { + "address": "satoko.suzuki88@cryptomail.biz", + "source": null + } + ], + "matrix": [ + "@hxrq18:matrix.org" + ], + "notes": null, + "websites": [ + { + "url": "https://satokosuzuki.com", + "type": "Personal website" + } + ] + }, + { + "id": 41, + "full_name": "Ayşe Yılmaz", + "informal_name": null, + "tags": [], + "emails": [], + "matrix": [], + "notes": null, + "websites": [] + }, + { + "id": 42, + "full_name": "Zofia Nowak", + "informal_name": "Zosia", + "tags": [ + "User", + "Contributor" + ], + "emails": [ + { + "address": "zofia.nowak92@tmp.biz", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://zofianowak.com", + "type": "Personal website" + } + ] + }, + { + "id": 43, + "full_name": "Ludwig Fischer", + "informal_name": "Ludwig", + "tags": [ + "User", + "Contributor" + ], + "emails": [ + { + "address": "ludwig.fischer80@gmail.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://ludwigfischer.com", + "type": "Personal website" + } + ] + }, + { + "id": 44, + "full_name": null, + "informal_name": null, + "tags": [ + "User" + ], + "emails": [], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/catmonkey91", + "type": "GitHub profile" + } + ] + }, + { + "id": 45, + "full_name": "Ivanov Borislav", + "informal_name": null, + "tags": [ + "User" + ], + "emails": [], + "matrix": [ + "@ivanov_b:matrix.org" + ], + "notes": null, + "websites": [] + }, + { + "id": 46, + "full_name": "Verónica Sánchez", + "informal_name": "Vero", + "tags": [], + "emails": [ + { + "address": "veronica.sanchez80@protonmail.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/veronicasanchez", + "type": "GitHub profile" + } + ] + }, + { + "id": 47, + "full_name": "Xiao Li", + "informal_name": "Xiaoxiao", + "tags": [ + "User" + ], + "emails": [ + { + "address": "xiao.li88@github.com", + "source": null + } + ], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://github.com/xiaoli", + "type": "GitHub profile" + } + ] + }, + { + "id": 48, + "full_name": null, + "informal_name": null, + "tags": [ + "User" + ], + "emails": [], + "matrix": [], + "notes": null, + "websites": [ + { + "url": "https://reddit.com/u/nobodyherebutmeee", + "type": "Reddit profile" + } + ] + }, + { + "id": 49, + "full_name": "Halima Ahmed", + "informal_name": "Lima", + "tags": [], + "emails": [], + "matrix": [ + "@U__see:matrix.org" + ], + "notes": null, + "websites": [] + }, + { + "id": 50, + "full_name": "Natalia Ivanova", + "informal_name": "Natasha", + "tags": [ + "User" + ], + "emails": [], + "matrix": [ + "@natasha18:matrix.org" + ], + "notes": null, + "websites": [] + } +] \ No newline at end of file diff --git a/crm/source_data/interactions/1.md b/crm/source_data/interactions/1.md new file mode 100644 index 0000000..f17a17b --- /dev/null +++ b/crm/source_data/interactions/1.md @@ -0,0 +1,67 @@ +--- +contact: 8 +subject: User Call +date: 2024-01-17 +--- + +**User:** John D., 43, software engineer, Chicago townhouse + +**Call started:** 10:02 AM EST + +**John:** "Hey, thanks for taking my call! So, this EcoGro app... sounds pretty cool." + +**Me:** "Thanks for joining, John! Absolutely, tell me what you think." + +**John:** "I'm a total plant newbie, but my wife LOVES herbs. Problem is, our townhouse gets like, zero sunlight." + +**Me:** (makes mental note: sunlight pain point) "Hmm, I understand. Does EcoGro help with limited light situations?" + +**John:** "Not sure yet, but the app itself looks slick. I like the plant pics and badges for growing stuff." + +**Me:** "Glad you think so! We wanted it to be fun and engaging." + +**John:** "Okay, so back to my no-sun problem. Can it still suggest stuff I can grow?" + +**Me:** "We offer personalized recommendations, but sunlight is definitely a factor. I can check with the team..." + +**John:** "Awesome! Listen, my wife would probably flip for a pre-made herb kit. Like, starter stuff that's already picked out." + +**Me:** (eyes widen) "Interesting! We haven't explored that yet, but it's a great idea. We could partner with plant suppliers..." + +**John:** "Exactly! Imagine, pre-potted, ready-to-grow herbs, customized for our sad, dark townhouse... she'd be ecstatic." + +**Me:** "John, you might be onto something revolutionary here. Let me run this by the product team, see if it's feasible." + +**John:** (laughs) "Revolutionize my wife's herb garden? Sounds good to me. But seriously, keep me updated, I'm genuinely interested." + +**Me:** "Absolutely! Speaking of updates, any other feedback on the app itself?" + +**John:** "Honestly, just more plant variety would be great. And maybe some tips for brown thumbs like me... like, what NOT to do?" + +**Me:** "Noted! We're constantly adding new plants, and beginner guides are definitely on the roadmap." + +**John:** "Sounds good. Hey, one last thing: my wife loves sharing stuff on social media. Could EcoGro integrate with that somehow?" + +**Me:** (scribbles furiously) "Another fantastic suggestion! Sharing successes and connecting with other plant lovers... that could be huge." + +**John:** "Right? Okay, gotta run, but keep me in the loop, Plant Whisperer!" + +**Me:** (chuckles) "Will do, John! Thanks for the invaluable feedback. Talk soon." + +**Call ended:** 10:32 AM EST + +**Takeaways:** + +- John represents a key user segment (beginners, limited light). +- Pre-made herb kit idea has major potential, needs exploration. +- More plant variety and beginner guides are in high demand. +- Social media integration could boost engagement and virality. + +**Next steps:** + +- Discuss pre-made kit concept with product & supply chain teams. +- Prioritize adding more plant varieties and beginner content. +- Explore potential social media integration options. +- Schedule follow-up call with John to test new features and get further feedback. + +**Overall, this call was incredibly fruitful. John's enthusiasm and specific suggestions provided valuable insights that will shape the future of EcoGro. Keeping him engaged and involved will be key to our success.** \ No newline at end of file diff --git a/crm/source_data/interactions/2.md b/crm/source_data/interactions/2.md new file mode 100644 index 0000000..820545b --- /dev/null +++ b/crm/source_data/interactions/2.md @@ -0,0 +1,37 @@ +--- +contact: 13 +subject: User Interview Notes +date: 2024-02-13 +--- + +**App:** EcoGro - Personalized urban gardening app + +**User:** Sarah - 32, environmental consultant, Brooklyn apartment dweller + +## Key Takeaways: + +- **Loves the concept:** Sarah was immediately excited about the personalized gardening features and the potential to grow fresh food at home despite minimal space. +- **Pain points:** Struggles with limited balcony sunlight and identifying suitable plants. Misses having access to a fresh herb garden like she had growing up. +- **Feature suggestions:** + + - **Light level indicator:** Integrates with weather data and user location to suggest plants based on available sunlight. + - **Container recommendations:** Suggests appropriate container sizes and types based on chosen plants and balcony dimensions. + - **Herb garden starter kit:** Pre-selected, low-maintenance herb collection tailored to user preferences and balcony conditions. + +- **Technical considerations:** Light level indicator might require additional research and API integration. Container recommendations could be integrated with existing plant data. Starter kit development might require partnerships with plant suppliers. +- **App design feedback:** Prefers simple, clean interface with high-quality plant photos. Enjoys the gamification elements like earning badges for successful harvests. +- **Overall impression:** Sarah is an ideal target user with genuine enthusiasm for the app. Addressing her pain points and incorporating suggested features could significantly enhance her experience and encourage adoption. + +## Next steps: + +- Discuss feasibility of light level indicator with data science team. +- Design mockups for container recommendations and starter kit feature. +- Research potential plant supply partnerships. +- Schedule follow-up call with Sarah to test updated prototype and gather further feedback. + +## Additional notes: + +- Sarah mentioned potential interest in sharing her gardening journey on social media. Explore integration with social media platforms. +- She expressed concerns about the environmental impact of using plastic pots. Consider researching sustainable container options. + +**Overall, this user interview provided valuable insights into the needs and desires of our target audience. Implementing the suggested features and addressing pain points will be crucial for the success of the EcoGro app.** \ No newline at end of file diff --git a/crm/source_data/interactions/3.md b/crm/source_data/interactions/3.md new file mode 100644 index 0000000..ef7d431 --- /dev/null +++ b/crm/source_data/interactions/3.md @@ -0,0 +1,47 @@ +--- +contact: 10 +subject: User interview +date: 2023-10-09 +--- + +**Key Points Discussed:** + +1. **User Profile:** Tatiana is a 28-year-old graphic designer freelancing from home. She is highly organized and prefers tools that streamline her workflow. + +2. **Pain Points:** + + - Current apps lack integration with her existing productivity tools (Adobe Creative Suite, Trello, Google Calendar). + - Difficulty in managing client communication and project deadlines simultaneously. + - Desire for a centralized platform to track project progress and collaborate with clients. +3. **Feature Wishlist:** + + - Integration with popular productivity tools for seamless workflow management. + - Visual timeline for project milestones and deadlines. + - In-app communication functionality to streamline client interactions. + - Ability to share project progress with clients in real-time. + - Customizable templates for different project types (logos, website designs, branding). +4. **Competitor Analysis:** + + - Tatiana currently uses Asana and Slack but finds the workflow disjointed. + - She's open to exploring new apps that offer a more cohesive experience tailored to her needs. +5. **Feedback on App Concept:** + + - Tatiana expresses enthusiasm for the proposed app concept, highlighting its potential to address her pain points effectively. + - Emphasizes the importance of a user-friendly interface and intuitive navigation. + - Eager to participate in beta testing and provide further feedback during development. + +**Next Steps:** + +1. **Internal Meeting:** Discuss Tatiana's feedback with the development team to refine feature prioritization and roadmap planning. + +2. **Prototype Development:** Start prototyping core features based on user requirements, focusing on seamless integration with existing productivity tools and intuitive UX/UI design. + +3. **Beta Testing:** Reach out to Tatiana and other potential users for beta testing once the prototype is ready, gathering additional insights for iteration and improvement. + +4. **Regular Updates:** Maintain open communication with Tatiana throughout the development process, keeping her informed about milestones and seeking feedback at key stages. + + +**Additional Notes:** + +- Tatiana's feedback reaffirms the market demand for a comprehensive project management solution tailored to the needs of creative professionals. +- Integration with third-party APIs will be crucial for enhancing the app's functionality and interoperability with existing tools in Tatiana's workflow. diff --git a/crm/source_data/interactions/4.md b/crm/source_data/interactions/4.md new file mode 100644 index 0000000..ff50376 --- /dev/null +++ b/crm/source_data/interactions/4.md @@ -0,0 +1,72 @@ +--- +contact: 6 +subject: User interview session +date: 2024-01-17 +--- + +During our call with Carlo, we aimed to gain a comprehensive understanding of his needs and requirements for our data-oriented product. Carlo was enthusiastic and engaged throughout the discussion, providing valuable insights into his workflow and pain points. + +**Background:** + +Carlo is currently working as a data analyst for a medium-sized marketing agency specializing in digital advertising campaigns. He emphasized the increasing complexity and volume of data they handle on a daily basis, highlighting the need for efficient tools to streamline their analytical processes. + +**Key Points Discussed:** + +1. **Data Integration Challenges:** + + Carlo expressed frustration with the disparate sources of data they deal with, including website analytics, social media metrics, and ad campaign performance data. Integrating these sources manually is time-consuming and error-prone, leading to inefficiencies in their workflow. + +2. **Data Cleaning and Preparation:** + + A significant portion of Carlo's time is spent cleaning and preparing data for analysis. He highlighted the importance of tools that can automate this process to ensure data accuracy and consistency. + +3. **Visualization and Reporting:** + + Carlo emphasized the need for intuitive visualization tools that can translate complex datasets into easily understandable insights. He mentioned that current reporting solutions lack flexibility and often fail to meet the specific requirements of their clients. + +4. **Scalability and Performance:** + + With the growing volume of data they handle, scalability and performance are critical factors for Carlo's team. He emphasized the need for a robust solution that can handle large datasets without compromising on speed or reliability. + +5. **Collaboration and Sharing:** + + Collaboration is essential within Carlo's team, as well as with clients and stakeholders. He highlighted the importance of features that facilitate collaboration, such as real-time sharing of reports and dashboards, as well as commenting and annotation capabilities. + +6. **Security and Compliance:** + + Given the sensitive nature of the data they work with, security and compliance are paramount for Carlo's organization. He expressed the need for features that ensure data privacy and compliance with industry regulations, such as GDPR and CCPA. + +7. **Customization and Flexibility:** + + One-size-fits-all solutions often fall short of meeting Carlo's team's specific requirements. He emphasized the importance of customization and flexibility, allowing users to tailor the platform to their unique needs and workflows. + + +**Action Items:** + +1. **Product Demonstration:** + + We agreed to schedule a follow-up meeting to provide Carlo with a demonstration of our product, showcasing how it addresses his pain points and fulfills his requirements. + +2. **Feature Prioritization:** + + Based on Carlo's feedback, we will prioritize features related to data integration, cleaning, and visualization, ensuring that our product meets the immediate needs of his team. + +3. **Security and Compliance Assurance:** + + We will provide Carlo with detailed information regarding our platform's security measures and compliance certifications to address his concerns in these areas. + +4. **Customization Options:** + + Carlo expressed interest in exploring customization options for our product. We will discuss the feasibility of implementing customizable features that align with his team's specific requirements. + + +**Conclusion:** + +Our conversation with Carlo provided valuable insights into the challenges faced by data analysts in marketing agencies. By addressing his needs and requirements, we aim to develop a data-oriented product that not only streamlines analytical processes but also enhances collaboration, scalability, and security. Moving forward, we are committed to working closely with Carlo and his team to ensure that our product meets their expectations and delivers tangible value to their organization. + +**Next Steps:** + +1. Schedule a follow-up meeting for product demonstration. +2. Prioritize features based on Carlo's feedback. +3. Provide detailed information on security and compliance measures. +4. Explore customization options to align with Carlo's team's requirements. \ No newline at end of file diff --git a/crm/source_data/interactions/5.md b/crm/source_data/interactions/5.md new file mode 100644 index 0000000..dab5ae3 --- /dev/null +++ b/crm/source_data/interactions/5.md @@ -0,0 +1,35 @@ +--- +contact: 7 +subject: Intro call +date: 2024-01-22 +--- +- Started the call with a brief introduction, exchanged pleasantries. Mark seemed friendly and enthusiastic about discussing the app concept. + +- Mark began by describing his role as a software developer in a small startup specializing in e-commerce solutions. He emphasized the fast-paced nature of his work and the need for efficient project management tools. + +- Asked Mark about his current workflow and pain points. He mentioned struggling with task prioritization, team collaboration, and keeping track of deadlines amidst constant project iterations. + +- Mark expressed frustration with existing project management tools, citing their complexity and lack of customization options. He prefers simple, flexible solutions that adapt to his team's evolving needs. + +- Discussed potential features of the app. Mark showed particular interest in: + + - Kanban-style task boards for visual project tracking. + - Customizable task labels and tags for organizing tasks based on priority and project phase. + - Integration with version control systems like Git for seamless code collaboration. + - Automated progress reports and notifications to keep the team informed about project updates. +- Asked Mark about his experience with similar apps. He mentioned using Trello and Jira but found them overly complex for his team's needs. He's open to exploring new alternatives that offer a better balance between simplicity and functionality. + +- Shared a brief overview of our app concept and how it aims to address the pain points Mark described. He seemed intrigued and requested more information about the app's development timeline and potential pricing model. + +- Mark expressed interest in participating in beta testing to provide feedback and suggested reaching out to other developers in his network who might benefit from the app. + +- Ended the call with a summary of action items: + + - Follow up via email with more details about the app's development roadmap and beta testing opportunities. + - Schedule a follow-up call with Mark to discuss any further questions or feedback he may have. + +**Key Takeaways:** + +- Mark's feedback highlights the importance of simplicity and flexibility in designing the app's user interface and feature set. +- Integrating with popular developer tools like Git is crucial for meeting the needs of tech-savvy users like Mark. +- Engaging with potential users like Mark early in the development process is essential for shaping the app's functionality and ensuring market fit. \ No newline at end of file diff --git a/crm/source_data/interactions/6.md b/crm/source_data/interactions/6.md new file mode 100644 index 0000000..eedb861 --- /dev/null +++ b/crm/source_data/interactions/6.md @@ -0,0 +1,107 @@ +--- +contact: 7 +subject: Signup troubleshooting email thread +date: 2023-11-03 +--- + +Email subject: Issue with account setup + +**Juan**: + +Hello, + +I recently signed up for your new web app and I'm excited to start using it. However, I'm encountering some issues with setting up my account. Whenever I try to log in, it says my credentials are incorrect, even though I'm certain I'm entering the correct information. Can you please assist me with this? + +Thanks, Juan + +--- + +**Kelly**: + +Hi Juan, + +Thank you for reaching out and for your interest in our web app. I'm sorry to hear that you're having trouble setting up your account. Let's get this sorted out for you. + +Could you please provide me with the email address you used to sign up for the account? This will help me locate your account in our system and investigate further. + +Looking forward to your response. + +Best regards, Sarah + +--- + +**Juan**: + +Hi Sarah, + +Thanks for your quick response. The email address I used to sign up is juan.perez96@tempinbox.net. I appreciate your help in resolving this issue. + +Best regards, Juan + +--- + +**Kelly**: + +Hi Juan, + +Thank you for providing your email address. I've located your account in our system. It seems like there might be a technical glitch causing the login issue. + +To assist you better, could you please let me know if you are trying to log in via the web app or the mobile app? Additionally, are you receiving any error messages or codes when attempting to log in? + +Your cooperation will help us pinpoint the issue and provide you with a solution promptly. + +Best regards, Sarah + +--- + +**Juan**: + +Hi Sarah, + +I appreciate your assistance. I've been trying to log in via the web app using my laptop. When I attempt to log in, it just says "Invalid username or password" without any error codes. I've tried resetting my password multiple times, but the issue persists. + +Looking forward to your guidance on resolving this. + +Best regards, Juan + +--- + +**Kelly**: + +Hi Juan, + +Thank you for the additional information. It's helpful to know that you're using the web app on your laptop. + +Since you've already tried resetting your password without success, let's try a different approach. Could you please try logging in using a different web browser or an incognito/private browsing window? Sometimes browser cache or cookies can cause login issues, and this step might help us narrow down the problem. + +Please give this a try and let me know if you're still encountering the same issue. We'll proceed from there based on your response. + +Best regards, Sarah + +--- + +**Juan**: + +Hi Sarah, + +Thanks for the suggestion. I just tried logging in using a different browser, and I'm still getting the same "Invalid username or password" message. It seems like the issue persists despite changing browsers. + +Do you have any other recommendations for troubleshooting? I'm eager to get started with using the app. + +Best regards, Juan + +--- + +**Kelly**: + +Hi Juan, + +Thank you for trying that step. Since changing browsers didn't resolve the issue, let's delve deeper into troubleshooting. + +Could you please confirm if you're able to successfully log in to your account using the mobile app? This will help us determine if the problem is isolated to the web app or if it's account-related. + +Additionally, if you're comfortable with it, I could initiate a manual password reset for your account on my end. This might help bypass any potential technical glitches with the automated password reset process. + +Looking forward to your response so we can move forward with resolving this issue for you. + +Best regards, Sarah \ No newline at end of file diff --git a/crm/source_data/template.sql b/crm/source_data/template.sql new file mode 100644 index 0000000..0f7a582 --- /dev/null +++ b/crm/source_data/template.sql @@ -0,0 +1,95 @@ +drop schema if exists "CRM" cascade; +create schema "CRM"; +set search_path="CRM"; + +create table contact ( + id serial primary key, + full_name text, + informal_name text, + notes text +); +comment on column contact.informal_name is 'How we refer to the person in conversation, e.g. the person''s first name or nickname'; + +create table tag ( + id serial primary key, + label text not null unique +); + +create table contact_tag ( + id serial primary key, + contact integer not null, + tag integer not null, + unique (contact, tag), + foreign key (contact) references contact (id), + foreign key (tag) references tag (id) +); + +create table email ( + id serial primary key, + contact integer not null, + address text not null, + is_primary boolean not null default true, + source text, + foreign key (contact) references contact (id) +); +comment on column email.source is 'Where we obtained the email address from'; + +create table website_type ( + id serial primary key, + label text not null unique +); + +create table website ( + id serial primary key, + contact integer not null, + url text, + type integer not null, + foreign key (contact) references contact (id), + foreign key (type) references website_type (id) +); + +create table interaction ( + id serial primary key, + contact integer not null, + datetime timestamp not null default now(), + subject text, + body text, + foreign key (contact) references contact (id) +); + +copy contact from stdin; +__CONTACT_TSV_DATA__ +\. + +copy email from stdin; +__EMAIL_TSV_DATA__ +\. + +copy website_type from stdin; +__WEBSITE_TYPE_TSV_DATA__ +\. + +copy website from stdin; +__WEBSITE_TSV_DATA__ +\. + +copy interaction from stdin; +__INTERACTION_TSV_DATA__ +\. + +copy tag from stdin; +__TAG_TSV_DATA__ +\. + +copy contact_tag from stdin; +__CONTACT_TAG_TSV_DATA__ +\. + +SELECT setval( pg_get_serial_sequence('contact', 'id'), (select max(id) + 1 from contact), false ); +SELECT setval( pg_get_serial_sequence('email', 'id'), (select max(id) + 1 from email), false ); +SELECT setval( pg_get_serial_sequence('website_type', 'id'), (select max(id) + 1 from website_type), false ); +SELECT setval( pg_get_serial_sequence('website', 'id'), (select max(id) + 1 from website), false ); +SELECT setval( pg_get_serial_sequence('interaction', 'id'), (select max(id) + 1 from interaction), false ); +SELECT setval( pg_get_serial_sequence('tag', 'id'), (select max(id) + 1 from tag), false ); +SELECT setval( pg_get_serial_sequence('contact_tag', 'id'), (select max(id) + 1 from contact_tag), false ); +