• Excel Integration

  • Application bugs

  • Widget Bugs

  • Manual invoices

  • Useful Queries

  • Service accounts

  • Custom widgets

  • Initial things to check

  • Troubleshooting

  • Common questions

  • Initial steps upon report

  • The majority of bugs will be widget bugs. A widget bug as an issue that is specific to one particular widget or service

  • How to spot a widget bug..

  • Raising the invoice

  • Setting up the account correctly in the database

  • Cancelling the subscription in Recurly (is transferring from a monthly plan)

  • How to find a user

  • How to find a particular widget on a dashboard

  • A service account is what is created when you connect a third party service, such as Google Analytics, to Geckoboard

  • Facebook Service Accounts

  • Service account validation

  • Polling

  • Push

  • Highcharts

  • Push for Highcharts

  • Is the customer using the correct API Key?

  • Is the customer using the correct widget key, and is that widget key associated with the correct widget type? For example, if the customer is trying to push to a number widget - it’s essential that the widget key is from a number widget widget

  • Has the customer enabled content on the spreadsheet?

  • Has the customer enabled Macros on the spreadsheet?

  • Is the customer sitting behind a firewall that could be preventing the connection?

  • Ask the customer for their sharing dashboard and try to push data to the widget yourself, using a spreadsheet.

  • How to find the widget key of a widget on a sharing dashboard

    1) Inspect element to get the widget ID you’re looking for widget-123456
    2) Use that ID and look up gb_widgets_dashboard on the id field
    3) widget_key field

  • How to find a users API key

    1) look up the user in the gb_users table
    2) api_key field

    Note: the API key is at the user level, not the group. One group can have many API keys

  • Q) Can you push to more than one widget of the same visualisation?
    A) No, suggest that the customer uses multiple spreadsheets

  • Q) Can you push to a Highcharts widget?
    A) No, find out what chart the customer wants to use and assist them in building a custom widget

  • Attempt to re-produce the bug

  • If you can re-produce it, assess the severity and notify dev team immediately if important, if not raise bug card on trello and include detailed steps on how to re-create. Let the customer know that you’ll get back to them and give an estimated time frame if possible

  • Try to reproduce with your own account..

  • The response from Geckoboard’s data API is valuable when troubleshooting widget bugs.

    A response along the lines of “the method X could not be defined” almost always represents a widget bug. Since even if the configuration is wrong, or the data is incorrect that still shouldn’t happen

  • Raising the invoice is pretty straight forward. Ask the customer for the following:

    • Email address to send the invoice to
    • Billing address
    • Geckoboard account name
    • Plan
    • Length of invoice (minimum 12 months)

    and edit out one of the template word docs we have with that info.

    Be sure to save it as a PDF, make sure nothing is cut off, the invoice number is correct and that VAT is also shown in GBP if a UK company.

    Send to the customer and to Clem.

  • Ensure that status is set to “a” and billing is set to “y” in the gb_groups table using the standard user lookup query

  • In gb_subscriptions ensure that annual and is_manual are both set to 1. The expires_at date is required and should be in the format: 2014-05-14 12:41:22 (this is the date you want the account to expire i.e. one year from now)

  • Plan_id should reflect the plan the customer has paid for. Cross reference this against the gb_plans table

  • The best way to do this is to find the subscription, click More > Cancel subscription > keep in mind that this will immediately inactivate the account so you will need to go to the database, set the status to “a” billing to “y” and remove the failed payment notification immediately

  • SELECT u.*
    FROM gb_users u,
    gb_users_teams t,
    gb_permissions p,
    gb_groups g
    WHERE u.id = t.user_id
    AND t.team_id = p.team_id
    AND p.group_id = g.id
    AND u.email LIKE ‘email address here’

    #replace the last line with either of these:

    AND g.account like ‘account name here’
    AND g.id = 123456;

  • select * from gb_widgets_dashboard where id = 123456

  • Facebook accounts expire after 30 days and need to be re authenticated. This is communicated to the customer via email but often they do not see it, and wonder why the widgets break

    Stress that this is a limitation with Facebook and that there is nothing we can do

    You can Re-Auth in Your Account > Service Accounts > Facebook

  • A service account should not be able to be created if incorrect credentials, such as password or API key are used.

    If it is possible to create a service account with incorrect credentials, that is a bug and should be raised with the title “Service X doesn’t have service account validation”

  • A polling widget is the process of providing the custom widget with a URL which Geckoboard will pull data from.

    The refresh rate is set by the user anywhere from 30 seconds to many hours

  • Pros

  • Cons

  • A push widget works by the customer doing some sort of push request (such as a HTTP post) to a URL. The URL includes the customers widget key and the customers API key should be defined in the payload

  • Things and how to troubleshoot

  • Pros

  • Cons

  • If you try and fail to reproduce the error (with identical config) using your own data then it’s likely not a widget bug rather a user error. Ask for permission to access their account and set it up yourself. 9/10 times it will then work.

    Consider raising the fact that the customer should have seen a better error message as a bug

  • Easier

  • Less programming required

  • Easier for us to troubleshoot

  • Not real time

  • Less secure

  • The first thing to do is (ask the customer first) try to push dummy data to their widget. If that works, you know it is a problem somewhere with their script.

  • Use Curl…

  • Data updates in real time

  • Very secure

  • Works behind a firewall

  • Harder to set up

  • CURL is a way to send data to a URL (in our case, that of a custom widget) using the terminal

    curl -X POST https://push.geckoboard.com/v1/send/example-widget-key -d ‘{“api_key”:”example-api-key”,”data”:{“item”:[{“text”:”This is a new message”,”type”:0}]}}’ -H

    Copy the above command into a text editor, use the correct widget key and API key and copy the data the customer is sending after the “data”: attribute

{"cards":[{"_id":"41601eae1c967786140000ff","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":null,"content":"Excel Integration\n"},{"_id":"41601f611c96778614000100","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"41601eae1c967786140000ff","content":"Initial things to check\n"},{"_id":"4160202e1c96778614000101","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"41601f611c96778614000100","content":"Is the customer using the correct API Key?\n"},{"_id":"416020851c96778614000102","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"41601f611c96778614000100","content":"Is the customer using the correct widget key, and is that widget key associated with the correct widget type? For example, if the customer is trying to push to a number widget - it's essential that the widget key is from a number widget widget"},{"_id":"4160298b1c96778614000104","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"41601f611c96778614000100","content":"Has the customer enabled content on the spreadsheet?"},{"_id":"416029f21c96778614000105","treeId":"41601e981c967786140000fd","seq":1,"position":4,"parentId":"41601f611c96778614000100","content":"Has the customer enabled Macros on the spreadsheet?"},{"_id":"41602a4a1c96778614000106","treeId":"41601e981c967786140000fd","seq":1,"position":5,"parentId":"41601f611c96778614000100","content":"Is the customer sitting behind a firewall that could be preventing the connection?"},{"_id":"41602af51c96778614000107","treeId":"41601e981c967786140000fd","seq":1,"position":6,"parentId":"41601f611c96778614000100","content":""},{"_id":"41602b141c96778614000108","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"41601eae1c967786140000ff","content":"Troubleshooting"},{"_id":"41602b421c96778614000109","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"41602b141c96778614000108","content":"Ask the customer for their sharing dashboard and try to push data to the widget yourself, using a spreadsheet."},{"_id":"41602c6c1c9677861400010a","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"41602b141c96778614000108","content":"How to find the widget key of a widget on a sharing dashboard\n\n1) Inspect element to get the widget ID you're looking for widget-123456\n2) Use that ID and look up gb_widgets_dashboard on the id field\n3) widget_key field"},{"_id":"41602ea11c9677861400010b","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"41602b141c96778614000108","content":"How to find a users API key\n\n1) look up the user in the gb_users table\n2) api_key field\n\nNote: the API key is at the user level, not the group. One group can have many API keys"},{"_id":"416031081c9677861400010c","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"41601eae1c967786140000ff","content":"Common questions\n"},{"_id":"4160314d1c9677861400010d","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416031081c9677861400010c","content":"Q) Can you push to more than one widget of the same visualisation?\nA) No, suggest that the customer uses multiple spreadsheets"},{"_id":"4160324f1c9677861400010e","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416031081c9677861400010c","content":"Q) Can you push to a Highcharts widget?\nA) No, find out what chart the customer wants to use and assist them in building a custom widget"},{"_id":"4160341e1c9677861400010f","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":null,"content":"Application bugs"},{"_id":"416034d71c96778614000111","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"4160341e1c9677861400010f","content":"Initial steps upon report\n"},{"_id":"416035681c96778614000112","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416034d71c96778614000111","content":"Attempt to re-produce the bug"},{"_id":"416035be1c96778614000113","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416034d71c96778614000111","content":"If you can re-produce it, assess the severity and notify dev team immediately if important, if not raise bug card on trello and include detailed steps on how to re-create. Let the customer know that you'll get back to them and give an estimated time frame if possible\n"},{"_id":"416049c81c96778614000117","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416034d71c96778614000111","content":"Try to reproduce with your own account..\n"},{"_id":"41604a3b1c96778614000118","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416049c81c96778614000117","content":"If you try and fail to reproduce the error (with identical config) using your own data then it's likely not a widget bug rather a user error. Ask for permission to access their account and set it up yourself. 9/10 times it will then work. \n\nConsider raising the fact that the customer should have seen a better error message as a bug"},{"_id":"4160348d1c96778614000110","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":null,"content":"Widget Bugs"},{"_id":"4160452e1c96778614000114","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"4160348d1c96778614000110","content":"The majority of bugs will be widget bugs. A widget bug as an issue that is specific to one particular widget or service"},{"_id":"4160462f1c96778614000115","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"4160348d1c96778614000110","content":"How to spot a widget bug.."},{"_id":"416046851c96778614000116","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"4160462f1c96778614000115","content":"The response from Geckoboard's data API is valuable when troubleshooting widget bugs. \n\nA response along the lines of \"the method X could not be defined\" almost always represents a widget bug. Since even if the configuration is wrong, or the data is incorrect that still shouldn't happen"},{"_id":"416057941c9677861400011a","treeId":"41601e981c967786140000fd","seq":1,"position":4,"parentId":null,"content":"Manual invoices"},{"_id":"416057f01c9677861400011b","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416057941c9677861400011a","content":"Raising the invoice\n"},{"_id":"416068911c9677861400011e","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416057f01c9677861400011b","content":"Raising the invoice is pretty straight forward. Ask the customer for the following:\n\n- Email address to send the invoice to\n- Billing address\n- Geckoboard account name\n- Plan\n- Length of invoice (minimum 12 months)\n\nand edit out one of the template word docs we have with that info. \n\nBe sure to save it as a PDF, make sure nothing is cut off, the invoice number is correct and that VAT is also shown in GBP if a UK company. \n\nSend to the customer and to Clem.\n"},{"_id":"416061d21c9677861400011c","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416057941c9677861400011a","content":"Setting up the account correctly in the database"},{"_id":"41606cfb1c9677861400011f","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416061d21c9677861400011c","content":"Ensure that status is set to \"a\" and billing is set to \"y\" in the gb_groups table using the standard user lookup query\n"},{"_id":"4160765d1c96778614000121","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416061d21c9677861400011c","content":"In gb_subscriptions ensure that annual and is_manual are both set to 1. The expires_at date is required and should be in the format: 2014-05-14 12:41:22 (this is the date you want the account to expire i.e. one year from now)"},{"_id":"41607a041c96778614000122","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416061d21c9677861400011c","content":"Plan_id should reflect the plan the customer has paid for. Cross reference this against the gb_plans table"},{"_id":"416062341c9677861400011d","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416057941c9677861400011a","content":"Cancelling the subscription in Recurly (is transferring from a monthly plan)"},{"_id":"41607edf1c96778614000123","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416062341c9677861400011d","content":"The best way to do this is to find the subscription, click More > Cancel subscription > keep in mind that this will immediately inactivate the account so you will need to go to the database, set the status to \"a\" billing to \"y\" and remove the failed payment notification immediately "},{"_id":"416076081c96778614000120","treeId":"41601e981c967786140000fd","seq":1,"position":5,"parentId":null,"content":"Useful Queries\n"},{"_id":"416132791c96778614000124","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416076081c96778614000120","content":"How to find a user\n"},{"_id":"416132c41c96778614000125","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416132791c96778614000124","content":"SELECT u.*\nFROM gb_users u,\n gb_users_teams t,\n gb_permissions p,\n gb_groups g\nWHERE u.id = t.user_id\n AND t.team_id = p.team_id\n AND p.group_id = g.id\n AND u.email LIKE 'email address here'\n\n#replace the last line with either of these: \n\n AND g.account like 'account name here'\n AND g.id = 123456;\n"},{"_id":"416167331c96778614000126","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416076081c96778614000120","content":"How to find a particular widget on a dashboard"},{"_id":"4161678b1c96778614000127","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416167331c96778614000126","content":"select * from gb_widgets_dashboard where id = 123456"},{"_id":"416168681c96778614000128","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416076081c96778614000120","content":""},{"_id":"416168831c96778614000129","treeId":"41601e981c967786140000fd","seq":1,"position":6,"parentId":null,"content":"Service accounts"},{"_id":"416168ab1c9677861400012a","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416168831c96778614000129","content":"A service account is what is created when you connect a third party service, such as Google Analytics, to Geckoboard\n"},{"_id":"416b74f51c9677861400012b","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416168831c96778614000129","content":"Facebook Service Accounts"},{"_id":"416b77b91c9677861400012c","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b74f51c9677861400012b","content":"Facebook accounts expire after 30 days and need to be re authenticated. This is communicated to the customer via email but often they do not see it, and wonder why the widgets break\n\nStress that this is a limitation with Facebook and that there is nothing we can do\n\nYou can Re-Auth in Your Account > Service Accounts > Facebook"},{"_id":"416b7be61c9677861400012d","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416168831c96778614000129","content":"Service account validation \n"},{"_id":"416b7c651c9677861400012e","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b7be61c9677861400012d","content":"A service account should not be able to be created if incorrect credentials, such as password or API key are used.\n\nIf it is possible to create a service account with incorrect credentials, that is a bug and should be raised with the title \"Service X doesn't have service account validation\""},{"_id":"416b7ee21c9677861400012f","treeId":"41601e981c967786140000fd","seq":1,"position":4,"parentId":"416168831c96778614000129","content":""},{"_id":"416b7f991c96778614000130","treeId":"41601e981c967786140000fd","seq":1,"position":7,"parentId":null,"content":"Custom widgets\n"},{"_id":"416b7fcb1c96778614000131","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b7f991c96778614000130","content":"Polling\n"},{"_id":"416b88914362ae3d3900003a","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b7fcb1c96778614000131","content":"A polling widget is the process of providing the custom widget with a URL which Geckoboard will pull data from.\n\nThe refresh rate is set by the user anywhere from 30 seconds to many hours\n"},{"_id":"416b8a474362ae3d3900003b","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b7fcb1c96778614000131","content":"Pros"},{"_id":"416b8a6c4362ae3d3900003c","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b8a474362ae3d3900003b","content":"Easier\n"},{"_id":"416b8a8a4362ae3d3900003d","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b8a474362ae3d3900003b","content":"Less programming required "},{"_id":"416b8ac44362ae3d3900003e","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416b8a474362ae3d3900003b","content":"Easier for us to troubleshoot"},{"_id":"416b8b3f4362ae3d3900003f","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416b7fcb1c96778614000131","content":"Cons\n"},{"_id":"416b8b5f4362ae3d39000040","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b8b3f4362ae3d3900003f","content":"Not real time\n"},{"_id":"416b8b834362ae3d39000041","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b8b3f4362ae3d3900003f","content":"Less secure"},{"_id":"416b8baa4362ae3d39000042","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416b8b3f4362ae3d3900003f","content":""},{"_id":"416b7ffb1c96778614000132","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b7f991c96778614000130","content":"Push"},{"_id":"416b8c184362ae3d39000043","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b7ffb1c96778614000132","content":"A push widget works by the customer doing some sort of push request (such as a HTTP post) to a URL. The URL includes the customers widget key and the customers API key should be defined in the payload"},{"_id":"416b8d754362ae3d39000044","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b7ffb1c96778614000132","content":"Things and how to troubleshoot\n"},{"_id":"416b91294362ae3d3900004b","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b8d754362ae3d39000044","content":"The first thing to do is (ask the customer first) try to push dummy data to their widget. If that works, you know it is a problem somewhere with their script. \n\n"},{"_id":"416b926f4362ae3d3900004c","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b8d754362ae3d39000044","content":"Use Curl...\n"},{"_id":"416b92a14362ae3d3900004d","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b926f4362ae3d3900004c","content":"CURL is a way to send data to a URL (in our case, that of a custom widget) using the terminal \n\n\ncurl -X POST https://push.geckoboard.com/v1/send/example-widget-key -d '{\"api_key\":\"example-api-key\",\"data\":{\"item\":[{\"text\":\"This is a new message\",\"type\":0}]}}' -H \n\nCopy the above command into a text editor, use the correct widget key and API key and copy the data the customer is sending after the \"data\": attribute\n\n\n"},{"_id":"416b8df04362ae3d39000045","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416b7ffb1c96778614000132","content":"Pros\n"},{"_id":"416b8e274362ae3d39000047","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b8df04362ae3d39000045","content":"Data updates in real time"},{"_id":"416b8e7f4362ae3d39000048","treeId":"41601e981c967786140000fd","seq":1,"position":2,"parentId":"416b8df04362ae3d39000045","content":"Very secure"},{"_id":"416b8ea84362ae3d39000049","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416b8df04362ae3d39000045","content":"Works behind a firewall"},{"_id":"416b8e074362ae3d39000046","treeId":"41601e981c967786140000fd","seq":1,"position":4,"parentId":"416b7ffb1c96778614000132","content":"Cons"},{"_id":"416b8ef64362ae3d3900004a","treeId":"41601e981c967786140000fd","seq":1,"position":1,"parentId":"416b8e074362ae3d39000046","content":"Harder to set up"},{"_id":"416b801e1c96778614000133","treeId":"41601e981c967786140000fd","seq":1,"position":3,"parentId":"416b7f991c96778614000130","content":"Highcharts"},{"_id":"416b80511c96778614000134","treeId":"41601e981c967786140000fd","seq":1,"position":4,"parentId":"416b7f991c96778614000130","content":"Push for Highcharts"}],"tree":{"_id":"41601e981c967786140000fd","name":"Matt Handover","publicUrl":"matt-handover"}}