Roundup Tracker

Some notes from around the web that could be useful when using Roundup as a CRM.

See also: ConfidentialEmail

Basic database schema

The dev.to article by zahrion tech recommends:

contacts — every person you do business with:

    id, full_name, phone, email, company, created_at

deals — one row per potential sale:

    id, contact_id, title, value, stage (new / contacted / quoted / won / lost), created_at, updated_at

activities — every call, visit or follow-up:

    id, deal_id, type, notes, happened_at, next_follow_up

products — what you sell:

    id, name, price

deal_items — which products belong to which deal:

    id, deal_id, product_id, quantity

in semi-roundup schema.py (where we use the singular not plural) it looks like:

   1 # creation (aka created_at) and id are automatically added
   2 contact = Class(db, "contact",
   3                 full_name = String(),
   4                 phone = String(),
   5                 email = String(),
   6                 company = Link("company")  # use a link to company to prevent typos
   7                 )
   8 
   9 company = Class(db, "company",  # basic dummy. Add additional fields as needed
  10                                 # size=Integer(), revenue=Integer() etc.
  11                 name=String())
  12 
  13 # creation/activity/id automatically added.
  14 # because of rev_multilink in deal_item, this deal will automatically get
  15 #    an items property that links to all of the deal_item associated with 
  16 #    this deal. If a deal_item is unlinked from the deal, it gets removed
  17 #    from the items property automatically.
  18 deal = Class(db, "deal",
  19              contact=Link('contact'),
  20              title=String(),
  21              value=Integer(),  # Assume whole dollar(currency unit) values.
  22                                # Roundup doesn't have a Decimal type.
  23              stage=Link("stage") # (new / contacted / quoted / won / lost)
  24              )
  25 
  26 # message (notes), id, and date stamp on message are part of IssueClass.
  27 activity = IssueClass(db, "activity",
  28                       deal=Link("deal"),
  29                       type=Link("type"), # values: call, visit, followup
  30                       follow_up=Date())
  31 
  32 product = Class(db, "product",
  33                 name=String(),
  34                 price=Integer()  # see above for value
  35                 )
  36 
  37 deal_item = Class(db, "deal_item",
  38                   deal=Link("deal", rev_multilink="items"),
  39                   product=Link("product"),
  40                   quantity=Integer())
  41 
  42 # you need to add constrained properties for "type" and "stage" and "company"