The export is suitable, for example, for data checks, migrations, support cases, duplicate analyses, or simple inventories.
What is exported?
The CSV download exports all records of the currently opened module. The fields of the module are determined based on the web service description and written to the CSV file as columns.
An important advantage: For linked fields, CRM-Snitcher outputs not only the internal CRM IDs wherever possible, but also readable content from the linked record. Instead of an ID such as 11×12345, the CSV may contain, for example, the name of a contact, an organization, or a user.
This makes the exported data much easier to read and reduces the amount of manual post-processing required.
Requirements
Valid web service access credentials are required for the export:
The access credentials are only kept in the current PHP session in CRM-Snitcher. They are not stored permanently.
Important: The CRM user being used must have web service access to the desired module. In addition, the user can only export the records that they are allowed to see according to the CRM permissions.
Step 1: Open CRM-Snitcher
Open CRM-Snitcher in your browser. After opening it, the login form for the CRM web service connection is displayed first.
Enter the CRM URL, the web service user, and the API key there. After a successful connection, CRM-Snitcher loads the list of modules to which the user has access.
Step 2: Select the desired module
The module overview displays all modules that can be accessed via the web service. Typical examples include:
Click the name of the module whose records you want to export.
After clicking, the module view opens. There, CRM-Snitcher displays, among other things:
Step 3: Start the CSV export
In the module browser, the CSV export section is located below the query block.
There you will find the button: Download all records as CSV
Clicking this button starts the complete export of all records of the currently opened module.
CRM-Snitcher generates the CSV file on the server side and then delivers it directly to the browser as a download.
Note for large amounts of data
For modules with a very large number of records, generating the CSV file may take some time. CRM-Snitcher therefore displays a spinner on the button when the download starts.
This is particularly important for large modules, for example:
While the export is being prepared, the page should not be reloaded. Depending on the amount of data, server performance, and number of linked fields, the process may take anywhere from a few seconds to several minutes.
How CRM-Snitcher exports the data
The export runs via the CRM web service interface. CRM-Snitcher does not query the records directly from the database, but instead uses the regular web service operations.
As a result, the permissions of the logged-in user are applied automatically.
In simplified terms, the following happens:
Block-by-block querying is important so that larger modules can also be exported without having to load everything in a single request.
Linked fields are output in a more readable form.
Many CRM fields do not internally contain plain text, but web service IDs. Without resolving these references, such fields would be difficult to read in the CSV. CRM-Snitcher therefore tries to determine a meaningful display name from the linked record for references.
Example:
Instead of: 11×2457
the CSV will contain, wherever possible: Muster GmbH
Or, for contacts: Max Mustermann
If no suitable display name is found or the linked record cannot be loaded, the original ID is retained. This ensures that no information is lost.
Opening the CSV file
The exported file can be opened directly in common programs, for example:
The file is output as a UTF-8 CSV so that umlauts and special characters are processed as cleanly as possible.
When opening the file in Excel, depending on the system and language settings, it may be useful to open the file via the import dialog and select UTF-8 as the character set there.
Typical use cases
CSV export via CRM-Snitcher is particularly helpful for:
Since the export runs directly via the web service, no database access is required.
Security and responsibility
CRM-Snitcher is a technical tool for administrators, developers, and experienced CRM users. Even though the CSV export itself is read-only, the tool should be used with care.
Recommendations:
Conclusion
CRM-Snitcher makes it possible to quickly download all records of any CRM module as a CSV file. The export is particularly useful because it does not only output raw data, but also converts linked fields into readable content wherever possible.
This makes CRM-Snitcher very well suited for analyses, migrations, support tasks, and data checks without requiring direct database access.
]]>This article explains the fundamental principles of our support and billing policy in a clear and understandable manner. In terms of content, it fully corresponds to the binding provisions referenced by our General Terms and Conditions (AGB) and other contractual documents.

As a SaaS provider for CRM and xRM systems, we operate a powerful standard platform and continuously develop it further. At the same time, we support our customers with individual adaptations, configurations, and extensions.
To ensure fair and predictable cooperation for both parties, a clear distinction is essential:
Our support and billing policy provides transparency and reliability in this regard.
Base software (standard/core)
The generally available SaaS standard software operated by crm-now, including all standard functions, modules, and interfaces, either in the productive version or in a provided demo environment.
Customizing
Customer-specific adaptations or extensions of the base software, for example:
Incident (service disruption)
An unplanned event in which the SaaS service is unavailable or only partially usable. An incident describes the operational impact, not necessarily the cause.
Bug (software defect)
A reproducible error in which the software deviates from the documented or contractually agreed expected behavior. A bug describes the technical cause.
Service request
A request for a service that does not constitute a disruption, for example:
Change request
A service request aimed at a substantive change or extension of the existing target state, such as new functions or modified processes.
Bug fixes in the base software
We correct reproducible errors in the base software free of charge as part of ongoing SaaS operations, provided that:
The correction is carried out via patches, hotfixes, or regular releases, possibly supplemented by a workaround.
Platform and operational disruptions
We also resolve disruptions within the responsibility of crm-now free of charge, for example:
Chargeable services include in particular services provided individually for a customer:
Bug fixing related to customizations
Analysis and correction of errors whose cause lies in customer-specific adaptations or configurations.
Change requests and further development
All changes or extensions to the existing functional scope, for example:
Support for external or customer-side causes
Analysis and support for issues caused, for example, by:
These services are billed at the agreed hourly rate or on the basis of a separate quotation.
To enable a clear distinction, we first perform a free initial diagnosis for every request.
What does the initial diagnosis include?
The initial diagnosis is limited to up to 30 minutes per ticket and serves exclusively for classification, not for full resolution.
What happens next?
After completing the initial diagnosis, we inform you about:
Chargeable services commence only after your approval. If a chargeable cause only becomes apparent during the initial diagnosis, billing starts only from the point at which we inform you accordingly.
Decisive for the classification of a request are:
An incident may be caused by a bug, but it does not have to be. A change request always constitutes a chargeable change in services unless otherwise agreed.
This policy creates transparency, planning certainty, and fair cooperation. You always know when support is part of SaaS operations and when it constitutes an individually commissioned service.
If you have any questions about this policy or the classification of your request, please feel free to contact us at any time.
Note: This explanation is provided for better understanding. The binding provisions are the respective valid support and billing policy as incorporated into the contractual documents (AGB, MSA, support terms, service descriptions).
]]>This extension provides a webservice function to retrieve all related records (relations) for one or more CRM records in vTiger / berliCRM.
Key characteristics:
Typical use cases:
function berli_get_new_multi_relations($id, $relModule = 'all', $user)
Internally:
$id = json_decode($id);
if (!is_array($id)) {
$id = array($id);
}
If the parameter is empty or omitted, it is normalized to ‘all’.
array(
"<parentWsId>" => array(
"<RelatedModuleName>" => array(
"<RelationLabel>" => array(
"<relatedWsId1>",
"<relatedWsId2>",
...
),
...
),
...
),
...
)
More explicitly:
Example (simplified):
array(
"11x123" => array(
"Contacts" => array(
"Contacts" => array("12x5", "12x7")
),
"Documents" => array(
"Documents" => array("14x20", "14x21")
)
),
"11x456" => array(
"Contacts" => array(
"Contacts" => array("12x8")
)
)
);
Notes:
The function strictly respects vTiger/berliCRM’s permission system:
$webserviceObject = VtigerWebserviceObject::fromId($db, $id);
$handler = new $handlerClass($webserviceObject, $user, $db, $log);
$meta = $handler->getMeta();
$entityName = $meta->getObjectEntityName($id);
$types = vtws_listtypes(null, $user);
if (!in_array($entityName, $types['types'])) {
throw new WebServiceException(
WebServiceErrorCode::$ACCESSDENIED,
"Permission to perform the operation is denied"
);
}
if ($meta->hasReadAccess() === false) { ... }
if (!$meta->hasPermission(EntityMeta::$RETRIEVE, $id)) { ... }
if (!$meta->exists($idComponents[1])) { ... }
$tmpWebserviceObject = VtigerWebserviceObject::fromName($db, $relatedModuleName);
$tmpHandler = new $handlerClass($tmpWebserviceObject, $user, $db, $log);
$tmpMeta = $tmpHandler->getMeta();
if ($tmpMeta->hasReadAccess() === true) {
// execute relation query
}
$alreadySet = array();
while ($row2 = $db->fetch_row($res2)) {
$relCrmId = $prefix.'x'.$row2['crmid'];
if ($tmpMeta->hasPermission(EntityMeta::$RETRIEVE, $relCrmId) && !isset($alreadySet[$relCrmId])) {
$arrRet[$id][$relatedModuleName][$label][] = $relCrmId;
$alreadySet[$relCrmId] = $relCrmId;
}
}
For each parent record:
global $currentModule;
$currentModule = $entityName;
$query = "SELECT * FROM vtiger_relatedlists
INNER JOIN vtiger_tab ON vtiger_tab.tabid = vtiger_relatedlists.related_tabid
WHERE vtiger_relatedlists.tabid = ? AND vtiger_tab.presence IN (0,2)";
$params[] = getTabid($entityName);
if ($relModule != 'all') {
$query .= " AND related_tabid = ?";
$params[] = getTabid($relModule);
}
$res = $db->pquery($query, array($params));
$label = html_entity_decode($row['label']);
$relatedTabid = $row['related_tabid'];
$relatedModuleName = Vtiger_Functions::getModuleName($relatedTabid);
$parentRecordModel = Vtiger_Record_Model::getInstanceById($idComponents[1], $entityName);
$relationListView = Vtiger_RelationListView_Model::getInstance(
$parentRecordModel,
$relatedModuleName,
$label
);
$query = trim($relationListView->getRelationQuery());
$res2 = $db->pquery($query, array());
The function can throw WebServiceException in the following situations:
if (!$res) {
throw new WebServiceException(
WebServiceErrorCode::$QUERYSYNTAX,
"Error with query: $query, parameter:".serialize($params)
);
}
if (!$res2) {
throw new WebServiceException(
WebServiceErrorCode::$QUERYSYNTAX,
"Error with query2: $query"
);
}
Client code consuming this webservice should be prepared to handle these exceptions.
Assuming the operation name is mapped to this function (for example getNewMultiRelations), a typical REST call could look like:
operation=get_new_multi_relations
sessionName=<validSession>
id=["11x123","11x456"]
relModule=Contacts
{
"success": true,
"result": {
"11x123": {
"Contacts": {
"Contacts": ["12x5", "12x7"]
}
},
"11x456": {
"Contacts": {
"Contacts": ["12x8"]
}
}
}
}
Note: The actual operation name and registration must match how you configured this function in vtiger_ws_operation and vtiger_ws_operation_parameters.
Recommendations:
(Exact SQL or API calls for registration depend on your existing customization style.)
]]>