SlideShare a Scribd company logo
1 of 51
Leveraging Geographic
  Data in SugarCRM
About the Speaker
                        Asa
                        Kusuma
• Intern at Milsoft Utility Solutions
• Sophomore at Abilene Christian University
• Twitter: asakusuma
• www.asakusuma.com
Geographic Data:
What’s the Big Deal?
photo by gerlos




Know Your Customers
Reaching the End Goal

New     New CRM           Create
Data    Capabilities      Visuals



Old      Filter         Insight into
Data     Data          Customer Base
The End Goal Expanded
                            photo by eBeam



•   Target customers

•   Streamline analysis

•   Get the “Big Picture”

•   Look good in meetings

•   Capitalize on data
photo by eBeam




Concept is simple
photo by Dizzy Girl




Implementation is Messy
The Case Study
About Milsoft
•   We make software for
    utility companies

•   Headquarters in
    Abilene, TX

•   Over 1,000 customers,
    US + International


                            photo by philipbouchard
Our needs at Milsoft
• Send geographic-sensitive data to customers
 • Marketing
 • Workshops
• Inform decision makers
• Streamline meetings
• Do it all in SugarCRM
Bad
Good
The Old Way
1. Export SugarCRM data
2. Cleanup data
3. Import data into 3rd party software
4. Filter data or generate visual
5. Cross fingers
6. Import data back into SugarCRM
The New Way

1. Filter data or create visual in SugarCRM
2. Laugh at people doing it the old way
Steps to Success
1. Extend your data
  • Add coordinates to Accounts
2. Create data filtering capabilities
  • Add geographic filters for Reports
3. Create visuals
  • Link your Accounts with Google Maps
  • Link your Reports with Google Maps
Solutions vs. Hacks
SIMPLICITY
Blend In
Guidelines

• Permanent, scalable solutions, not hacks
• If it’s not simple, it won’t be used
• Insert new features into existing workflow
• Complement and extend existing features
Checkout the Code
asakusuma.com/sugarcon
Step 1:
Add Geographic Data
• Get a Google Maps API Key
• Create custom fields
• Create script
 • Connect to database
 • Add coordinates to each account
• Run script (takes a long time)
Create Custom Fields
Admin > Studio > Accounts > Fields > Add Field

 • Add fields to store latitude & longitude
 • Datatype: Decimal
 • Uncheck “Required Field”
 • Check “Reportable”
 • Populate fields using address + Google Maps
Create Script
• Connect to SugarCRM database
 • Invoke config.php (don’t hardcode)
• Retrieve and loop through Accounts
 • Send address to Google Maps
 • Receive Latitude and Longitude
 • Record coordinates
Get coordinates


Save coordinates
Now What?

• Accounts with an address have coordinates
• Do stuff with the coordinates
 • Filter Accounts with Reports
 • Put your Accounts on a map
 • Put your filtered Accounts on a map
Filtering in Reports
• Select Accounts within a certain distance of
  a postal code
• Add functionality to Reports
Code the Filter

1. Create the label string
2. Associate the label string with a function
3. Create the function
4. Add the extra text inputs
5. Force a JOIN with accounts_cstm
Create the String Label




modules/Reports/language/en_us.lang.php
Associate Label with Function




      modules/Reports/templates/
    templates_modules_defs_js.php
Create the Function



                           Get postal code coordinates
                                          Filter query


include/generic/SugarWidgets/SugarWidgetReportField.php
               (queryFilterWithin_Radius())
Add Extra Text Inputs




                                  Add inputs




  include/javascript/reports.js
Add Extra Text Inputs (cont.)
                                  2 new arguments

                             Set default input size

                                Add label




include/javascript/reports.js (addFilterInputText())
Force the JOIN
                          Link to accounts_cstm




• Custom fields are stored in accounts_cstm
• JOIN combines accounts and accounts_cstm
modules/Reports/Reports.php (create_from())
Radius
     Distance   Radius Center
                (Postal Code)



The Result
Make a Simple Map
Code the Map

1. Connect to the database
2. Pull Account coordinates
3. Pass data from PHP to JavaScript
4. Plot points on the Google Map
Setup the Map



                   Connect to database




      Import jQuery and Google Map stuff

map.php (in the root directory)
Display the Map


                     Echo out data as
                     a JavaScript array


                   Plot points on the map



map.php (in the root directory)
The Result
nifty link




Put it all together
Data Path
          Report ID
Report                           Map


                      Report            Data
                        ID             Points
         Query

                               Database
Create Query Retrieval Function
                                 Check for
                            Lat & Long columns


                          Add Lat & Long columns




                        Build Query

                   Return Query
modules/Reports/Reports.php (execute_query())
Link From Report to Map




                    Create link

modules/Reports/Reports.php (execute_query())
Prepare the Data for the Map




                              Receive Report ID

Create a Report
                    Produce MySQL query

              modules/Reports/map.php
Display the Map

                 Package account
                    as a point



                 Initialize Map

                  Plot data
                   on Map

modules/Reports/map.php
click here...




Put it all together
The Final Result
Try This At Home
• Protect your data
• Work out the kinks
 • Issues with editing Reports
 • Issues with multi-module Reports
• Code Snippets at:
  http://www.asakusuma.com/sugarcon
• Be the envy of your next meeting
photo by gerlos




Know Your Customers

More Related Content

What's hot

Transforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FMETransforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FME
Safe Software
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
Anusha GOT
 
Dsm Presentation
Dsm PresentationDsm Presentation
Dsm Presentation
richoe
 

What's hot (20)

Producing Standardized Data Using a Master FME Workspace
Producing Standardized Data Using a Master FME WorkspaceProducing Standardized Data Using a Master FME Workspace
Producing Standardized Data Using a Master FME Workspace
 
Visualizing Data in a Web Browser with Cesium ion & FME
Visualizing Data in a Web Browser with Cesium ion & FMEVisualizing Data in a Web Browser with Cesium ion & FME
Visualizing Data in a Web Browser with Cesium ion & FME
 
Karnataka Geospatial Experience FME World Tour 2017 India
Karnataka Geospatial Experience FME World Tour 2017 IndiaKarnataka Geospatial Experience FME World Tour 2017 India
Karnataka Geospatial Experience FME World Tour 2017 India
 
Tools for Visualizing Geospatial Data in a Web Browser
Tools for Visualizing Geospatial Data in a Web BrowserTools for Visualizing Geospatial Data in a Web Browser
Tools for Visualizing Geospatial Data in a Web Browser
 
Eugene Wabomnor Bi Portfolio
Eugene Wabomnor Bi PortfolioEugene Wabomnor Bi Portfolio
Eugene Wabomnor Bi Portfolio
 
5 Tips for Integrating CAD Data with Esri ArcGIS
5 Tips for Integrating CAD Data with Esri ArcGIS5 Tips for Integrating CAD Data with Esri ArcGIS
5 Tips for Integrating CAD Data with Esri ArcGIS
 
Weather data meets ibm cloud. part 3 transformation and aggregation of weat...
Weather data meets ibm cloud. part 3   transformation and aggregation of weat...Weather data meets ibm cloud. part 3   transformation and aggregation of weat...
Weather data meets ibm cloud. part 3 transformation and aggregation of weat...
 
From Excel hero to Power BI champion
From Excel hero to Power BI championFrom Excel hero to Power BI champion
From Excel hero to Power BI champion
 
Your Data and FME
Your Data and FMEYour Data and FME
Your Data and FME
 
Transforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FMETransforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FME
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
 
MicroStation DGN: How to Integrate CAD and GIS
MicroStation DGN: How to Integrate CAD and GISMicroStation DGN: How to Integrate CAD and GIS
MicroStation DGN: How to Integrate CAD and GIS
 
Power View and the Cube
Power View and the CubePower View and the Cube
Power View and the Cube
 
How to Create a ArcGIS Story Map Final Presentation
How to Create a ArcGIS Story Map Final Presentation How to Create a ArcGIS Story Map Final Presentation
How to Create a ArcGIS Story Map Final Presentation
 
Dsm Presentation
Dsm PresentationDsm Presentation
Dsm Presentation
 
Processing Building Plans Faster and More Thoroughly using FME Server
Processing Building Plans Faster and More Thoroughly using FME ServerProcessing Building Plans Faster and More Thoroughly using FME Server
Processing Building Plans Faster and More Thoroughly using FME Server
 
Integrating Web and Business Data
Integrating Web and Business DataIntegrating Web and Business Data
Integrating Web and Business Data
 
Deep Dive into FME Desktop 2018
Deep Dive into FME Desktop 2018Deep Dive into FME Desktop 2018
Deep Dive into FME Desktop 2018
 
Automating and Scheduling Data Usage and Reporting
Automating and Scheduling Data Usage and Reporting Automating and Scheduling Data Usage and Reporting
Automating and Scheduling Data Usage and Reporting
 
How to create an InfoCube
How to create an InfoCubeHow to create an InfoCube
How to create an InfoCube
 

Similar to Leveraging Geographic Data in SugarCRM

Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
nimak
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
Madhukar Reddy
 
SPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans SubscriptionsSPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans Subscriptions
Chris Givens
 

Similar to Leveraging Geographic Data in SugarCRM (20)

PowerApps community call-March 2019
PowerApps community call-March 2019PowerApps community call-March 2019
PowerApps community call-March 2019
 
Serverless ML Workshop with Hopsworks at PyData Seattle
Serverless ML Workshop with Hopsworks at PyData SeattleServerless ML Workshop with Hopsworks at PyData Seattle
Serverless ML Workshop with Hopsworks at PyData Seattle
 
Ibm cognos-build-data-marts-reports-and-dashboards
Ibm cognos-build-data-marts-reports-and-dashboardsIbm cognos-build-data-marts-reports-and-dashboards
Ibm cognos-build-data-marts-reports-and-dashboards
 
PBS&J Program Control Services
PBS&J Program Control ServicesPBS&J Program Control Services
PBS&J Program Control Services
 
From Data to Maps to Docs: Turn Days into Minutes with Automated Integration
From Data to Maps to Docs: Turn Days into Minutes with Automated IntegrationFrom Data to Maps to Docs: Turn Days into Minutes with Automated Integration
From Data to Maps to Docs: Turn Days into Minutes with Automated Integration
 
Applying linear regression and predictive analytics
Applying linear regression and predictive analyticsApplying linear regression and predictive analytics
Applying linear regression and predictive analytics
 
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
 
MSBI Online Training in Hyderabad
MSBI Online Training in HyderabadMSBI Online Training in Hyderabad
MSBI Online Training in Hyderabad
 
MSBI Online Training in India
MSBI Online Training in IndiaMSBI Online Training in India
MSBI Online Training in India
 
MSBI Online Training
MSBI Online Training MSBI Online Training
MSBI Online Training
 
Xamarin microsoft graph
Xamarin microsoft graphXamarin microsoft graph
Xamarin microsoft graph
 
Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?
 
rough-work.pptx
rough-work.pptxrough-work.pptx
rough-work.pptx
 
Cherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in day
Cherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in dayCherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in day
Cherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in day
 
Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...
Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...
Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...
 
SPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans SubscriptionsSPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans Subscriptions
 
Harnessing Configuration for Web GIS Application Development
Harnessing Configuration for Web GIS Application DevelopmentHarnessing Configuration for Web GIS Application Development
Harnessing Configuration for Web GIS Application Development
 
2009 GAAC Summit Kristoffer Ewald
2009 GAAC Summit Kristoffer Ewald2009 GAAC Summit Kristoffer Ewald
2009 GAAC Summit Kristoffer Ewald
 
I Love APIs Europe 2015: Developer Sessions
I Love APIs Europe 2015: Developer SessionsI Love APIs Europe 2015: Developer Sessions
I Love APIs Europe 2015: Developer Sessions
 

Recently uploaded

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 

Leveraging Geographic Data in SugarCRM

  • 1. Leveraging Geographic Data in SugarCRM
  • 2. About the Speaker Asa Kusuma • Intern at Milsoft Utility Solutions • Sophomore at Abilene Christian University • Twitter: asakusuma • www.asakusuma.com
  • 4. photo by gerlos Know Your Customers
  • 5. Reaching the End Goal New New CRM Create Data Capabilities Visuals Old Filter Insight into Data Data Customer Base
  • 6. The End Goal Expanded photo by eBeam • Target customers • Streamline analysis • Get the “Big Picture” • Look good in meetings • Capitalize on data
  • 8. photo by Dizzy Girl Implementation is Messy
  • 10. About Milsoft • We make software for utility companies • Headquarters in Abilene, TX • Over 1,000 customers, US + International photo by philipbouchard
  • 11. Our needs at Milsoft • Send geographic-sensitive data to customers • Marketing • Workshops • Inform decision makers • Streamline meetings • Do it all in SugarCRM
  • 12. Bad
  • 13. Good
  • 14. The Old Way 1. Export SugarCRM data 2. Cleanup data 3. Import data into 3rd party software 4. Filter data or generate visual 5. Cross fingers 6. Import data back into SugarCRM
  • 15. The New Way 1. Filter data or create visual in SugarCRM 2. Laugh at people doing it the old way
  • 16. Steps to Success 1. Extend your data • Add coordinates to Accounts 2. Create data filtering capabilities • Add geographic filters for Reports 3. Create visuals • Link your Accounts with Google Maps • Link your Reports with Google Maps
  • 20. Guidelines • Permanent, scalable solutions, not hacks • If it’s not simple, it won’t be used • Insert new features into existing workflow • Complement and extend existing features
  • 22. Step 1: Add Geographic Data • Get a Google Maps API Key • Create custom fields • Create script • Connect to database • Add coordinates to each account • Run script (takes a long time)
  • 23. Create Custom Fields Admin > Studio > Accounts > Fields > Add Field • Add fields to store latitude & longitude • Datatype: Decimal • Uncheck “Required Field” • Check “Reportable” • Populate fields using address + Google Maps
  • 24.
  • 25. Create Script • Connect to SugarCRM database • Invoke config.php (don’t hardcode) • Retrieve and loop through Accounts • Send address to Google Maps • Receive Latitude and Longitude • Record coordinates
  • 27. Now What? • Accounts with an address have coordinates • Do stuff with the coordinates • Filter Accounts with Reports • Put your Accounts on a map • Put your filtered Accounts on a map
  • 28. Filtering in Reports • Select Accounts within a certain distance of a postal code • Add functionality to Reports
  • 29. Code the Filter 1. Create the label string 2. Associate the label string with a function 3. Create the function 4. Add the extra text inputs 5. Force a JOIN with accounts_cstm
  • 30. Create the String Label modules/Reports/language/en_us.lang.php
  • 31. Associate Label with Function modules/Reports/templates/ templates_modules_defs_js.php
  • 32. Create the Function Get postal code coordinates Filter query include/generic/SugarWidgets/SugarWidgetReportField.php (queryFilterWithin_Radius())
  • 33. Add Extra Text Inputs Add inputs include/javascript/reports.js
  • 34. Add Extra Text Inputs (cont.) 2 new arguments Set default input size Add label include/javascript/reports.js (addFilterInputText())
  • 35. Force the JOIN Link to accounts_cstm • Custom fields are stored in accounts_cstm • JOIN combines accounts and accounts_cstm modules/Reports/Reports.php (create_from())
  • 36. Radius Distance Radius Center (Postal Code) The Result
  • 38. Code the Map 1. Connect to the database 2. Pull Account coordinates 3. Pass data from PHP to JavaScript 4. Plot points on the Google Map
  • 39. Setup the Map Connect to database Import jQuery and Google Map stuff map.php (in the root directory)
  • 40. Display the Map Echo out data as a JavaScript array Plot points on the map map.php (in the root directory)
  • 42. nifty link Put it all together
  • 43. Data Path Report ID Report Map Report Data ID Points Query Database
  • 44. Create Query Retrieval Function Check for Lat & Long columns Add Lat & Long columns Build Query Return Query modules/Reports/Reports.php (execute_query())
  • 45. Link From Report to Map Create link modules/Reports/Reports.php (execute_query())
  • 46. Prepare the Data for the Map Receive Report ID Create a Report Produce MySQL query modules/Reports/map.php
  • 47. Display the Map Package account as a point Initialize Map Plot data on Map modules/Reports/map.php
  • 48. click here... Put it all together
  • 50. Try This At Home • Protect your data • Work out the kinks • Issues with editing Reports • Issues with multi-module Reports • Code Snippets at: http://www.asakusuma.com/sugarcon • Be the envy of your next meeting
  • 51. photo by gerlos Know Your Customers

Editor's Notes

  1. milsoft computer science major open source web development and clean web design
  2. If it’s not simple, users won’t use